我正在尝试编写一个查询数据库的函数,结果取决于传递的内容。 到目前为止,我有以下内容,但我不禁想到有更简洁的方法来实现这一目标。
此外,如果我使用值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);
}
答案 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)
当然有。
当您尝试创建通用查询函数/方法时,这些是您首先要问自己的问题。
这是一个简单的例子;
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);
}