使用php进行mysql多次查询

时间:2009-08-08 00:16:57

标签: php mysql

我正在尝试搜索某个人名称的搜索结果,然后是每个搜索对应每个字段“first”和“last”的名字和姓氏。

但需要留出空间如果有人搜索第一个最后一个midle名称,如= $ who = James David Smith,它会爆炸它并在第一列和最后一列中搜索每个名称。如果用户首先输入名称姓氏或添加中间名。

这是我到目前为止所得到的但是我卡住了。救命。请。

<?

$search = explode(' ', $who);

$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10";

$q="select * from users where (first IN('%$search[]%') or last IN('%$search[]%') or full_name LIKE '%".$get['who']."%') AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') order by province";        

$rows=get_recordset($q);

if(count($rows)){
    foreach($rows as $row){

echo $q;

?>

2 个答案:

答案 0 :(得分:2)

我不确定我有你,但如果你的意思是:

当你有3个名字时 - 检查所有三个字段的所有名称(first,last,fullname)。

当你只有2个名字时 - 检查第一个字段的第一个名字和最后一个字段的姓氏

然后这应该完成它:

$search = explode(' ', $who);
if (count($search) >2) { // in case we do got a middle name - 
    $whereNameStringsArr = array();
    foreach ($search as $val) {
        $whereNameStringsArr[] =  " first LIKE '%$val%' 
                        OR last LIKE '%$val%' 
                        OR full_name LIKE '%$val%' ";
    }
    $whereNameClause = implode(" OR ",$whereNameStringsArr);
} else { // in case we don't got a middle name
    $whereNameClause =  " first LIKE '%{$search[0]}%' 
                OR last LIKE '%{$search[1]}%' ";
}
$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10";
$q="select * from users where  ($whereNameClause) 
                AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') 
                order by province
                $limit";        

$rows=get_recordset($q);
....

当然 - 确保您验证从用户输入中获得的所有数据

答案 1 :(得分:0)

那么为什么不进行模糊搜索呢?当您爆炸数据时,请执行以下操作:

$name = $_POST['name'] // John Michael Smith

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael

现在您只需运行mysql查询,但将其设置为使用LOCATE查找包含上述值(子字符串搜索)的任何内容:

$results = mysql_query("SELECT * FROM names 
                WHERE LOCATE(firstname, '$first_name') > 0 OR 
                      LOCATE(lastname, '$last_name')   > 0
                ORDER BY lastname

我假设您知道如何处理结果。


快速更新,如果您担心用户输入姓氏名字中,或者您拥有什么,您可以随时使用上述内容,但对整个字符串进行定位:

$results = mysql_query("SELECT * FROM names 
                WHERE LOCATE(firstname, '$name') > 0 OR 
                      LOCATE(lastname, '$name')   > 0
                ORDER BY lastname

这将检查任何字符串的任何实例的两列。您应该(在消毒字符串之后,正如已经正确建议的那样)也删除任何逗号(但不是连字符),以防有人进入最后,第一或你有什么。用空格替换它们,然后将所有多个空格减少到一个空格,以确保双倍。


很抱歉。这是分割名称的方法(通过空白)。我的substr语法存在问题:

 $name = $_POST['name'] // John Michael Smith

 $first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael

 $last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael