功能,使用多个过滤器查询数据库


function to query DB with multiple filters

我试图编写查询数据库的单个函数,其结果取决于传递的内容。到目前为止,我已经有了以下内容,但我忍不住想,应该有一种更简洁的方法来实现这一点。

此外,如果我使用0的值返回所有结果-就像0false的值,即使我将其作为字符串传递。

我注意到在WordPress字符串被传递到函数(例如cat=1&posts_per_page=5)。我不太明白这是如何工作的,但它看起来是一种更好的做事方式。

感谢您的帮助。

public static function sub_packages($subname_id = false, $region_id = false, $recurrence = false) {
    global $wpdb, tbl_packages;  
    if ( $subname_id ) $subname_id = " `package_subname` = $subname_id";
    if ( $region_id ) $region_id = " `package_region` = $region_id";
    if ( $recurrence ) $recurrence = " `package_recurrence` = $recurrence";
    // one
    if ( $subname_id && !$region_id && !$recurrence )
        $filter = " WHERE $subname_id";
    elseif ( !$subname_id && $region_id && !$recurrence )
        $filter = " WHERE $region_id";
    elseif ( !$subname_id && !$region_id && $recurrence )
        $filter = " WHERE $recurrence";
    // two
    elseif ( $subname_id && $region_id && !$recurrence )
        $filter =  " WHERE $subname_id AND $region_id";
    elseif ( $subname_id && !$region_id && $recurrence )
        $filter =  " WHERE $subname_id AND $recurrence";
    elseif ( !$subname_id && $region_id && $recurrence )
        $filter =  " WHERE $region_id AND $recurrence";
    // three
    elseif ( $subname_id && $region_id && $recurrence )
        $filter =  " WHERE $subname_id AND $region_id AND $recurrence";
    return $wpdb->get_results( "SELECT * FROM ". tbl_packages . $filter, ARRAY_A);
}

查看datatable是如何做到这一点的:

$sWhere = "WHERE (";
for ( $i=0 ; $i<count($aColumns) ; $i++ ) 
{
    $sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
}
$sWhere = substr_replace( $sWhere, "", -3 );
$sWhere .= ')';

当然有。

  • 你想要sql查询返回什么?(单记录,多记录(类似数组),所有数据)
  • 要选择哪些单元格?
  • 要查询的表名是什么?
  • 哪里是DB表单元格名称&值做查询?
  • 如何订购返回的结果?
  • 如何限制(分页)结果?

这些是你在尝试创建通用查询函数/方法时首先要问自己的问题。

下面是一个简单的例子;

function getData ($tableName= "members", $type = "array", $select = "*", $data = NULL, $order = array("id"=>"DESC"), $pagination = array("100"=>NULL)) { }

现在上面的代码有一些特性;

表名

美元

明显(:

$

Array =帮助您对数组进行查询并以数组形式返回结果。$data必须是数组

id =帮助您执行具有特定id的查询。$data必须是整数

all =返回所有数据。你只需要使用$type = all和$select = "*"(或任何你想选择的单元格)

single =当您不知道ID但需要单个结果时。$data必须是数组

选择美元

如果你有一个大的数据库,如果你一直使用*来选择所有你甚至不使用的单元格,这将减慢你的页面速度。如果你想只选择你需要的单元格,你可以使用这个。

$ data

根据$type可以是数组或整数。你可以这样使用它;

array("username" => "admin");

这里你可以使用一些额外的正则表达式;阵列("!username" => "LIKE!admin");

所以当你循环$data把它放在你的查询中,如果你看到在数组键的开始!,这可能意味着,不要使用AND,使用OR。

如果你在数组的开头看到LIKE!

WHERE username LIKE 'admin'

美元订单

这也是显而易见的。

分页美元

array(100 => 0) Array key limit Array value offset

相信我,你想做这样的事情是为了让你的生活更轻松。

当然,我会建议你使用PHP 5.3的静态特性并创建一个databaseQuery类。这样一来,您就不需要首先输入$tableName,并且更容易使用OOP。

你的想象力有限(:

在上面的例子之后,我需要一些更具体的东西来执行我想要执行的查询。

http://professionaldilettante.com/how-to-pass-parameters-as-query-string-to-your-php-functions/2010.11.22以字符串形式解析参数,因此我得出了这个

private function parse_args($args) {
    // error check
    if( !is_string($args) )
        throw new Exception("'n'nfunction parse_args() expects a string, ". gettype($args). " passed'n'n");
    if( strpos($args,"&")  ):
    // if str contains &, assume multiple params
        $parts = explode("&",$args);
        for( $i=0, $len=count($parts); $i<$len; $i++ ):
            $tmp = explode("=",$parts[$i]);
            $parsed[$tmp[0]] = $tmp[1];
        endfor;
    else:
        $tmp = explode("=",$args);
        $parsed[$tmp[0]] = $tmp[1];
    endif;
    return $parsed;
}
 public static function sub_packages($args) {
    global $wpdb, $tbl_packages;
    $args = Packages::parse_args($args);
    // build query.
    $sql = "SELECT * FROM $tbl_packages";
    if ( count($args) > 0 ) {
        $i = 0;
        foreach ( $args as $arg => $value) {
            if ( $i == 0 ) $sql .= " WHERE";
            elseif ( $i != $count ) $sql .= " AND";
            $sql .= " `$arg` = $value";
            $i++;
        }
    }
    return $wpdb->get_results( $sql, ARRAY_A);
 }