猿问

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

我正在尝试通过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_id

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

等等...


慕田峪7331174
浏览 638回答 3
3回答

富国沪深

$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));错了 您不需要双引号。WHERE hs.hs_text LIKE ":searchTerm"&nbsp;$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));这也是错误的。尝试:$prep = $dbh->prepare($sql);$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));说明:准备好的语句不能简单地进行字符串替换。它们传输的数据与查询完全分开。仅在将值嵌入查询中时才需要引号。

不负相思意

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

一只名叫tom的猫

好吧,我解决了这个问题。坦率地说,我是个白痴...谢谢大家看到这些并给出了很好的反馈。问题是表名中的错字(我更改了,所以这里没有人能看到我的问题开头...)。但是,这些建议确实使我找到了问题,因此,谢谢亚当,jkndrkn和troelskn。作为记录,以下组合效果很好:WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(\'%\', ?, \'%\')$ret = $prep->execute(array($searchTerm));
随时随地看视频慕课网APP
我要回答