За последние 24 часа нас посетили 18340 программистов и 1634 робота. Сейчас ищут 1600 программистов ...

Подскажите алгоритм записи данных.

Тема в разделе "Решения, алгоритмы", создана пользователем Eser, 6 авг 2010.

  1. Eser

    Eser Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    141
    Симпатии:
    0
    Как записать данные в таблицу которая динамическая т.е в нее могут добавляться новые колонки.
    Например были колонки:ID,DATA,NAME
    А я решил добавить в нее спустя некоторое время еще:TYPE,STATUS ну и тд.
    Но при том что руками скрипт не править?
    Собственно если бы столбцов было бы постоянное кол-во то вопроса бы не было.
     
  2. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    обычно делают постоянные таблицы, и не меняют столбцы, продумывая перед этим постановку задачи. Конечно бывают изменения, но они настолько редки,насколько всё изначально продумано. Бывают расширение функционала. Естественно при этом надо править код в большинстве случаев. Но опять же эти изменения на столько редкие на сколько всё изначально продумано.
    Вы не видите проблему, вы видите результаты. Так что удачи. Если вы не сделали, что бы код сам узнавал о метаданных, то без правки кода увы никак не получится.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Eser
    чего-чего? =) Скрипт как писал так и будет писать в те колонки, на которые написан. В чем вопрос?
     
  4. Eser

    Eser Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    141
    Симпатии:
    0
    Я понимаю что статические таблицы лучше. Но мне это не подходит, лишь по той причине что наши клиенты не от мира сего. У нас их 5штук. у каждого должны отражаться только его справочники с реквизитами и + эти справочники могут добавляться соответственно в таблице заявок должны появляться новые столбцы под эти справочники.

    Собственно у меня почти всего готово, но я не понимаю как обьяснить скрипту что появился новый столбец(имя которого скрипту я могу передать) в таблице заявок и что новый справочник должен писаться именно в этот столбец. Вот оно как.
     
  5. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
  6. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    В запросе выбирай все данные SELECT * FROM table
    Тогда останется установить новое поле в шаблон <?=$line['field']?>
    А для записи в базу я пользуюсь скриптом которые проверяет поля таблицы и в случае если есть значение $_POST совпадающее с одноименным значением в базе до формирует это значение в запросе.

    При таком подходе только меняешь поля таблицы, шаблон изменяет верстальщик. При добавлении новых данных остается только назначить правильные имена переменным. Естественно приводя все пришедшие значения к безопасной форме. К какой именно поять же узнается из структуры таблицы.
     
  7. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Если я правильно понял, то можно так:
    PHP:
    1. <?
    2. $s = array('id'=>1,'name'=>'Иван');
    3. insert_table($s);
    4.  
    5. function insert_table($data) {
    6.     $sql = '';
    7.     foreach ($data as $k=>$v) {
    8.         $sql .= "$k = '$v', ";
    9.     }
    10.     $sql = substr($sql,0,-2); // Убираем запятую в конце
    11.     mysql_query('INSERT INTO table SET '.$sql);
    12. }
    13. ?>
    Строка
    содержит имена столбцов и значения для них. Таким образом, если у тебя добавляются столбцы - редактируй эту строку
     
  8. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    У меня таким образом делается

    Код (Text):
    1. function mpdbf($tn, $post = null){
    2.     if(empty($post)) $post = $_POST;
    3.     foreach(mpql(mpqw("SHOW COLUMNS FROM $tn")) as $k=>$v){
    4.         if (isset($post[ $v['Field'] ])){
    5.             $pt = $post[ $v['Field'] ];
    6.             $f[] = "`{$v['Field']}`='". htmlspecialchars(mpquot($pt)). "'";
    7.         }
    8.     }
    9.     return implode(', ', (array)$f);
    10. }
    11.  
    12. if($_POST){
    13.     mysql_query("INSERT INTO table_name SET ".mpdbf('table_name'));
    14. }
    В этом случае при каждом добавлении полей в базу достаточно добавить поле в шаблон формы код править не нужно.
     
  9. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
  10. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    При большом количестве полей. Когда их просто нереально сравнивать с хтмл формой это очень удобно. Поиск ошибок сокращается так как я знаю что мне нужно всего то привести в соответствие имена $_POST значений со структурой таблицы в базе данных. В коде искать ошибку нет необходимости. При работе в команде это становится задачей верстальщика, который может справится с ней без помощи программиста. При добавлении новых полей код остается неизменным. Недостаток я вижу в том что при каждом добавлении новой записи в таблицу производится запрос структуры таблицы с данными. Но обновление происходит не так часто. Да и сам зепрос достаточно легкий. Опять же не нужно каждый раз проверять значения на уязвимость это делает функция для каждого их значений. Дополнительные значения $_POST запроса которых нет в таблице будут просто проигнорированы. Делать так или писать каждый раз километры SQL запросов решает каждый для себя сам.

    Что собственно не понравилось?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    mpak
    У тебя кстати когда комментарий добавляешь с кавычками в тексте, они на выводе эскейпятся слешами. Вот с таким функциональным подходом это можно централизовано пофиксить?)
     
  12. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Думаю да.Функция http://php.net/manual/en/function.stripslashes.html поможет.
    Я слеши победил силами конфигурационного файла php

    Статья про дивы и таблицы? Не заметил слешей в комментах.
     
  13. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Так что не понравилось в функции?
     
  14. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    бред делать таблицы с динамическими полями, да и писать такой код SHOW COLUMNS FROM для той задачи ТС, что я понял, тоже бред....
     
  15. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Никто не говорил что поля будут динамическими. Насколько я понял речь шла о вомзожности быстрой модификайции и добавления в нее дополнительных полей. Никто не собирается их менять прямо в коде.
     
  16. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
  17. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Автор хотел чтобы в таблицу одбавлялись новые поля, но при том что руками скрипт не править (дословно). Собственно что я ему и предложил.

    Можешь не отвечать. Я знаю ответ :)
    Аргументов я как всегда не будет.

    Если надо одной задачей думают хотя бы двоя то в этом есть смысл. Я тоже когда то задумался над этой задачей и для себя ее решил. Если есть желание можешь продолжать писать Запросы ручками. Каждый раз приводя типы к нужным, менять скрипт при каждом обьявлении типа полей и изменении формы.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    mpak
    в вопросе автора есть логическая ошибка. Нормального ответа на этот вопрос не будет никогда.
     
  19. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    В чем ошибка? Я не заметил ошибок.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    mpak
    написано: скрипт остается неизменным.
     
  21. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Правильный ответ был дан - EAV. Хотя, ясно дело, он может не подойти по разным причинам.
    Второй правильный ответ тоже был дан, хоть и через жопу. Можно запрашивать метадату таблицы и фильтровать вход на этой основе.
    Третий правильный ответ - все же держать список полей в модели и организовать нормальное ведение нескольких веток проекта для разных клиентов.
     
  22. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Это еще одно усложнение системы которое ничего кроме трудностей понимания и реализации не дась. Все данные уже содержаться в структуре таблицы. Зачем плодить дублирующие друг друга данные а потом думать на счет их актуальности и согласования с другими механизмами? Я лично за простые и понятные решения. Сделать сложно - легко. Упростить - сложно.

    Вообще саму постановку вопроса Правильный ответ и Неправильный ответ считаю не верной. Чтобы делать такие заключения нужно достаточная компетенция и хороший опыт внедрения проектов а не две книжки "ПХП за 21 день" и одна написанная фотогаллерея. В любом случае каждый для себя по разным причинам выберет подходящие именно ему решения. (личные предпочтения, компетенция специалиста, опыт работы с компонентами, обучение чему то новому, стиль написания кода наконец и много чего еще). Решение идеально подходящее одному может совершенно не подходить другому. Поэтому ставить шаблон что это решение правильное а это не правильное в корне не верно. К тому же повторюсь что аргументов для своих утверждений здесь по непонятным мне причинам приводить никто не хочет. Решения приводятся как единственно правильные и все другие отметаются по умолчанию. Предлагаю обсуждать и искать нахождение наиболее правильных. Обсуждать недостатки подходов а не кидать на ветер неаргументированных слов типа бреда БРЕД. Я бы предложил модератороам стирать такие сообщения вообще в связи с отсутствием в них смысловой нагрузки.
     
  23. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Именно такой вариант скрипта я и привел. Он неизменен не то чтобы для одной таблицы. Код будет оставаться един для всех форм ввода данных всего сайта. Не привязан к полям и таблицам. А при небольшой доработке он может фотки загружать, обновлять данные и уведомления делать о произошедшем событии.
     
  24. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    ООО mpak, ты гений!!!!
    ОООООммм
     
  25. Eser

    Eser Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    141
    Симпатии:
    0
    Спасибо за ответы!
    Сделал пока так и все работает.
    Проверку всяких полей потом доделаю.

    Код (Text):
    1. if(isset($_POST[save]) )
    2. {
    3. $arr=$_POST;
    4. unset($arr[save]);
    5.  
    6.  
    7. $str2 = "'" . implode("', '", $arr) . "'";
    8. function func()
    9. {
    10. $arr=$_POST;
    11. unset($arr[save]);
    12. $array = array();
    13.  
    14. foreach($arr as $key => $value)
    15. {
    16. array_unshift($array,$key);  
    17. }
    18. return($array);
    19. }
    20. $sort=array_reverse(func($array));
    21. $str1 = implode(",",$sort); //Строка со значениями массива
    22.  
    23. $insert=mysql_query("insert into $data_temp_name[temp_name] ($str1,id_comp,user_id) value($str2,'$_SESSION[comp_id]','$_SESSION[id]');");
    24. }