Php 具有多个值和多个表的MySQL搜索

Php 具有多个值和多个表的MySQL搜索,php,mysql,sql,Php,Mysql,Sql,我想做一个搜索引擎,任何人都可以在一个地方搜索服务并得到结果,例如有人输入restaurants@LA,结果显示洛杉矶的所有餐馆 我有两个表,其中一个表包含餐厅名称,另一个表包含它们与id相关的位置。在我的SQL中,我使用左连接,但我确实很难编写SQL查询来解决这个问题 public function sec($searchwords){ $searchwords=trim($searchwords); $searchwords=preg_split('/[\s]+/',$searchword

我想做一个搜索引擎,任何人都可以在一个地方搜索服务并得到结果,例如有人输入restaurants@LA,结果显示洛杉矶的所有餐馆

我有两个表,其中一个表包含餐厅名称,另一个表包含它们与id相关的位置。在我的SQL中,我使用左连接,但我确实很难编写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/>";

}

}
}

到目前为止,这段代码工作正常,但并不像我预期的那样,如果提到了位置,它应该返回与搜索输入及其位置相关的结果,但它返回所有与非相关相关的内容。它只是不将其限制在相关的搜索结果或结果。

在创建小提琴方面做得很好,这非常有用。现在,您已经最终证明了查询是有效的,因此问题已经缩小到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,但是您只使用其中的第一个。如果您打算同时添加这两个,那么您需要在中编辑第二个。

除非您提供一些数据或设置SQL FIDLE,否则我们也将非常困难。您正在尝试什么查询?@halfer我已经编辑了我的问题,请查看@my code。您能将其分解为一个输入MySQL客户端的查询吗,那么您可以单独调试SQL?如果你能把它复述出来,这样你就可以把它粘贴到你的问题中,这也会有所帮助-目前,有人不得不猜测你的数据库的格式,创建它,添加测试数据,将你的代码复制到一个web文件夹中,运行它,并进行更改以回答你-这太多的工作了。@halfer感谢你的帮助和指导,通过调试代码,我终于解决了问题。