1

関連する質問ですが、私には役立ちません: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'。それは本当に良いものではありませんが、それは機能します。

4

3 に答える 3

1

私はそのように進みます:

$bdd->prepare(INSERT INTO `table_name` (`abc`, `def`, `ghi`) VALUES (?, ?, ?))
$bdd->execute(array('abcValue', 'devValue', 'ghiValue'))
于 2012-11-22T10:49:58.603 に答える
1

そのメソッドに別の引数を追加します。

  • テーブル名
  • 値(連想配列として)
  • sql(連想配列として)

'?'は使用できないことに注意してください。列にアクセスする場合(例:inCOLUMN1 + 1またはCOLUMN1 + COLUMN2

于 2012-11-22T10:53:53.963 に答える
0

最後のクエリでエラーが発生し( -- error, incorrect datetime value: 'NOW()') ます代わりに、日付を次のようにフォーマットしてみてください。

DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s'))

于 2012-11-22T11:01:33.713 に答える