web-dev-qa-db-ja.com

idが配列内にあるMySQL

1,2,3,4,5のようなIDの文字列があり、そのリストにIDが含まれるmysqlのすべての行をリストできるようにしたいと思います。

最も簡単な方法は、文字列を配列に変換してから($ array)に一致させることだと思いましたが、それは私には機能しません-エラーなどはありませんが、行を返しません:

$string="1,2,3,4,5";
$array=array_map('intval', explode(',', $string));
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')");

$ arrayのvar_dumpを実行すると、次の結果が得られます。

array(5) { 
    [0]=> int(1) 
    [1]=> int(2) 
    [2]=> int(3) 
    [3]=> int(4) 
    [4]=> int(5) 
}

私がどこでめちゃくちゃになっているのでしょうか?

18
bhttoan
$string="1,2,3,4,5";
$array=array_map('intval', explode(',', $string));
$array = implode("','",$array);
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')");
39
Crayon Violent

クエリは次のように変換されます。

SELECT name FROM users WHERE id IN ('Array');

または何か影響するもの。

代わりに、準備済みのクエリを使用してみてください:

$numbers = explode(',', $string);
$prepare = array_map(function(){ return '?'; }, $numbers);
$statement = mysqli_prepare($link , "SELECT name FROM users WHERE id IN ('".implode(',', $prepare)."')");
if($statement) {
   $ints = array_map(function(){ return 'i'; }, $numbers);
   call_user_func_array("mysqli_stmt_bind_param", array_merge(
      array($statement, implode('', $ints)), $numbers
   ));
   $results = mysqli_stmt_execute($statement);
   // do something with results 
   // ...
}
7
qwertynl

変化する

$array=array_map('intval', explode(',', $string));

に:

$array= implode(',', array_map('intval', explode(',', $string)));

array_mapは、文字列ではなく配列を返します。 WHERE句で使用するには、配列をコンマ区切りの文字列に変換する必要があります。

2
Darius