Я просмотрел все другие сообщения stackoverflow (и google) с той же проблемой, но ни один из них не рассматривал мою проблему.
Мой код:
$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 )
который ожидается (ни один не равен нулю)
но он выдает ошибку
QLSTATE [42000]: Ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'from, to, name, subject, message. VALUES (' abc@gmail.com ',' lala@me.com 'в строке 1
Не знаю, как исправить это … идеи?
from
– это ключевое слово в SQL. Вы не можете использовать его как имя столбца без его цитирования. В MySQL такие вещи, как имена столбцов, цитируются с использованием обратных `from`
, то есть `from`
.
Лично я бы не стал беспокоиться; Я бы просто переименовал столбец.
PS. как указано в комментариях, это еще одно ключевое слово 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);
Такая же ошибка pdo в sql-запросе при попытке вставить в значение базы данных из многомерного массива:
$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;
Добавьте обратную сторону, то есть «` »правильно. Напишите имя и имя столбца getTable между обратным ходом.