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

этот вопрос уже есть ответ здесь:

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

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

мой код:

$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] => abc@gmail.com [:to] => lala@me.com [:name] => abc [:subject] => abc [:message] => abc )

который ожидается (нет null)

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

QLSTATE[42000]: синтаксическая ошибка или нарушение доступа: 1064 у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом с " ОТ, до, имя, тема, сообщение) значения ('abc@gmail.com', 'lala@me.com на линии 1

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

4 ответов


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

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

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


у меня есть эта точная ошибка, но в моем случае я привязывал значения для 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);

же ПДО ошибка в SQL-запросе при попытке вставить в базу данных с массива multidimential:

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

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


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

добавить backtick т. е. " ` " правильно. Напишите имя getTable и имя столбца между backtick.