Подтвердить что ты не робот

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, для правильного синтаксиса для использования рядом с 'from, to, name, subject, message. VALUES (' [email protected] ',' [email protected] 'в строке 1

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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