PHP从数组生成sql where子句

时间:2013-12-06 11:07:54

标签: php mysql

我想在我的php类中创建一个来自数组的where子句,其中定义了搜索字段。

$search = array('brand' => 'something', 'model' => 'something');
$myclass->testarr($search);

CLASS

public function testarr($search){

    if (!empty($search)){

        foreach ($search as $key => $value) {

            $where = $key . " = " . $value;
        }

    $clause = !empty($where) ? 'WHERE' : '';

    $result = $this->db->mysqli->query
    ("SELECT * FROM tb1 $clause $where");

    }

}

我的问题是通过输入后缀AND来管理具有多个字段的子句。我怎么能这样做?感谢

2 个答案:

答案 0 :(得分:3)

我建议这样做:

$where = array();
if (!empty($search) && is_array($search)) {
    foreach ($search as $key => $value) {
        $where[] = $key . " = " . $value;
    }
}
if (!empty($where))
    $query = sprintf('SELECT * FROM tb1 WHERE %s', implode('AND ', $where));
else
    $query = 'SELECT * FROM tb1';

使用implode可以让事情变得更轻松。

请注意逃避问题,因为您的代码容易出现安全问题。

答案 1 :(得分:1)

您的代码存在一个缺陷:$where = $key . " = " . $value;将在每次迭代中覆盖$where,您需要使用.=进行连接。那么这可以完成,例如以下方式

$where = "";
foreach ($search as $key=>$value) {
    if (!empty($where)) $where .= " AND ";
    $where .= $key . " = " . $value;
}
$clause = !empty($where) ? 'WHERE '.$where : '';

这将在每个条件之前添加AND,从第二个开始(因为第一个if将失败)。

我建议研究prepared statements,这些将使您的代码更加安全,一旦您理解了这个概念,它们就变得非常容易处理(imo)。因为如果这是您目前的大多数代码,那么您很容易受到SQL注入的攻击。<​​/ p>