2013-08-02 2 views
2

Я создаю небольшой клон Twitter для личного использования, и у меня так много проблем с ним. Кулак, я хочу показать вам мою SQL структуру таблицы «poke_history»:
http://puu.sh/3Sci0.pngНеправильный синтаксис SQL?

Это команда, которую я использовать для вставки значений в таблицу (в PHP):

$insert = "INSERT INTO poke_history (id, from, time, reason) VALUES ('".$to_id."', '".$from_id."', '".$time."', '".$reason."')"; 
mysql_query($insert) or die(mysql_error()); 

Это досадная ошибка, что я получаю:

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, time, reason) VALUES ('1'' at line 3. 

Позвольте мне прояснить некоторые вещи.
$to_id - это номер.
$from_id - это номер.
$time - это номер (из PHP time()).
$reason - текстовая строка.

Я использую MySQL и PHP5.

+2

'from' - зарезервированное ключевое слово. Используйте цитирование идентификатора. – mario

+0

Как я могу это исправить (в PHP)? –

+0

Попробуйте удалить одинарные кавычки для $ to_id и $ from_id? Стоит сделать снимок. Но для будущего попытайтесь использовать PDO, это намного безопаснее. – Ishikawa91

ответ

2

Попробуйте процитировать ваши идентификаторы столбцов, как

INSERT INTO poke_history (`id`, `from`, `time`, `reason`) ... 

Все внутри `` это считается «идентификатор» не является языком ключевых слов. Из синтаксиса SQL должно быть ясно, что после того, как INSERT INTO tablename не может прийти FROM, но MySQL иногда нуждается в таком руководстве (и других парсерах sql).

1

кредит марио, а также:

от зарезервированного ключевого слова. Используйте backticks, чтобы избежать их.

, например `от`

INSERT INTO table (`from`) .... 

Так что ваш код будет нравится:

$insert = "INSERT INTO poke_history (`id`, `from`, `time`, `reason`) VALUES ('".$to_id."', '".$from_id."', '".$time."', '".$reason."')"; 
mysql_query($insert) or die(mysql_error()); 
1
$insert = "INSERT INTO poke_history (`id`, `from`, `time`, `reason`) VALUES (".$to_id.", ".$from_id.", ".$time.", '".$reason."')"; 
mysql_query($insert) or die(mysql_error()); 

Числа не должны быть заключены в кавычки. Только строки. Также не используйте mysql, он устарел. Лучше использовать PDO с подготовленными инструкциями, чтобы избежать таких проблем.

+3

Я не делал это без изменений, но вы должны использовать правильный тип котировок для цитирования идентификаторов. Используйте back-ticks с MySQL, а не прямые кавычки. Одиночные кавычки предназначены для строковых литералов и литератур. –

+0

спасибо Биллу, я обновляю свой ответ. – Aris

-1

Я думаю, что вы забыли добавить * между INSERT и INTO, вот фиксированный сценарий:

$ Вкладыш = "INSERT * INTO poke_history (идентификатор, с, время, разум) VALUES ('". $ to_id. "','". $ from_id. "','". $ time. "','". $ reason. "')"; mysql_query ($ insert) или die (mysql_error());

-1

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что вы пытаетесь использовать встроенное имя функции для одного из своих столбцов. Скажем, у вас есть следующие CREATE TABLE ...

CREATE TABLE customers 
(
name varchar(80), 
streetAddr varchar(160), 
"from" varchar(60), 
); 

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

INSERT INTO ShoppingFun.dbo.customers 
(
name, 
streetAddr, 
"from" 
) 
VALUES 
(
'MRBubbleGum', 
'1061 SW BubbleGumVillage St', 
'yourmom' 
) 
0

Вы должны попытаться использовать подготовленные заявления для предотвращения инъекций SQL.

$query = " 
    INSERT INTO 
     poke_history (`id`, `from`, `time`, `reason`) 
    VALUES 
     (:id, :from, :time, :reason)"; 

$db = new PDO("mssql:host=sqlserver;dbname=database", "username", "password"); 

$statement = $db->prepare($query); 

$parameters = array(
    ":id" => $name, 
    ":from" => $from, 
    ":time" => $time, 
    ":reason" => $reason 
); 

$statement->execute($parameters); 
Смежные вопросы