2013-02-13 75 views
1

我试图从mysql数据库中的表中选择元素,其中行的id在给定数组中。从数据库中选择给定数组中的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

什么是:ids?在你的第二个查询........它会给你1,2,3,4输出当你执行查询 – 2013-02-13 14:06:06

+0

尝试更改$ ids从字符串到数组像这样$ ids = array('1',' 2','3','4') – Ateszki 2013-02-13 14:08:16

+0

你的第一个代码应该工作。问一个明显的问题,表t1是否包含一个列'罐''?此外,不是它影响它,但$ ID实际上是一个字符串不是数组。 – KevInSol 2013-02-13 14:11:51

回答

1

在第一个问题中,您正在使用PHP在与d交谈之前进行字符串插值atabase;实际上,使用PHP变量生成SQL代码。这是SQL注入的来源 - 数据库不知道数据和代码之间的区别,所以它不能保护您免受泄露到“代码”空间中的“数据”的侵害。第二,你使用绑定参数,告诉数据库“请处理:ids作为单值,其内容我会在稍后告诉你。”一个简单的方法来解决断开是这样的:

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

退房this教程以获得更多关于这些点。

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)

+0

有没有办法用params绑定打印PDO对象? – 2013-02-13 14:18:02

+0

结帐这个 - http://php.net/manual/en/pdostatement.debugdumpparams.php – 2013-02-13 14:20:04

+0

在这个用例中准备语句的一个要点是,从来没有一个SQL包含内联值。 'select * from foo where bar =:baz'是数据库引擎的内容;它在数据库服务器上作为语句分配;随后,该语句被重新调用,并提供该值。当“代码”被发送时,不知道“数据”是什么,它阻止后者被视为前者(通常被称为“SQL注入”的问题)。 – TML 2013-02-13 14:28:06