Я конвертирую код всех моих сайтов с помощью функций mysql_ * в PDO. Документация PHP по PDO не ясна для моих нужд. Он дает вам функции для использования, но не вдаваться в подробности, чтобы объяснить их в разных сценариях.
В принципе, у меня есть полнотекстовый поиск mysql:
$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)";
Фактические заявления намного дольше, но это то, что в основном делает.
Мой вопрос: как включить это в PDO?
Я знаю, что вы не собираетесь использовать кавычки вокруг маркера места, так что вы оставите их в функции AGAINST ()? Включить их? Если я оставлю их, что происходит с символом подстановки и т. Д.?
$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE"); $sql->bindValue(':searchText', $searchFor . '*');
Это, к сожалению, странное исключение для использования параметров запроса ( редактирование: но, по-видимому, не в последней точке выпуска каждой ветви MySQL, см. Ниже).
Шаблон в AGAINST()
должен быть константной строкой, а не параметром запроса. В отличие от других константных строк в SQL-запросах, здесь нельзя использовать параметр запроса, просто из-за ограничения в MySQL.
Чтобы интерполировать шаблоны поиска в запросах безопасно, используйте функцию PDO :: quote () . Обратите внимание, что функция quote () PDO уже добавляет разделители цитат (в отличие от mysql_real_escape_string ()).
$quoted_search_text = $this->db->quote('+word +word'); $sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE");
Re comment от @YourCommonSense:
Вы правы, я просто тестировал это на MySQL 5.5.31, 5.1.68 и 5.0.96 (MySQL Sandbox – замечательный инструмент), и кажется, что эти версии принимают параметры запроса в предложении AGAINST () динамический SQL-запрос.
У меня все еще есть воспоминание о конфликте, существовавшем в прошлом. Возможно, это было исправлено в самом последнем выпуске каждой ветви. Например, я нахожу эти связанные ошибки:
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}"; try { $database->prepare($sql); $database->bindParam(':searchstr', $search); $database->execute(); $result_array = $database->fetch_array($sql); } catch (Exception $e) { echo $e->getMessage(); }