it-roy-ru.com

SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL есть ошибка - PHP - PDO

Я просмотрел все другие сообщения stackoverflow (и google) с той же проблемой, но ни одна, похоже, не решала мою проблему.

Я использую pdo и php.

Мой код:

$vals = array(
 ':from'=>$email,
 ':to'=>$recipient,
 ':name'=>$name,
 ':subject'=>$subject,
 ':message'=>$message
);
print_r($vals);
try {

 $pdo = new PDOConfig();

 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 $sql = "SELECT * FROM messages WHERE `message` LIKE :message";

 $q = $pdo->prepare($sql);
 $q->execute(array(':message' => $vals[':message']));
 $resp = $q->fetchAll();

 foreach ($resp as $row) {
  throw new Exception('Please do not post the same message twice!');
 }

 $sql = "INSERT INTO messages (from, to, name, subject, message) VALUES (:from, :to, :name, :subject, :message)";
 $q = $pdo->prepare($sql);
 $q->execute($vals);


} 
catch(PDOException $e) {
   echo $e->getMessage();
}

и первый print_r дает

Array ( [:from] => [email protected] [:to] => [email protected] [:name] => abc [:subject] => abc [:message] => abc )

что ожидается (никто не нулевой)

но выводит ошибку

QLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с «от, до, имя, тема, сообщение» ЗНАЧЕНИЯ («[email protected]», «[email protected]» в строке 1

Не знаете, как это исправить ... идеи?

50
willium

from - это ключевое слово в SQL. Вы не можете использовать его в качестве имени столбца без кавычек. В MySQL такие вещи, как имена столбцов, заключаются в кавычки, т. Е. `from`.

Лично я бы не стал беспокоиться; Я бы просто переименовал колонку.

PS. как указано в комментариях, to - это другое ключевое слово SQL, поэтому его тоже нужно заключать в кавычки. Удобно, что люди на drupal.org поддерживают список зарезервированных слов в SQL .

96
Jan Krüger

Я получил именно эту ошибку, но в моем случае я связывал значения для предложения LIMIT без указания типа. Я просто опускаю это здесь на случай, если кто-то получит эту ошибку по той же причине. Без указания типа LIMIT :limit OFFSET :offset; получился LIMIT '10' OFFSET '1'; вместо LIMIT 10 OFFSET 1;. Что помогает исправить это следующее:

$stmt->bindParam(':limit', intval($limit, 10), \PDO::PARAM_INT);
$stmt->bindParam(':offset', intval($offset, 10), \PDO::PARAM_INT);
29
uKolka

Та же ошибка pdo в sql запросе при попытке вставить в базу данных значение из многомерного массива:

$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);    
$sth->execute();

Извлечение массива arr[$s][a] из sql-запроса с использованием вместо него переменной, содержащей его, решает проблему. 

1
Szymon Baranowski
ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
    ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;

Добавьте обратную галочку, то есть "` "правильно. Напишите свое имя getTable и имя столбца между обратным тэгом.

0
Kazim Noorani