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.