반응형
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
반응형
'programing' 카테고리의 다른 글
wp-config.php에 기본 인증 키 값을 그대로 둔 경우 해커가 데이터베이스에 액세스할 수 있습니까? (0) | 2023.09.20 |
---|---|
WC_상품_have_posts()에서 작동하지 않는 쿼리 (0) | 2023.09.20 |
libc static과 다른 라이브러리를 동적으로 연결하는 GCC, 재검토? (0) | 2023.09.20 |
생성된 XML에서 'standalone="yes" 제거 (0) | 2023.09.20 |
대용량 파일을 처리할 수 있는 Lightweight XML Viewer (0) | 2023.09.20 |