首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个过滤器查询数据库的函数

使用多个过滤器查询数据库的函数
EN

Stack Overflow用户
提问于 2011-05-05 19:55:15
回答 3查看 224关注 0票数 0

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

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

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

感谢您的帮助。

代码语言:javascript
复制
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);

}
EN

回答 3

Stack Overflow用户

发布于 2011-05-05 20:00:37

看看DataTables是如何做到这一点的:

代码语言:javascript
复制
$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 .= ')';
票数 0
EN

Stack Overflow用户

发布于 2011-05-05 20:15:00

当然有。

  • 您希望sql查询返回什么?(单记录,多记录(类似数组),所有数据)
  • 要选择的单元格?
  • 要在其上执行查询的表名称?
  • 要查询的数据库表格单元格名称和值在哪里?
  • 如何对返回的结果进行排序?
  • 如何限制(分页)结果?

当您尝试创建通用查询函数/方法时,这些是您必须问自己的第一个问题。

下面是一个简单的例子;

代码语言:javascript
复制
function getData ($tableName= "members", $type = "array", $select = "*", $data = NULL, $order = array("id"=>"DESC"), $pagination = array("100"=>NULL)) { }

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

$tableName

显而易见(:

$type

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

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

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

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

$select

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

$data

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

代码语言:javascript
复制
array("username" => "admin");

这里您可以使用一些附加的regex;数组(“!username”=> "LIKE!admin");

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

如果你在数组值的开头看到LIKE!这样使用它;

代码语言:javascript
复制
WHERE username LIKE 'admin'

$order

这一点也很明显。

$pagination

array(100 => 0)数组键为,数组值为offset

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

当然,我会建议您使用PHP5.3的静态特性并创建一个databaseQuery类。这样一来,您一开始就不需要输入$tableName,并且更容易使用OOP。

简单来说,你的想象力是有限的(:

我希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2011-05-06 14:40:45

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

http://professionaldilettante.com/how-to-pass-parameters-as-query-string-to-your-php-functions/2010.11.22通过将参数解析为字符串来运行,因此我想出了以下方法

代码语言:javascript
复制
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);
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5897242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档