関連する質問ですが、私には役立ちません:MYSQL関数を準備されたPDOステートメントに渡せないのはなぜですか?
これが取引です。私はPHPPDOに抽象化レイヤーを記述し、クエリビルダーを実装しています。
この正確な問題は、INSERTステートメントでのみ発生します。これが私のコードの例です:
$db->insert('table_name')
->keys(array('abc', 'def', 'ghi'))
->values(array($var1, $var2, $var3)) // can take a 2D array if you want to insert multiple rows at the same time
->execute();
基になるコードは、値の代わりに?を使用してクエリ文字列を作成します。この特定の例では、クエリの結果は次のようになります。
INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
(?, ?, ?)
を呼び出すとexecute()
、値が1次元配列として渡されますPDOStatement::execute()
(つまり、疑問符に関連付けられているすべての値が1つの配列に入れられます)。そして、これが問題の始まりです-はPDOStatement::execute()
MySQL関数自体を処理しませんが、それらを文字列として引用するため、クエリが壊れます。
INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
('123', 456, 'NOW()') -- error, incorrect datetime value: 'NOW()'
問題は、同じインターフェイスを維持しながらこれを機能させるにはどうすればよいですか?列の値がMySQL関数であるかどうかを確認し、疑問符の代わりに直接入力できることはわかっていますが、そこで使用できる関数はたくさんあり、それは面倒です。
編集:したがって、今のところ最も簡単なオプションは、次のように値をそのままにしておくことです$var3 => 'noquote'
。それは本当に良いものではありませんが、それは機能します。