6

我正在尝试在数据库中查询“product_id”包含在产品 ID 数组中的记录。

该数组是多选输入 ( <select>) 的发布结果,如下所示:

$clients = 
  Array ( 
    [0] => 80000016-1302638679
    [1] => 8000003B-1329924004
  )

我想将该数组传递给 SQL 语句的“IN”子句,例如:

$sql = "SELECT * FROM sales WHERE product_id IN (".$clients.")";

...但这不起作用(错误:)Message: Array to string conversion

一些帖子建议使用此函数以适合 SQL 的方式格式化数组:

function format_array($array){
    return implode(', ', $array);
  }
}

如 ...

$sql = "SELECT * FROM sales WHERE product_id IN (".format_array($clients).")";

这将导致此查询:

SELECT * FROM sales WHERE product_id IN (80000016-1302638679, 8000003B-132992400)

...和这个错误:

Unknown column '8000003B' in 'where clause'

我究竟做错了什么?任何帮助是极大的赞赏!如果需要,我可以澄清这个问题:)

4

7 回答 7

7

试试这个把你的 id 放在引号中:

function format_array($array){
    return "'" . implode("', '", $array) . "'";
  }
}

正如 cwallenpoole 指出的那样,如果您还没有转义字符串,则应该转义该字符串。不转义字符串是非常危险的,特别是如果您有一个公共应用程序。

于 2013-08-06T05:12:26.580 回答
7

有一个更好的方法

您在评论中提到您正在使用 CodeIgniter。where_in除非您正在做一些非常复杂的事情,否则没有任何实际理由应该在您内置后构建自己的自制查询。

如果这不起作用,那么有很好的 ol'fashed escape


好的,所以,你有大多数人说你需要引用这些项目并给你这个:

function createInClause($arr)
{
    return '\'' . implode( '\', \'', $arr ) . '\'';
}

但如果您有可能输入有问题的输入(例如'); DROP TABLE STUDENTS; --. 为了防止这种情况发生,您需要确保检查SQL 注入:

function createInClause($arr)
{
    $tmp = array();
    foreach($arr as $item)
    {
        // this line makes sure you don't risk a sql injection attack
        // $connection is your current connection
        $tmp[] = mysqli_escape_string($connection, $item);
    }
    return '\'' . implode( '\', \'', $tmp ) . '\'';
}
于 2013-08-06T05:27:58.833 回答
2

你需要加80000016-1302638679引号。否则它假设你正在做减法。

return "'".implode("', '", $array)."'";
于 2013-08-06T05:12:33.093 回答
2

使用此功能

function format_array($array){
    return implode("','", $array);
  }
}

而这个查询

$sql = "SELECT * FROM sales WHERE product_id IN ('".$clients."')";
于 2013-08-06T05:13:44.203 回答
1

您需要将它们放在引号中,例如

 SELECT * FROM sales WHERE product_id IN ('80000016-1302638679', '8000003B-132992400') 
于 2013-08-06T05:12:22.300 回答
1

您需要将您的项目用引号括起来。这是一个快速修复:

$clientIds = "";
foreach ($clients as $client) {
  $clientIds .= ($clientIds == "" ? "" : ", ") . "'".mysqli_escape_string($client)."'";
}

$sql = "SELECT * FROM sales WHERE product_id IN (".$clientIds.")";
于 2013-08-06T05:14:59.227 回答
0

将值放在引号下,如下所示:

 SELECT * FROM sales WHERE product_id IN ('80000016-1302638679', '8000003B-132992400')
于 2013-08-06T05:13:01.613 回答