2013-11-25 3 views
6

私は1,2,3,4,5のようなIDの文字列を持っていて、IDがそのリストに含まれているmysqlのすべての行をリストすることができます。Mysql idは配列の中にあります

私は最も簡単な方法は、配列に文字列を有効にしてから($配列)に一致させることであろうと想定それは私のために動作しません - エラーなどが、それは行が戻されない:

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

私は$配列ののvar_dumpをすれば私が手:

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

私が台無しにしています任意のアイデア?

+0

ID文字列または整数はありますか? –

答えて

17
$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."')"); 
+0

ありがとうございます、これは大変な働きをしている可能性がありますが、 – bhttoan

+1

@bhttoan扱いましたが、脆弱性の影響を受けています... – qwertynl

+0

どうしてそうですか?私は非常に多くの不要なコードを避けるために、コード(実際のクエリ自体を含む)のビューを非常に単純化し、削除しましたが、配列の内容が壊れて安全であることを嬉しく思っています – bhttoan

6

あなたのクエリはに変換します。それに影響を

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

か何か。配列ではなく、文字列を返すarray_mapを

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

:へ

$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 
    // ... 
} 
1

変更

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

は、代わりのようなものを準備したクエリを使用してみてください。 WHERE句で使用するには、配列をコンマ区切り文字列に変換する必要があります。

+0

それから、元の文字列に戻ります...ポイントは何ですか? – qwertynl

+0

私はそれが彼が要求したものだと信じています。 – Darius

+0

これは、私の選択した答えと同じ最終結果のようですが、2行ではなく1行で、なぜダウンボートなのでしょうか? FYI @Darius私はこれをdownvoteしませんでした – bhttoan

関連する問題