Intereting Posts
Как получить целую и десятичную часть числа? Как преобразовать GPS-координаты в полный адрес с помощью php? «Не удается найти config.m4.» Во время работы phpize при установке apd с помощью pecl Как выбрать данные из таблицы, в которой имя таблицы имеет пробелы? PDO Error – PDOException 'с сообщением' SQLSTATE : общая ошибка ' Что означает% S в PHP, HTML или XML? Имя вложения и расширение файла не работают по электронной почте * .eml Предупреждение: preg_match () : Неизвестный модификатор 'v' Загрузите 1GB-файлы, используя chunking в PHP PHP: вложенное меню с рекурсивной функцией, расширяющее только некоторые узлы (не все дерево) Строгие стандарты: нестатический метод Вызов функции PHP дважды, работает только один раз насколько безопасны подготовленные заявления PDO Преобразование curl-команды в php curl PHP. Как открыть файлы и прочитать их, а затем написать новые с помощью «x» строк в файле?

Поиск в PDO и MySQL

Я конвертирую код всех моих сайтов с помощью функций 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-запрос.

У меня все еще есть воспоминание о конфликте, существовавшем в прошлом. Возможно, это было исправлено в самом последнем выпуске каждой ветви. Например, я нахожу эти связанные ошибки:

  • Использование параметра хранимой процедуры в предложении AGAINST () всегда возвращает тот же результат: http://bugs.mysql.com/bug.php?id=3734
  • Сбой или странные результаты с подготовленным заявлением, MATCH и FULLTEXT: http://bugs.mysql.com/bug.php?id=14496
 $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(); }