使用Where子句查询数据库取决于数组值

时间:2014-06-06 12:34:29

标签: php mysql sql where-clause

您必须在WordPress中看到过这种情况,如何将参数传递给函数,并根据您传递的参数查询数据库。如果参数未通过。它将航空回归到默认参数。我想在自定义函数中完成同样的事情。

 function get_module( $args = NULL ){
    $defaults = array(
        "module_id" => NULL,
        "module_slug" => NULL,
        "module_parent" => NULL,
        "module_status" => "publish"
    );
    global $db;
    global $table_prefix;
    $sql = "SELECT * FROM $table_prefix" . "modules";
    $query = $db->SELECT($sql);
    return $db->FETCH_OBJECT();
}

1 个答案:

答案 0 :(得分:0)

好的,让我们一步一步来做。

  

如果参数未通过。它将航海回归默认参数

你已经拥有一个$defaults数组,现在的问题是如何获得它"在一起"使用$args - 解决方案正在使用array_merge()。如果您合并了$args$defaults,则需要注意$args'元素覆盖$defaults - 而不是相反。 (fiddle

$options = array_merge($defaults, $args) // good
$options = array_merge($args, $defaults) // bad

现在的问题是:您是否要在数据库中查询值为NULL的条目?我不这么认为,array_filter()现在派上用场删除那些不需要的元素。这个小片段应该可以解决这个问题:

function notNull($value) {
    return $value !== NULL;
}
$options = array_filter($options, "notNull");

现在你有一个数组$options,应该在查询中使用。为此,您需要遍历数组,因为您需要每个项目的键和值。执行此操作时,您可以构建WHERE部分。

$where = "";
if (count($options) > 0) {
    foreach ($options as $key=>$value) {
        if (!empty($where))
            $where .= " AND ";
        else
            $where = " WHERE ";

        $where .= sprintf("`%s` = `%s`", $key, $value);
    }
}

由于sprintf(),这会自动将值转换为字符串,您可以添加额外的检查(我认为不应该在MySQL中引用数值)。


您还可以使用将在循环中创建的预准备语句,然后设置值。