2013-01-17 3 views
-1

Я действительно вытягиваю свои волосы на этом. У меня есть простая секция комментариев по моему встроенному php-приложению, и я просто хочу добавить новую строку, если поймаю параметр $ _GET. Но независимо от того, как я создаю запрос на вставку MySQL, я получаю сообщение об ошибке.Ошибка PHP MySQL на INSERT

Это то, что я до сих пор:

if(isset($_GET['r'])){ 
    $replyid = mysql_real_escape_string($_GET['r']); 
    $sentnow = date("Y-m-d H:i:s"); 
    mysql_query("INSERT INTO eis_inbox (messageid, toid, from, contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."'") or die(mysql_error()); 
    echo '<meta http-equiv="refresh" content="0;/messages">'; 
} 

Мои MySQL DB поля называются точно так же: MessageId (auto_increment), toid (int11), из (varchar255), контакты (varchar255), видно (int3), сообщение (текст) и дату (временная метка/CURRENT_TIMESTAMP).

Выполнение выше страницы с скажем «index.php г = 777?» Следует, как я это вижу, заполнить мой MySQL с новой строки как таковой:

messageid = (AUTO_INCREMENT) 
toid = 777 
from = TESTUSER 
contact = CONTACTINFO 
seen = 0 
message = MESSAGE 
date = 2013-01-17 11:50:01 

Вместо этого, я получаю следующее ошибка:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from, contact, seen, message, date) VALUES (NULL, '1', 'TESTUSER', 'CONTACTINFO'' at line 1 

Аналогичная ошибка с "error_reporting (E_ALL)".

Я изучил это уже несколько дней, и я просто не могу найти ошибку ... Возможно, я слепой и пропуская запятую или закрывающий тег или что-то в этом роде. Есть идеи?

+3

Пожалуйста, не используйте mysql_ * функции в новом коде. Они больше не поддерживаются и официально устарели. Узнайте о подготовленных инструкциях вместо этого, используйте PDO или MySQLi – Afsar

+0

Я не уверен, является ли $ replyid int в вашей базе данных, но если это так, вы не должны использовать символы «вокруг». (только для строк) –

+0

Убедитесь, что тип данных для видимого поля является либо varchar, либо удаляет '' вокруг значения для него. – Kao

ответ

1

Есть некоторые синтаксические ошибки здесь:

  • Существует недостающее скобка в конце вашего сгенерированного запроса.
  • from и date являются зарезервированными ключевыми словами, заключают их в `.
  • seen и toid не являются полями varchar, поэтому их значения не должны быть включены в '.

Try:

mysql_query("INSERT INTO eis_inbox (messageid, toid, `from`, contact, seen, message, `date`) 
VALUES (NULL, ".$replyid.", 'TESTUSER', 'CONTACTINFO', 0, 'MESSAGE', '".$sentnow."')"); 

Внимание: это уязвимо для инъекций SQL. Не используйте команды mysql_*, попробуйте PDO ou mysqli. Подготовленные заявления помогут избежать их.

+0

Это трюк! ОГРОМНОЕ СПАСИБО! Принимая это как ответ! – uberconversion

+0

Последняя ужасная. Хотя их текущий код действительно неуязвим для инъекций, ваша версия сделала его уязвимым. -1 –

+0

Как так? Не сбрасывается ли $ _GET? – uberconversion

5

Его использование при использовании зарезервированных слов (с даты и даты) в качестве имен столбцов.

Оберните их вокруг с ``

т.е.

INSERT INTO eis_inbox (`messageid`, `toid`, `from`, `contact`, `seen`, `message`, `date`) 
0

Ваш пропущен закрывающий тег для значений, и от сохраняется, так что вы должны избежать этого ... (использовать кавычки вокруг него должен сделать трюк, ...:

mysql_query("INSERT INTO eis_inbox (messageid, toid, from, contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."'") or die(mysql_error()); 

должен быть

mysql_query("INSERT INTO eis_inbox (messageid, toid, 'from', contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."')") or die(mysql_error()); 

Также как zan упомянул, не использует mysql_ * функции, но mysqli_ * или PDO ...

2

Дата - это ключевое слово mysql, которое вы должны заключить в знак `sign. Here - это полный список зарезервированных слов в MySQL из официальной документации для будущего использования.

Помимо этого скобки для значений не закрыты.

Используйте это. Надеюсь, все будет хорошо.

INSERT INTO eis_inbox (`messageid`, `toid`, `from`, `contact`, `seen`, `message`, `date`) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."')" 

Спасибо.

1

вы не можете использовать зарезервированное слово в MySQL прямой

от резервируется слово

короткий пример

INSERT INTO eis_inbox (messageid, from) VALUES (1,2); 

- это плохо запрос

INSERT INTO eis_inbox (messageid, `from`) VALUES (1,2); 

- это правильный запрос

, но лучше избегать такой ситуации. Here - это полный список зарезервированных слов в MySQL из официальной документации для будущего использования.

0

Вы пропускаете кронштейн

mysql_query("INSERT INTO eis_inbox (messageid, toid, from, contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."')") or die(mysql_error());