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()要做到这两个,选择一些城市和选择所有城市?我个人不喜欢这样,这是两个不同的关注点->两种方法。