44

2つの値を持つ配列があり、selectクエリのsqlIN演算子で使用したいと思います。

これが私のテーブルの構造です

id comp_id
1   2
2   3
3   1

$arr2つの値を持つ配列がありますArray ( [0] => 1 [1] => 2 )

comp_id1とcomp_id2のレコードをフェッチしたいので、次のクエリを作成しました。

SELECT * from table Where comp_id IN ($arr)

ただし、結果は返されません。

4

13 に答える 13

83

単純な整数があるので、それらをコンマで簡単に結合できます。

$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(',', $arr) . ")";

文字列、特に信頼できない入力を操作する場合:

$sql = "SELECT * FROM table WHERE comp_id IN ('" 
     . implode("','", array_map('mysql_real_escape_string', $arr)) 
     . "')";

これはNULL(空の文字列として保存されます)などの値には対応しておらず、数値の前後に引用符を盲目的に追加することに注意してください。これは、厳密なmysqlモードを使用している場合は機能しません。

mysql_real_escape_stringは元のmysqlドライバー拡張機能の関数です。mysqliなどの最新のドライバーを使用している場合は、mysqli_real_escape_string代わりに使用してください。

ただし、信頼できない番号を処理するだけの場合は、intvalまたはを使用floatvalして入力をサニタイズできます。

$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(",", array_map('intval', $arr)) . ")";
于 2012-03-08T13:21:15.803 に答える
15

配列をコンマ区切りの文字列に変換する必要があります。

$condition = implode(', ', $arr);

さらに、最初に値をエスケープすることをお勧めします(入力について不明な場合)。

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
于 2012-03-08T13:21:39.653 に答える
5

$ arrはphp配列です。SQLサーバーに、解析される文字列を送信する必要があります。配列を1、2などのリストに変換する必要があります。

これを行うには、関数http://php.net/implodeを使用できます

したがって、クエリを実行する前に試してください

$arr = implode ( ', ', $arr);
于 2012-03-08T13:21:35.640 に答える
5

配列を「、」コンマで内破する必要があります

$imploded_arr = implode(',', $arr);

SELECT * from table Where comp_id IN ($imploded_arr)
于 2012-03-08T13:21:41.487 に答える
4

文字列はクエリとしてmysqlにのみ渡すことができるので、これを試してください

mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
于 2012-03-08T13:22:39.767 に答える
4

ここのすべての人が同じことを提案していますが、単純なエラーのためにWordPressで警告が表示されました。挿入された文字列にコンマを追加する必要があります。正確にはこのようなものです。

$query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";

それが私のような誰かに役立つことを願っています。:)

于 2017-08-16T11:18:49.097 に答える
3

PHPとSQLを混在させていINます-SQL演算子の場合、次のような形式が必要です。

SELECT * from table WHERE comp_id IN (1,2)

したがって、PHPでそれを取得するには、次のようなことを行う必要があります。

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"

これは、配列が整数で構成されている場合にのみ機能することに注意してください。文字列の場合は、各要素をエスケープする必要があります。

于 2012-03-08T13:22:24.057 に答える
2

次のようなものが必要です。

$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
于 2012-03-08T13:21:49.413 に答える
2

実際に文字列に変換する必要があり$arrます。あなたがしていることの最も簡単な方法は、使用することですimplode()

$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';

今のところ、クエリを実行すると、ステートメントに配列が含まれているのではなく、「配列」という単語になっているechoことがわかります。IN

于 2012-03-08T13:22:15.010 に答える
2

クエリで使用するために、配列を文字列に変換する必要があります。

$list = implode(',', $arr);

次に、IN句で使用できます。

SELECT * from table Where comp_id IN ($list)
于 2012-03-08T13:22:15.210 に答える
2

整数のみを含む配列でのみ機能する@barryhunterの回答によると:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";

文字列の配列で機能するように、いくつかの調整を行いました。

$sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
于 2018-07-05T12:07:47.680 に答える
0

以前の回答のいくつかには、SQLインジェクションのリスクがいくつかあります。$arr消毒されることを完全に確信している場合は問題ないかもしれません(そしてその状態を維持します)。ただし、完全に確信が持てない場合は、を使用してそのようなリスクを軽減することをお勧めします$stmt->bindValue。これを行う1つの方法は次のとおりです。

# PHP
$in_list = array();
for ($i = 0; $i < count($arr); $i++) {
    $key = 'in_param_' . i;
    $in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
}
$keys = implode(', ', array_keys($in_list));

// Your SQL ...
$sql = "SELECT * FROM table where id IN ($keys)";


foreach ($in_list as $item) {
    $stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
}
$stmt = $this->getConnection()->prepare($sql)->execute();
于 2018-08-30T01:49:49.420 に答える
0

配列が整数の場合:

$searchStringVar = implode(",",$nameIntAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";

配列が文字列の場合:

$searchStringVar = implode("','",$nameStringAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";
于 2019-01-21T18:05:50.903 に答える