web-dev-qa-db-ja.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 )

予想されるもの(nullはない)

しかし、それはエラーを出力します

SQLSTATE [42000]:構文エラーまたはアクセス違反:1064 SQL構文にエラーがあります。 'from、to、name、subject、message)VALUES(' [email protected] '、' [email protected] 'line 1

これを修正する方法がわかりません。何か案は?

55
willium

fromはSQLのキーワードです。引用符なしで列名として使用することはできません。 MySQLでは、列名のようなものはバックティックを使用して引用されます、すなわち`from`

個人的には気にしません。列の名前を変更するだけです。

PS。コメントで指摘されているように、toは別のSQLキーワードであるため、引用符で囲む必要があります。便利なことに、drupal.orgの人々は SQLの予約語のリスト を維持しています。

100
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);
31
uKolka

多次元配列からデータベース値に挿入しようとしているときに、SQLクエリで同じpdoエラーが発生しました。

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

SQLクエリから配列arr[$s][a]を抽出し、代わりにそれを含む変数を使用して問題を修正します。

1
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