| 
			| 
					
						| 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 что значит, чем проверял?
 Браузером, наверное.
 
 Постарайся больше у нас такого не говорить. Ок? Чай мы не саппорт. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |