luckyjew
Гость
|
|
« : 24-04-2010 17:08 » |
|
Добрый день!
Хочу спросить совета у знающих людей. На локальной машине установил Apache, PHP, MySQL. Вроде все работает (в частности, запросы к базе данных, такие как SELECT, UPDATE, а вот INSERT почему-то не выполняется, хотя тот же самый скрипт отлично работает в vertrigo.
Заранее спасибо!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 24-04-2010 19:22 » |
|
luckyjew, чем проверял?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
luckyjew
Гость
|
|
« Ответ #2 : 25-04-2010 09:15 » |
|
RXL что значит, чем проверял? Браузером, наверное. К примеру, строка запроса: $sql = "INSERT INTO `tbl_name` (`name`) VALUES ('value')"; $res = mysql_query ($sql, $connect) or die($sql); //переменная $connect отвечает за подключение к базе данных
В ответ на выполнение браузер выводит значение переменной $sql, то есть запрос не выполняется. Хотя, $sql = "UPDATE `tbl_name` SET `name`='value'"; $res = mysql_query($sql, $connect) or die($sql);
выполняется, и никаких ошибок и сообщений в браузер не выводятся.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #3 : 25-04-2010 11:37 » |
|
luckyjew, проверь права на таблицу для данного пользователя.
И еще, при выполнении 'insert' ты должен передать все значения для столбцов таблицы. Т.е. если в таблице 5 столбцов, то при insert ты должен передать значения для всех пяти столбцов.
|
|
« Последнее редактирование: 25-04-2010 11:40 от Serg79 »
|
Записан
|
|
|
|
luckyjew
Гость
|
|
« Ответ #4 : 25-04-2010 12:03 » |
|
Serg79, как показывает практика, не обязательно указывать все поля таблицы. А по поводу прав - пользователь-то root и в mysql ему выставлены all privileges.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #5 : 25-04-2010 12:12 » |
|
Т.е. если в таблице 5 столбцов, то при insert ты должен передать значения для всех пяти столбцов.
Не обязательно, если не передать все - остальные получат значение NULL (или по умолчанию, если это настроено в параметрах таблицы). А вот если значение NULL запрещено хотя бы для одного из полей - тогда действительно запись не добавится и возникнет ошибка. luckyjew, Ты включил вывод всех ошибок в php? В начале скрипта: error_reporting(E_ALL | E_STRICT);
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #6 : 25-04-2010 12:17 » |
|
Kivals да не обязательно если поле может принимать значение 'null'. Но в этом случае все поля которые могут принимать значение 'null' должны быть сгруппированы в конце таблицы или в 'insert' передавать список изменяемых значений отличных от 'null'. Иначе таким полям все равно надо присваивать значение хоть это значение и будет 'null'.
ИМХО, лучше все равно придерживаться правил указывания значений для каждого столбца при выполнении запроса 'insert'. Такой код будет как минимум самодокументирован, что в последующем сопровождении позволит намного быстрее вспомнить поля таблицы.
Можно посмотреть какую ошибку возвращает MySQL с помощью функции 'mysql_error'.
|
|
« Последнее редактирование: 25-04-2010 12:28 от Serg79 »
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #7 : 25-04-2010 12:29 » |
|
ИМХО: добавлять записи вообще нужно с использованием хранимых процедур, а не insert (insert выполняется уже внутри процедуры, после проверки значений и выдачи понятного сообщения об ошибке, если что не так в параметрах). По крайней мере я свои системы стараюсь строить именно так, т.е. БД - это все-таки база данных (со всеми вытекающими связями между данными и проверкой корректности), а не просто хранилище данных.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #8 : 25-04-2010 12:31 » |
|
Kivals, все зависит от бизнес логики. Где то нужно и 50 раз помолиться прежде чем сказать аминь.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #9 : 25-04-2010 12:39 » |
|
Offtopic: Serg79, я немного зарапортовался В принципе в самом insert ничего страшного нет и кстати если использовать триггеры то можно в них тоже спокойно проверять значения (т.е. описанный мною метод можно реализовать с помощью insert и триггеров - так вроде даже правильней получится). Ну а насчет бизнес-логики - не согласен. Приведи пример, где чистый insert предпочтительней (кроме случаев повышения производительности, но это уже технические требования, а не бизнес-логика)
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #10 : 25-04-2010 12:52 » |
|
Да не знаю Kivals, есть куча приложений которые используют базу для хранения 'key => value' значений. Такие приложения вполне обходятся базовым API SQL без триггеров и функций.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #11 : 25-04-2010 13:24 » |
|
Offtopic: Serg79, ну насколько я встречал в практике - для этого достаточно одной таблицы с двумя полями. А остальные таблицы? И мне кстати удобней было бы использовать функции SetValue()/GetValue(), при этом еще и проверяя, а есть ли значение по указанному ключу. Тут вопрос в том, что переносимость хранимых процедур (функций) между разными БД очень плохая: у каждой БД свой язык (а то и несколько), нет стандартов, которые присутсвуют для SQL. Так что если приложение планируется с поддержкой разных БД - то для всех этих БД нужно будет написать все хранимые процедуры с нуля, а это немало работы...
|
|
|
Записан
|
|
|
|
luckyjew
Гость
|
|
« Ответ #12 : 25-04-2010 13:27 » |
|
Да, проблема оказалась не в настройках PHP или MYSQL, как я думал, а, как заметил Kivals, в том, что у меня часть полей в таблице были NOT NULL и поэтому их надо было указывать в запросе. А еще, некоторые поля у меня были типа int, а я в запросе передавал им значения типа char. Как только я все это исправил - скрипт заработал.
Всем спасибо за помощь!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #13 : 25-04-2010 17:44 » |
|
RXL что значит, чем проверял?
Браузером, наверное.
Постарайся больше у нас такого не говорить. Ок? Чай мы не саппорт.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|