用多个过滤器查询DB的功能

时间:2011-05-05 11:55:15

标签: php

我正在尝试编写一个查询数据库的函数,结果取决于传递的内容。 到目前为止,我有以下内容,但我不禁想到有更简洁的方法来实现这一目标。

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

我注意到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);

}

3 个答案:

答案 0 :(得分:0)

查看DataTables如何做到这一点:

$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 .= ')';

答案 1 :(得分:0)

当然有。

  • 您希望sql查询返回什么? (单条记录,多条记录(类似数组),所有数据)
  • 您要选择哪些单元格?
  • 您要查询的表名是什么?
  • 数据库表格单元名称和位置在哪里?要进行查询的值?
  • 您如何订购退回的结果?
  • 如何限制(分页)结果?

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

这是一个简单的例子;

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

现在上面的代码有一些功能;

$表名

明显(:

$型

数组 =帮助您使用数组进行查询并将结果作为数组返回。 $ data 必须是数组。

id =帮助您使用特定ID执行查询。 $ data 必须为整数。

全部 =返回所有数据。您只需要使用 $ type = all和 $ select =“*”(或您要选择的任何单元格)

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

$选择

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

$数据

这可以是数组或整数,具体取决于$ type。 你可以这样使用它;

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

在这里你可以使用一些额外的正则表达式; array(“!username”=&gt;“LIKE!admin”);

因此当您循环$ data以将其放入查询中时,如果您在数组键的开头看到,这可能意味着,请勿使用AND,请使用OR。

如果你看到数组值LIKE的开头!用这种方式;

WHERE username LIKE 'admin'

$顺序

这也很明显。

$分页

array(100 => 0)数组键限制,数组值偏移

相信我,你想做这样的事情,以使你的生活轻松。

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

只是你的想象力是有限的(:

我希望这会有所帮助。

答案 2 :(得分:0)

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

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);
 }