programing

PHP PDO 준비문 -- MySQL LIKE 쿼리

powerit 2023. 9. 20. 20:47
반응형

PHP PDO 준비문 -- MySQL LIKE 쿼리

저는 php의 PDO 클래스(mysql driver)를 통해 검색을 시도하고 있습니다.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 line이 전부입니다.)

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

등..

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

설명: 준비된 진술서는 단순히 문자열을 교체하는 것이 아닙니다.이들은 쿼리와 완전히 별개로 데이터를 전송합니다.따옴표는 쿼리에 값을 포함하는 경우에만 필요합니다.

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

그럼, 제가 해결했습니다.솔직히 말해서 전 바보예요이것을 보고 좋은 피드백을 주셔서 모두에게 감사드립니다.문제는 테이블 이름의 오타(제가 변경했기 때문에 여기 있는 아무도 제 문제를 처음부터 볼 수 없습니다...)였습니다.하지만 그 제안들로 인해 문제를 찾게 되었습니다. 아담, jkndrkn, troelskn 감사합니다.

기록의 경우 다음 조합이 잘 작동합니다.

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

언급URL : https://stackoverflow.com/questions/1786436/php-pdo-prepared-statement-mysql-like-query

반응형