为了账号安全,请及时绑定邮箱和手机立即绑定

PHP PDO准备的语句-MySQL LIKE查询

PHP PDO准备的语句-MySQL LIKE查询

慕田峪7331174 2019-11-02 10:33:05
我正在尝试通过php的PDO类(mysql驱动程序)进行搜索。我在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_idWHERE     hs.hs_text LIKE "%searchTerm%"LIMIT 25;不管我使用什么搜索词,它都像一个符咒。但是,当我转到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_idWHERE     hs.hs_text LIKE :searchTermLIMIT 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-> execute行已全部更改):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.'%'));等等...
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

$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.'%'));

说明:准备好的语句不能简单地进行字符串替换。它们传输的数据与查询完全分开。仅在将值嵌入查询中时才需要引号。


查看完整回答
反对 回复 2019-11-02
?
不负相思意

TA贡献1777条经验 获得超10个赞

$prep = $dbh->prepare($sql);

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


查看完整回答
反对 回复 2019-11-02
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

好吧,我解决了这个问题。坦率地说,我是个白痴...谢谢大家看到这些并给出了很好的反馈。问题是表名中的错字(我更改了,所以这里没有人能看到我的问题开头...)。但是,这些建议确实使我找到了问题,因此,谢谢亚当,jkndrkn和troelskn。


作为记录,以下组合效果很好:


WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(\'%\', ?, \'%\')

$ret = $prep->execute(array($searchTerm));


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 637 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信