我想制作一个搜索引擎,任何人都可以在某个地方搜索服务并获得结果,例如某人输入“restaurant @LA”,结果显示洛杉矶的所有餐厅。
我有两张桌子拿着餐馆名字,另一张桌子拿着他们与身份证相关的位置。在我的SQL中,我正在使用LEFT JOIN
,但我真的很难编写SQL查询来解决这个问题。
public function sec($searchwords){
$searchwords=trim($searchwords);
$searchwords=preg_split('/[\s]+/',$searchwords);
//after removing whitespaces covert d array back to string
$searchwordz=false;
foreach($searchwords as $searchword){
$searchwordz .= $searchword;
}
//separate d strings from location
$location=false;
preg_match("/@[a-zA-Z0-9]+/", $searchwordz, $matches);
foreach($matches as $values){
$location.=substr($values, 1);
}
//remove location from the rest of the string
$keywords=preg_replace("/@[a-zA-Z0-9]+/",'',$searchwords);
$returned_result=array();
$where="";
$where1="";
$total_keywords=count($keywords);
foreach($keywords as $key =>$keyword){
$where.="place.place_name LIKE :place_name AND location.state LIKE :state";
$where1.="place.description LIKE :description AND location.state LIKE :state";
if($key != ($total_keywords - 1)){
$where.=" AND ";
$where1.=" AND ";
}
}
//echo $where;
$sbl=$dabase->prepare("SELECT place.place_name, place.description, location.location FROM place LEFT JOIN location ON place.mid=member.mid WHERE $where ORDER BY place.time");
$sbl->execute(array(
':place_name' => '%'.$keyword.'%',
':state' => '%'.$location.'%'
));
//echo $sbl;
if($sbl->rowCount() == 0){
echo "No item found";
}
else{
while($data=$sbl->fetch()){
echo $data['place_name']."<br/>";
echo $data['description']."<br/>";
}
}
}
到目前为止,这段代码有效但不像我预期的那样,它应该返回与搜索输入相关的结果及其位置(如果提到位置但是它返回所有相关的不相关的内容)它不会将其限制为相关搜索结果或结果。
答案 0 :(得分:1)
创建小提琴做得很好,这非常有用。您现在已经确定您的查询有效,因此问题已缩小到您的PHP代码。回想起来,您可以在phpMyAdmin或MySQL控制台客户端中完成此操作,但您已经学到了非常有用的技能,因此几乎没有浪费时间。
要继续调试,我首先要更改此代码:
$sbl=$dabase->prepare("SELECT place.place_name, place.description, location.location FROM place LEFT JOIN location ON place.mid=member.mid WHERE $where ORDER BY place.time");
将其更改为:
$sql = "
SELECT place.place_name, place.description, location.location
FROM place
LEFT JOIN location ON place.mid=member.mid
WHERE $where
ORDER BY place.time
";
$sbl=$dabase->prepare($sql);
echo $sql;
这将做同样的事情,但它会打印出你正在运行的SQL。您会注意到我已经格式化了查询,因此它在您的IDE(以及此站点上)中更具可读性。如果可以的话,我建议写这样的所有查询。
我的猜测是,您认为已经提交给查询的条款尚未添加。进行此更改并找出答案。
编辑:另外,您正在编译两个WHERE
子句$where
和$where1
,但之后您只使用其中的第一个。如果您打算添加两者,那么您需要编辑第二个。