同じ問題を抱えている他のすべての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
これを修正する方法がわかりません。何か案は?
from
はSQLのキーワードです。引用符なしで列名として使用することはできません。 MySQLでは、列名のようなものはバックティックを使用して引用されます、すなわち`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クエリで同じpdoエラーが発生しました。
$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);
$sth->execute();
SQLクエリから配列arr[$s][a]
を抽出し、代わりにそれを含む変数を使用して問題を修正します。
ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;
バックティック、つまり「 `」を適切に追加します。バックティックの間にgetTable名と列名を書きます。