Я пытаюсь выполнить поиск по PDO-классу php (драйвер 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 clause & prep-> execute lines все это меняет):
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));
Ну, я решил это. И, честно говоря, я идиот … Спасибо всем за то, что вы заметили это и дали хорошие отзывы. Проблема была опечаткой в имени таблицы (которую я изменил, поэтому никто здесь не сможет увидеть мою проблему, чтобы начать с …). Предложения действительно заставили меня найти проблему, однако, так что спасибо adam, jkndrkn и troelskn.
Для записи следующая комбинация работает хорошо:
WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(\'%\', ?, \'%\') $ret = $prep->execute(array($searchTerm));