Как записать данные в таблицу которая динамическая т.е в нее могут добавляться новые колонки. Например были колонки:ID,DATA,NAME А я решил добавить в нее спустя некоторое время еще:TYPE,STATUS ну и тд. Но при том что руками скрипт не править? Собственно если бы столбцов было бы постоянное кол-во то вопроса бы не было.
обычно делают постоянные таблицы, и не меняют столбцы, продумывая перед этим постановку задачи. Конечно бывают изменения, но они настолько редки,насколько всё изначально продумано. Бывают расширение функционала. Естественно при этом надо править код в большинстве случаев. Но опять же эти изменения на столько редкие на сколько всё изначально продумано. Вы не видите проблему, вы видите результаты. Так что удачи. Если вы не сделали, что бы код сам узнавал о метаданных, то без правки кода увы никак не получится.
Eser чего-чего? =) Скрипт как писал так и будет писать в те колонки, на которые написан. В чем вопрос?
Я понимаю что статические таблицы лучше. Но мне это не подходит, лишь по той причине что наши клиенты не от мира сего. У нас их 5штук. у каждого должны отражаться только его справочники с реквизитами и + эти справочники могут добавляться соответственно в таблице заявок должны появляться новые столбцы под эти справочники. Собственно у меня почти всего готово, но я не понимаю как обьяснить скрипту что появился новый столбец(имя которого скрипту я могу передать) в таблице заявок и что новый справочник должен писаться именно в этот столбец. Вот оно как.
Eser твоим решением возможно должна была быть EAV модель http://www.php.ru/forum/viewtopic.php?t=20436 , а не то, что ты нагородил...
В запросе выбирай все данные SELECT * FROM table Тогда останется установить новое поле в шаблон <?=$line['field']?> А для записи в базу я пользуюсь скриптом которые проверяет поля таблицы и в случае если есть значение $_POST совпадающее с одноименным значением в базе до формирует это значение в запросе. При таком подходе только меняешь поля таблицы, шаблон изменяет верстальщик. При добавлении новых данных остается только назначить правильные имена переменным. Естественно приводя все пришедшие значения к безопасной форме. К какой именно поять же узнается из структуры таблицы.
Если я правильно понял, то можно так: PHP: <? $s = array('id'=>1,'name'=>'Иван'); insert_table($s); function insert_table($data) { $sql = ''; foreach ($data as $k=>$v) { $sql .= "$k = '$v', "; } $sql = substr($sql,0,-2); // Убираем запятую в конце mysql_query('INSERT INTO table SET '.$sql); } ?> Строка содержит имена столбцов и значения для них. Таким образом, если у тебя добавляются столбцы - редактируй эту строку
У меня таким образом делается Код (Text): function mpdbf($tn, $post = null){ if(empty($post)) $post = $_POST; foreach(mpql(mpqw("SHOW COLUMNS FROM $tn")) as $k=>$v){ if (isset($post[ $v['Field'] ])){ $pt = $post[ $v['Field'] ]; $f[] = "`{$v['Field']}`='". htmlspecialchars(mpquot($pt)). "'"; } } return implode(', ', (array)$f); } if($_POST){ mysql_query("INSERT INTO table_name SET ".mpdbf('table_name')); } В этом случае при каждом добавлении полей в базу достаточно добавить поле в шаблон формы код править не нужно.
При большом количестве полей. Когда их просто нереально сравнивать с хтмл формой это очень удобно. Поиск ошибок сокращается так как я знаю что мне нужно всего то привести в соответствие имена $_POST значений со структурой таблицы в базе данных. В коде искать ошибку нет необходимости. При работе в команде это становится задачей верстальщика, который может справится с ней без помощи программиста. При добавлении новых полей код остается неизменным. Недостаток я вижу в том что при каждом добавлении новой записи в таблицу производится запрос структуры таблицы с данными. Но обновление происходит не так часто. Да и сам зепрос достаточно легкий. Опять же не нужно каждый раз проверять значения на уязвимость это делает функция для каждого их значений. Дополнительные значения $_POST запроса которых нет в таблице будут просто проигнорированы. Делать так или писать каждый раз километры SQL запросов решает каждый для себя сам. Что собственно не понравилось?
mpak У тебя кстати когда комментарий добавляешь с кавычками в тексте, они на выводе эскейпятся слешами. Вот с таким функциональным подходом это можно централизовано пофиксить?)
Думаю да.Функция http://php.net/manual/en/function.stripslashes.html поможет. Я слеши победил силами конфигурационного файла php Статья про дивы и таблицы? Не заметил слешей в комментах.
бред делать таблицы с динамическими полями, да и писать такой код SHOW COLUMNS FROM для той задачи ТС, что я понял, тоже бред....
Никто не говорил что поля будут динамическими. Насколько я понял речь шла о вомзожности быстрой модификайции и добавления в нее дополнительных полей. Никто не собирается их менять прямо в коде.
mpak конечно, можно это достоверно не узнать, но почитай http://www.php.ru/forum/viewtopic.php?p=227939#227939 что автор хотел именно
Автор хотел чтобы в таблицу одбавлялись новые поля, но при том что руками скрипт не править (дословно). Собственно что я ему и предложил. Можешь не отвечать. Я знаю ответ Аргументов я как всегда не будет. Если надо одной задачей думают хотя бы двоя то в этом есть смысл. Я тоже когда то задумался над этой задачей и для себя ее решил. Если есть желание можешь продолжать писать Запросы ручками. Каждый раз приводя типы к нужным, менять скрипт при каждом обьявлении типа полей и изменении формы.
Правильный ответ был дан - EAV. Хотя, ясно дело, он может не подойти по разным причинам. Второй правильный ответ тоже был дан, хоть и через жопу. Можно запрашивать метадату таблицы и фильтровать вход на этой основе. Третий правильный ответ - все же держать список полей в модели и организовать нормальное ведение нескольких веток проекта для разных клиентов.
Это еще одно усложнение системы которое ничего кроме трудностей понимания и реализации не дась. Все данные уже содержаться в структуре таблицы. Зачем плодить дублирующие друг друга данные а потом думать на счет их актуальности и согласования с другими механизмами? Я лично за простые и понятные решения. Сделать сложно - легко. Упростить - сложно. Вообще саму постановку вопроса Правильный ответ и Неправильный ответ считаю не верной. Чтобы делать такие заключения нужно достаточная компетенция и хороший опыт внедрения проектов а не две книжки "ПХП за 21 день" и одна написанная фотогаллерея. В любом случае каждый для себя по разным причинам выберет подходящие именно ему решения. (личные предпочтения, компетенция специалиста, опыт работы с компонентами, обучение чему то новому, стиль написания кода наконец и много чего еще). Решение идеально подходящее одному может совершенно не подходить другому. Поэтому ставить шаблон что это решение правильное а это не правильное в корне не верно. К тому же повторюсь что аргументов для своих утверждений здесь по непонятным мне причинам приводить никто не хочет. Решения приводятся как единственно правильные и все другие отметаются по умолчанию. Предлагаю обсуждать и искать нахождение наиболее правильных. Обсуждать недостатки подходов а не кидать на ветер неаргументированных слов типа бреда БРЕД. Я бы предложил модератороам стирать такие сообщения вообще в связи с отсутствием в них смысловой нагрузки.
Именно такой вариант скрипта я и привел. Он неизменен не то чтобы для одной таблицы. Код будет оставаться един для всех форм ввода данных всего сайта. Не привязан к полям и таблицам. А при небольшой доработке он может фотки загружать, обновлять данные и уведомления делать о произошедшем событии.
Спасибо за ответы! Сделал пока так и все работает. Проверку всяких полей потом доделаю. Код (Text): if(isset($_POST[save]) ) { $arr=$_POST; unset($arr[save]); $str2 = "'" . implode("', '", $arr) . "'"; function func() { $arr=$_POST; unset($arr[save]); $array = array(); foreach($arr as $key => $value) { array_unshift($array,$key); } return($array); } $sort=array_reverse(func($array)); $str1 = implode(",",$sort); //Строка со значениями массива $insert=mysql_query("insert into $data_temp_name[temp_name] ($str1,id_comp,user_id) value($str2,'$_SESSION[comp_id]','$_SESSION[id]');"); }