0

可能重复:
带有“WHERE…IN”查询的 PDO

在我的搜索表单中,有很多复选框和字段。
一些复选框属于该组。
示例组,城市。
像下面这样查询

SELECT id, city_id, area, city FROM an_objects  
                WHERE livedays > 0 AND type_id = :typeoffer AND rubric_id = :typerelaty 
                AND CASE 
                    WHEN :1r = '' THEN true 
                    ELSE city_id IN (:1r, :2r, :99r, :100r)
                END
                GROUP BY id ORDER BY date ASC

在这个例子中,需要填写4个参数,也就是一百个。
但我想做

SELECT id, city_id, area, city FROM an_objects  
            WHERE livedays > 0 AND type_id = :typeoffer AND rubric_id = :typerelaty 
            AND CASE 
                WHEN :1r = '' THEN true 
                ELSE city_id IN (:arrCity)
            END
            GROUP BY id ORDER BY date ASC

字符串形式如此

if(isset($param['city']))
{
    for($i=0; $i < 9; $i++)
    {
        if(isset($param['city'][$i]))
            $raion .= $param['city'][$i] . ",";
        else
            break;
    }
    $arrCity = substr($city, 0, -1);        
}

我们将以下
(:arrCity) 替换为 ("1,2,3,4,5,6")。 这是作为单个字符串获得的,但是如何执行以下操作
(:arrCity)(1,2,3,4,5,6)

4

1 回答 1

1

这是一个有趣的问题,它清楚地证明了 PDO 比旧的 mysql_* 使用起来更麻烦,并且没有为广泛的现实生活查询提供良好的安全性。

为了使这些任务更容易,数据库访问库应该允许两个主要的事情:

  • 要在内部处理的复杂数据类型的附加占位符。
  • 在任意查询部分处理占位符,而不是仅在整个查询中处理

并且 PDO 都失败了。
因此,程序员必须自己照顾它们。

因此,通过使用实现这些原则的库,代码将既短又安全:

if(isset($param['city']))
{
    $raion = $db->parse("AND (city_id IN (?a)", $param['city']);
}
//  you can add any number of such conditions making your search flexible
// the only thing you have to keep in mind: add a value ONLY via placeholder

$sql = "SELECT id, city_id, area, city FROM an_objects  
       WHERE livedays > 0 AND type_id = ?i AND rubric_id = ?i
       ?p
       GROUP BY id ORDER BY date ASC";
$data = $db->getAll($sql, $typeoffer, $typerelaty, $raion);

是的,就这几行简洁易读的代码!

如果我误解了您的条件 - 请随时询问更多详细信息,提供构建查询的确切逻辑。我很乐意根据您的条件编写确切的代码,只是为了展示我正在谈论的库的强大功能。

于 2013-02-03T06:28:31.020 回答