我正在尝试从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));
?>
我无法理解该代码有什么问题。
答案 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)