5

簡単なクエリを作成する必要があります

$array_of_ids = array();
//poulate $array_of_ids, they don't come from another db but from Facebook
//so i can't use a subquery for the IN clause
$wpdb->prepare("SELECT id from table where id IN (%d, %d)", $array_of_ids [0], $array_of_ids [1]);

問題は、配列に 200 個の要素がある場合、これを処理する正しい方法は何ですか?200 でクエリを手動で作成する必要があります%dか? データベースをFacebookデータと「同期」する必要があり、データベースにあるユーザーが存在するかどうかを確認し、存在するユーザーを更新し、新しいユーザーを挿入し、友達ではないユーザーを削除する必要があるため、このクエリが必要です。

4

5 に答える 5

4

配列要素が数値であることが確実にわかっている場合:

$wpdb->prepare("SELECT id FROM table WHERE id IN ("
  . implode(',',$array_of_ids) . ")");

それ以外の場合は、次のvsprintf形式を使用してprepareパラメーターの配列を渡すことができます。

$wpdb->prepare("SELECT id FROM table WHERE id IN ("
  . str_repeat("%d,", count($array_of_ids)-1) . "%d)" , $array_of_ids);
于 2012-05-08T15:15:17.033 に答える
1

これが良いアプローチかどうかはわかりませんが、次の方法で実行できます。

$sql = "SELECT id from table where id IN (" 
     . implode(',', array_fill(0, count($array_of_ids), "%d"))
     . ")";

call_user_func_array(array($wpdb, 'prepare'), $array_of_ids);

これにより、適切な数の文字列が作成され%d、 を使用call_user_func_arrayして動的に実行されます。

とは言っても、整数をサニタイズするのがいかに簡単かを考えると、準備済みステートメントが面倒な価値があるケースであるかどうかはわかりません。

于 2012-05-08T15:21:34.673 に答える
0

これにはまだ受け入れられた答えがないので、array_filterを使用したアプローチを使用します

$array_of_ids = array(0,1,1,2,3,5,8,13);

echo "SELECT id from table where id IN (".implode(',', array_filter($array_of_ids,'is_int')).")";

出力します

SELECT id from table where id IN (0,1,1,2,3,5,8,13)

その間

$array_of_ids = array('zero',1,true,2,3,5,8,'thirteen');

echo "SELECT id from table where id IN (".implode(',', array_filter($array_of_ids,'is_int')).")";

出力します

SELECT id from table where id IN (1,2,3,5,8)

is_int$_GET 変数では機能しないことに注意してください。is_numeric代わりに使用してください

于 2014-01-30T13:14:02.473 に答える
0

はい、動的SQLがここにあります。幸いなことに、整数を台無しにしないのは簡単です。

$vals = array_filter(array_map('intval', $vals));

少なくとも 1 つの値があることを確認してから、内破します。ここでは準備済みステートメントは必要ありません。SQL を実行するだけです。

于 2012-05-08T15:18:45.560 に答える
-1

あなたはこれを行うことができます :

$query = $wpdb->prepare("SELECT id from table where id IN :param");
$query->bindParam("param", "(".implode(',', array_map('intval', $array_of_ids)).")");
于 2012-05-08T15:23:56.187 に答える