我正在尝试编写一个查询数据库的函数,其结果取决于传递的内容。到目前为止,我有以下几点,但我不禁想有一种更简洁的方法来实现这一点。
此外,如果我使用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);
}发布于 2011-05-05 20:00:37
看看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 .= ')';发布于 2011-05-05 20:15:00
当然有。
当您尝试创建通用查询函数/方法时,这些是您必须问自己的第一个问题。
下面是一个简单的例子;
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。你可以这样使用它;
array("username" => "admin");这里您可以使用一些附加的regex;数组(“!username”=> "LIKE!admin");
因此,当您循环$data以将其放入查询中时,如果您在数组键!的开头看到它,这可能意味着,不要使用AND,而使用OR。
如果你在数组值的开头看到LIKE!这样使用它;
WHERE username LIKE 'admin'$order
这一点也很明显。
$pagination
array(100 => 0)数组键为,数组值为offset。
相信我,你想做这样的事情是为了让你的生活变得轻松。
当然,我会建议您使用PHP5.3的静态特性并创建一个databaseQuery类。这样一来,您一开始就不需要输入$tableName,并且更容易使用OOP。
简单来说,你的想象力是有限的(:
我希望这能帮到你。
发布于 2011-05-06 14:40:45
在上面的示例之后,我需要一些更具体的东西来执行我想要执行的查询。
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);
}https://stackoverflow.com/questions/5897242
复制相似问题