2009-09-29 55 views
0

我试图建立使用PHP和MySQL查询内容的SQL查询,介绍如何使用的变量

$query = "select * from products where product_name = '$item_name'"; 

这个工程时$ ITEM_NAME认为只有一个名字,而是$ ITEM_NAME是数组和基于用户的交互可以包含多个名称,我怎样才能使查询运行多个名称并获取结果行。

在此先感谢

回答

6

这里是你如何可以建立名称的安全列表插入IN子句...

if (is_array($names) && count($names)) 
{ 
    $filter="('".implode("','" array_map('mysql_real_escape_string', $names))."')"; 
    $sql="select * from products where product_name in $filter"; 

    //go fetch the results 
} 
else 
{ 
    //input was empty or not an array - you might want to throw an 
    //an error, or show 'no results' 
} 

array_map在通过mysql_real_escape_string运行每个名称以清理它之后返回名称的输入数组。我们使用这个数组来创建一个好的列表来使用IN子句。

您应该始终确保任何数据(特别是直接来自客户端的数据)在查询中正确转义以防止SQL injection攻击。

+0

+1,最后一个完整的解决方案。 ;-) – 2009-09-29 13:34:07

+0

为了让它更具启发性,我建议使用'else'从而避免意外;-) – 2009-09-29 13:47:24

+0

好点,完成! – 2009-09-29 14:11:05

3
$vals = implode(',',$item_name); 
$query = "select * from products where product_name in (".$vals.");"; 

给一个尝试。

+2

应该是$瓦尔斯= ' “' .implode( ' ”“',$ ITEM_NAME)。”';为了有引用值 – Eineki 2009-09-29 13:31:31

+1

+1,但是,鸽子,是正确的消毒数据将是非常有益的。 – 2009-09-29 13:31:41

+1

这不是一个如何构建查询的好例子 - 对数据进行santizing应该永远不会被事后考虑,甚至从有启发性的例子中删除,以使它们更清晰。 – 2009-09-29 13:42:07

-1
foreach($item_name as $name) { 
$query = "select * from products where product_name = '$name'"; 
//whatever you want to do with the query here 
} 

这样的事情应该这样做。

+1

这是一个效率低下的解决方案,因为它需要数组中每个元素的数据库的往返行程。我的解决方案一举成功。 – inkedmn 2009-09-29 13:30:15

+0

嗯,真的......愚蠢的回答:-p – user97410 2009-09-29 13:43:45

0
$query = "select * from products where product_name in("; 
foreach($item_name as $name) 
{ 
    $query .= "'" . $item_name . "', "; 
} 

$query = substr($query, 0, strlen$query) - 2); 
$query .= ");"; 

第一个答案(由inkedmn)真的是最好的一个,虽然

+0

你有一个很好的机会逃离这里的字符串;-)然后关闭')'。 – 2009-09-29 13:32:38

+0

是的,不是列表中的最佳答案。 – Natrium 2009-09-29 13:34:44

-1

基于inkedmn的回应(这并没有引述的项目名称):

$query = 'select * from products where product_name in ("' . implode('", "', $item_name) . '")'; 

尽管你可以使用一个全文搜索更好。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

+0

太多双引号 – Natrium 2009-09-29 13:44:42

+0

太多双引号?你什么意思?它会变成这样:'select * from product_name in(“shoes”,“shirts”,“hats”)' – voidstate 2009-09-29 14:38:06