Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP内爆数组以在条件中生成mysql_Php_Mysql_Zend Framework_Zend Db - Fatal编程技术网

PHP内爆数组以在条件中生成mysql

PHP内爆数组以在条件中生成mysql,php,mysql,zend-framework,zend-db,Php,Mysql,Zend Framework,Zend Db,我的函数如下所示: public function foo ($cities = array('anaheim', 'baker', 'colfax') ) { $db = global instance of Zend_Db_Adapter_Pdo_Mysql... $query = 'SELECT name FROM user WHERE city IN ('.implode(',',$cities).')'; $result = $db->fetchAll(

我的函数如下所示:

public function foo ($cities = array('anaheim', 'baker', 'colfax') )
{
    $db = global instance of Zend_Db_Adapter_Pdo_Mysql...

    $query = 'SELECT name FROM user WHERE city IN ('.implode(',',$cities).')';
    $result = $db->fetchAll( $query );
}
在有人将$cities作为空数组传递之前,这一切都很正常

为了防止此错误,我一直在按如下方式打破查询的逻辑:

$query = 'SELECT name FROM user';
if (!empty($cities))
{
    $query .= ' WHERE city IN ('.implode(',',$cities).')';
}

但这不是很优雅。我觉得应该有一个更好的方法来过滤列表,但我不知道如何。有什么建议吗?

至少使用
报价
方法

if ($cities) {
    $query .= sprintf('WHERE city IN (%s)', implode(',', array_map(array($db, 'quote'), $cities)));
}   
或者,理想情况下,使用Zend_Db_Select构造查询

$select = $db->select()->from('user', 'name');

if ($cities) {
  foreach ($cities as $city) {
        $select->orWhere('city = ?', $city);
    }
}

如果您最终使用select对象,
->where()
方法将实际为您处理数组。仍然需要检查数组中是否有项,但这使它成为一种更干净的方法

$select = $db->select()->from('user', 'name');

if ($cities) {
    $select->where('city IN (?)', $cities);
}

您知道,从Zend_Db_Adapter::quote的Zend文档 如果数组作为值传递,数组值将被引用 *然后以逗号分隔的字符串返回。“

所以你可以这样做,这也是正确引用的:

if ($cities) $query .= 'WHERE city IN ({$db->quote($cities}) ';

我喜欢单行程序:)

如果用户提交的城市包含
(SQL注入)或逗号,这也会中断。。。您需要将它们包装在
中。
这样做非常好。如果没有城市,你不需要一个
WHERE
子句……在我看来很好,但是你可以使用许多类中的一个来进行准备好的查询。至少,摆脱你的束缚!!除了Pekka提到的问题外,我看不出为什么根据输入在
WHERE
子句上添加标签会不美观。我觉得得到一个毫无意义的WHERE
WHERE
子句更好,它只意味着“所有”。然而,即使对于中的变量count,我仍然更喜欢预先准备好的语句(通常使用
内爆(“,”,数组填充(0,count($args),“?”)
。不,不要使用mysql\u real\u escape\u string。如果$db是Zend\u db的实例,请使用它的方法对查询进行正确编码或构建一个准备好的参数化查询。关于where子句:您真的想要您的方法foo()要做到这两个,选择一些城市和选择所有城市?我个人不喜欢这样,这是两个不同的关注点->两种方法。