web-dev-qa-db-ja.com

SQL IN演算子でPHP配列を使用するには?

私は2つの値を持つ配列を持っていますが、選択クエリでSQL IN演算子でそれを使用したいと思います。

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

_id comp_id
1   2
2   3
3   1
_

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

Comp_id 1とcomp_id 2のレコードを取得したいので、次のクエリを作成しました。

_SELECT * from table Where comp_id IN ($arr)
_

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

31
Ahmad

プレーンintegersでできることは...

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

(今後も追加情報が表示されるため、...)

strings(特にuntrusted)入力で作業する場合は、

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

ただし、NULLなどの値は処理しません。そして、数値の周りに引用符をブラインドで追加します、それはnot厳密なmysqlモードを使用します。 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#idm140082377917056 ...つまり、文字列(VARCHARなど)を実際に使用する場合にのみ使用します。数値列。

Needmysql_real_escape_stringは、文字列内の引用符が適切に処理されるようにするためのものです。 (SQLインジェクションを防ぐだけでなく!)


... DOが 'untrusted'番号を使用する場合は、intvalまたはfloatvalを使用できます

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

入力をサニタイズします。 (入力の前後に引用符はありません。

62
barryhunter

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

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

また、さらに、値を最初にエスケープすることもできます(入力が不明な場合)。

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
14
Aurimas

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

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

クエリを実行する前に

$arr = implode ( ', ', $arr);
5
mishu

'、'コンマで配列を分解する必要があります

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

SELECT * from table Where comp_id IN ($imploded_arr)
5
saba

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

mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
4
Chakradar Raju

PHPとSQL-IN SQL演算子の場合、次のような形式が必要です。

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

PHP=

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

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

3
Jon Cairns

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

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

それが私のような人を助けることを願っています。 :)

2
shazyriver

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

$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
2
enygma

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

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

現在、クエリをechoすると、配列がINステートメントにあるのではなく、単語「Array」になります。

2
jprofitt

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

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

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

SELECT * from table Where comp_id IN ($list)
2
MrCode

整数のみを含む配列でのみ動作する@barryhunterの答えによると:

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

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

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

配列が整数の場合:

$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')";
0
Sujay U N

これまでのいくつかの回答には、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();
0