我正在尝试搜索某个人名称的搜索结果,然后是每个搜索对应每个字段“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;
?>
答案 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