1

行のIDが指定された配列にあるmysqlデータベースのテーブルから要素を選択しようとしています。

これは値を返します:

<?php
     $ids = '1,2,3,4';
     $DBH = ....
     $getID = $DBH->prepare("SELECT * FROM t1 WHERE id IN ($ids)");
     $getID->execute();
?>

これは何も返しません:

<?php
     $ids = '1,2,3,4';
     $DBH = ....
     $getID = $DBH->prepare("SELECT * FROM t1 WHERE id IN (:ids)");
     $getID->execute(array(':ids'=>$ids));
?>

そのコードの何が問題なのか理解できません。

4

2 に答える 2

1

最初の例では、データベースと通信する前にPHPを使用して文字列補間を行っています。実際には、PHP変数を使用してSQLコードを生成します。これがSQLインジェクションの出所です。データベースはデータとコードの違いを認識していないため、「データ」が「コード」スペースに漏れるのを防ぐことはできません。2番目の例では、バインドされたパラメーターを使用して、データベースに「:idsを単一の値として処理してください。その内容については後で説明します」と伝えています。切断を解決する簡単な方法は次のようなものです。

$sql = 'SELECT * from t1 where id in (' . str_repeat('?', count($ids)) . ')';
$stmt = $pdo->prepare($sql);
$stmt->execute($ids);

これらの点の詳細については、このチュートリアルを確認してください。

于 2013-02-13T14:21:40.063 に答える
0

PDO を使用していると仮定して、以下を試してください。

<?php
     $ids = '1,2,3,4';
     $DBH = ....
     $getID = $DBH->prepare("SELECT * FROM t1 WHERE id IN (:ids)");
     $getID->bindParam(":ids", $ids, PDO::PARAM_INT);
     $getID->execute();
?>

元のクエリが実行されると、PDO は入力をエスケープするため、クエリは次のようになります。

SELECT * FROM t1 WHERE id IN ("1,2,3,4")

PDOに整数としてバインドするように指示すると、実行されます

SELECT * FROM t1 WHERE id IN (1,2,3,4)

于 2013-02-13T14:14:29.680 に答える