mysql查询生成?
Posted
技术标签:
【中文标题】mysql查询生成?【英文标题】:Mysql query generation? 【发布时间】:2011-01-05 14:59:00 【问题描述】:我有几个不同的过滤器和搜索功能,我需要为其生成 mysql 查询。我想知道是否有可以使用的类或库。
例如,如果他们在那里输入带有日期的电子邮件,我需要在 sql 查询中间添加WHERE email='email'
AND date`='date'。但如果他们也进入了一个城市,那么我需要添加它。
我在想把我需要搜索的所有东西放在一个数组中,然后用AND
将它内爆?谁有更好的建议?
【问题讨论】:
这可行。您可以使用 key=>value 来建立 field=>searchcriteria。不确定从长远来看你会从中获得多少好处......随着更复杂的需求的出现(比如做 LIKE 或比较),维护起来可能会很烦人。可能有人可以指向一个内置的库。 SQL Builder for php, with JOIN support?的可能重复 【参考方案1】:我使用Zend_Db 来处理这类事情。快速示例,使用Zend_Db_Select:
$select = $db->select()->from("users");
if($email)
$select->where('email = ?', $email);
if($date)
$select->where('date = ?', $date);
// etc
// show query
// will output something like SELECT * from `users` WHERE email = 'email' AND date = 'date'
print_r($select->__toString());
// execute
$results = $db->fetchAll($select);
print_r($results);
【讨论】:
+1 表示 Zend_Db,Zend_Db_Select 可以在没有完整 Zend 框架的情况下使用,并且是一个出色的查询构建器。【参考方案2】:我经常使用数组解决方案,因为它是查询条件最灵活的解决方案
$a[] = "email = 'email'";
$a[] = "firstname LIKE '%firstname%'";
$a[] = "date BETWEEN 'date_a' AND 'date_d'";
$a[] = "id > 123";
$query = ... " WHERE " implode(' AND ', $a);
【讨论】:
【参考方案3】:我会去添加所有给定的数据到这样的数组中:
$args = array(
'email' => 'test@test.com',
'date' => '2011-01-05',
'city' => 'MyTown'
);
然后只通过它添加键和值到搜索中的foreach
$SQL = "WHERE ";
foreach($args as $key => $val)
$SQL .= $key."='".$val."'";
//And add the AND or OR where needed
【讨论】:
【参考方案4】:常见的方法是创建一个包含不同查询部分的数组,然后根据您需要过滤的内容向它们添加元素。例如:
<?php
$sql_parts = array(
'select' => array(),
'from' => array(),
'where' => array()
);
if ($filter_by_name != '')
$sql_parts['select'][] = 'u.*';
$sql_parts['from'][] = 'users AS u';
$sql_parts['where'][] = "u.name = '".mysql_real_escape_string($filter_by_name)."'";
if ($filter_by_surname != '')
$sql_parts['select'][] = 'u.*';
$sql_parts['from'][] = 'users AS u';
$sql_parts['where'][] = "u.surname = '".mysql_real_escape_string($filter_by_surname)."'";
//filter by data from another table
if ($filter_by_city_name != '')
$sql_parts['select'][] = 'u.*, c.*';
$sql_parts['from'][] = 'cities AS c';
$sql_parts['from'][] = 'users AS u';
$sql_parts['where'][] = "c.cityname = '".mysql_real_escape_string($filter_by_city_name)."'";
$sql_parts['where'][] = "c.id = u.cityid";
$sql_parts['select'] = array_unique($sql_parts['select']);
$sql_parts['from'] = array_unique($sql_parts['from']);
$sql_parts['where'] = array_unique($sql_parts['where']);
$sql_query = "SELECT ".implode(", ", $sql_parts['select']).
"FROM ".implode(", ", $sql_parts['from']).
"WHERE ".implode(" AND ", $sql_parts['where']);
?>
【讨论】:
以上是关于mysql查询生成?的主要内容,如果未能解决你的问题,请参考以下文章