从数据库中选择给定数组中的id

时间:2013-02-13 14:03:59

标签: php mysql arrays

我正在尝试从mysql数据库中的表中选择元素,其中行的id在给定数组中。

返回值:

<?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));
?>

我无法理解该代码有什么问题。

2 个答案:

答案 0 :(得分:1)

在第一个中,你在与数据库交谈之前使用PHP进行字符串插值;实际上,使用PHP变量生成SQL代码。这就是SQL注入的来源 - 数据库不知道数据和代码之间的区别,因此无法保护您免受“数据”泄漏到“代码”空间的影响。在第二个中,您使用绑定参数,告诉数据库“请处理:ids作为单个值,我将在稍后告诉您其内容。”解决断开连接的简单方法是:

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

查看this教程,了解有关这些要点的更多信息。

答案 1 :(得分: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)