Intereting Posts
Рекурсивно создавать файлы и папки Ошибка сертификата SSL не может получить сертификат локального эмитента Хранить и отображать результат MySQL в / из массива PHP (PHP) Показывать ссылку ТОЛЬКО в рабочее время? php: избавиться от? p = запрос в URL-адресе? Разбор заголовков электронной почты (похожих на RFC822) работа с потоками ввода-вывода php: // stdin Как сделать флажки HABTM CakePHP по алфавиту сверху вниз в столбцах получение ошибки в отображаемых значениях в Xcode из mysql? Закрытие или создание_функции в PHP Попытка заставить MySQL подключаться через php в JSON, но возвращая ошибки, связанные с MySQL из php-скрипта Проблема с перенаправлением PHP с субдоменом Хорошая практика – вернуть DateTime из PHP в JS При использовании Kohana DB, как избежать дублирования кода при необходимости подсчета для разбивки на страницы? Загрузить – максимальное количество подключений для каждого пользователя?

Готовый отчет PHP PDO – запрос MySQL LIKE

Я пытаюсь выполнить поиск по 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.'%')); 

и т.д…

Solutions Collecting From Web of "Готовый отчет PHP PDO – запрос MySQL LIKE"

 $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));