PHP PDO编写语句 – mysql LIKE查询

这是我第一次堆栈溢出,但我发现现有的知识体系非常有帮助。 无论如何,这是我的问题:

我试图通过php的PDO类(mysql驱动程序)进行search。 我有以下查询使用MySQL客户端(表名更改为保护无辜):

SELECT hs.hs_pk, hs.hs_text, hs.hs_did, hd.hd_did, hd.hd_text, hv.hv_text, hc.hc_text FROM hs LEFT JOIN hd ON hs.hs_did = hd.hd_did LEFT JOIN hd ON hd.hd_vid = hv.hv_id LEFT JOIN hc ON hd.hd_pclass = hc.hc_id WHERE hs.hs_text LIKE "%searchTerm%" LIMIT 25; 

无论我使用的search词是什么,这都像一个魅力。 但是,当我移动到PHP,我不能得到它返回任何东西。 我已经尝试了几种不同的语法,似乎合乎逻辑的工作,但没有任何我已经尝试的作品。 这里是我现有的代码:

 $handle = fopen('/foo/bar/test.log', 'w+'); fwrite($handle, "doSearch, with search term: $searchTerm\n"); $sql = 'SELECT hs.hs_pk, hs.hs_text, hs.hs_did, hd.hd_did, hd.hd_text, hv.hv_text, hc.hc_text FROM hs LEFT JOIN hd ON hs.hs_did = hd.hd_did LEFT JOIN hd ON hd.hd_vid = hv.hv_id LEFT JOIN hc ON hd.hd_pclass = hc.hc_id WHERE hs.hs_text LIKE :searchTerm LIMIT 25'; try { $dbh = new PDO('mysql:host=localhost;dbname=awdb', "user", "password"); fwrite($handle, "connected to DB\n"); $prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"')); while ($row = $prep->fetch(PDO::FETCH_ASSOC)) { $i++; $result[$i]['subText'] = $row['hs_pk']; $result[$i]['subText'] = $row['hs_text']; $result[$i]['subDid'] = $row['hs_did']; $result[$i]['devDid'] = $row['hd_did']; $result[$i]['devText'] = $row['hd_text']; $result[$i]['vendorText'] = $row['hv_text']; $result[$i]['classText'] = $row['hc_text']; } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } 

我也尝试了以下(SQL WHERE子句和prep->执行行都是这样改变):

 WHERE hs.hs_text LIKE CONCAT(\'%\', ?, \'%\') $ret = $prep->execute(array($searchTerm)); WHERE hs.hs_text LIKE "%:searchTerm%" $ret = $prep->execute(array(':searchTerm' => $searchTerm)); WHERE hs.hs_text LIKE ":searchTerm" $ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%')); 

等等…

预先感谢您,我希望代码不要马虎

-Tim

 $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"')); 

这是错误的。 你不需要双引号。

 WHERE hs.hs_text LIKE ":searchTerm" $ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%')); 

这也是错误的。 试试:

 $prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%')); 

说明:准备好的语句不会简单地进行stringreplace。 它们完全独立于查询传输数据。 仅在将值embedded到查询中时才需要引号。

 $prep = $dbh->prepare($sql); $ret = $prep->execute(array('searchTerm' => $searchTerm)); 

那我解决了这个问题 坦率地说,我是一个白痴…谢谢大家看到这个,给予很好的反馈。 问题是一个表名(我改变了,所以没有人能够看到我的问题开始…)的拼写错误。 然而,这些build议让我发现了这个问题,所以,非常感谢adam,jkndrkn和troelskn。

为了logging,以下组合运作良好:

 WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(\'%\', ?, \'%\') $ret = $prep->execute(array($searchTerm));