web-dev-qa-db-ja.com

wpdb prepareの構文

$arr = [];
array_Push( $arr, 'wp_table', 1, '2013-12-24', 3, 'NULL');
$sql_prepare = "INSERT INTO %s (id, datea, one, two) VALUES (%d, %s, %d, %s) ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);";

$wpdb->query( 
      $wpdb->prepare( $sql_prepare,
                      $arr )
);

上記のコードはdateaの値2013-12-24に問題を引き起こすようです。

[You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''wp_table' (id, datea, one, two) VALUES (1, '201' at line 1]

"INSERT INTO 'wp_table' (id, datea, one, two) VALUES (1, '2013-12-24', 3, 'NULL') ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);"

$wpdb->prepare (...)がなければ、クエリはうまく機能します。

$wpdb->query( "INSERT INTO $table_name (id, datea, one, two) VALUES (1, '2013-12-24', 3, NULL) ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);");

日付の値を処理する方法について何かアドバイスはありますか?何がおかしいのですか?さらなる説明をありがとう。

/ edit私はprepareを使いすぎているかもしれませんが、少なくともdatea, one, twoはユーザー投稿の入力です

1
chabi

生成された文字列を見てください。

INSERT INTO 'wp_table' (id, datea, one, two) VALUES (1, '2013-12-24', 3, 'NULL') ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);

問題は、テーブル名を囲む引用符です。 prepareは動的なユーザー指定のコンテンツを対象としており、文字列と数値での使用を意図しています。 。テーブル名はどちらでもありません - あなたのコンテンツがそうであるのと同じ方法ではありません。それは引用符を提供しようとしています、それはあなたの質問を破ることになるでしょう。

あなたは単にテーブル名をクエリに書くことができるはずです。

$arr = array();
array_Push( $arr, 1, '2013-12-24', 3, 'NULL');
$sql_prepare = "INSERT INTO {$wpdb->prefix}table (id, datea, one, two) VALUES (%d, %s, %d, %s) ON DUPLICATE KEY UPDATE one = VALUES(one), two = VALUES(two);";
0
s_ha_dum