1

我正在尝试从 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));
?>

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

4

2 回答 2

1

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

$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 回答