web-dev-qa-db-ja.com

テーブルから複数のIDを選択する

私はURL文字列に基づいていくつかのIDを選択したいのですが、私のコードでは最初のものだけが表示されます。マニュアルを書いた場合、IDはうまく機能します。

私はこのようなURLを持っています http://www.mydomain.com/myfile.php?theurl=1,2,3,4,5 (ids)

今myfile.phpで私のSQL接続と:

$ids = $_GET['theurl']; (and i am getting 1,2,3,4,5)

これを使用する場合:

$sql = "select * from info WHERE `id` IN (1,2,3,4,5)";
$slqtwo = mysql_query($sql);
while ($tc = mysql_fetch_assoc($slqtwo)) {
    echo $tc['a_name'];
    echo " - ";
}

正しい結果を得ています。次のコードを使用すると、機能しません。

$sql = "select * from info WHERE `id` IN ('$ids')";
$slqtwo = mysql_query($sql);
while ($tc = mysql_fetch_assoc($slqtwo)) {
    echo $tc['a_name'];
    echo " - ";
}

助言がありますか?

13
Irene T.

補間すると

"select * from info WHERE `id` IN ('$ids')"

あなたのIDで、あなたは得ます:

"select * from info WHERE `id` IN ('1,2,3,4,5')"

... IDのセットを整数のセットではなく単一の文字列として扱います。

次のように、IN句の単一引用符を取り除きます。

"select * from info WHERE `id` IN ($ids)"

また、SQLインジェクション攻撃をチェックする必要があることを忘れないでください。あなたのコードは現在非常に危険であり、深刻なデータの損失やアクセスの危険にさらされています。誰かが次のURLを使用してWebページを呼び出し、コードが1つのクエリで複数のステートメントを実行することを許可した場合に何が起こるか考えてください。

http://www.example.com/myfile.php?theurl=1);delete from info;-- 
36
Jeremy Smyth

FIND_IN_SET()関数を試すこともできます

$SQL = "select * from info WHERE FIND_IN_SET(`id`, '$ids')"

[〜#〜]または[〜#〜]

$SQL = "select * from info WHERE `id` IN ($ids)"
3
Saharsh Shah