Искать по нескольким параметрам, LIKE, ORDER BY

Я хочу создать форму поиска для своего сайта и иметь возможность выполнять поиск, выбирая несколько параметров, используя LIKE и, в конечном итоге, ORDER BY. Поиск по имени, стране и дате.

InnoDB, сортировка utf8mb4_unicode_ci, php 5.6

<?php

if (isset($_POST['search'])){

    $sql = 'SELECT * FROM radio_posts';
    $where = array();
    $params = array();      

    if (!empty($_POST['postRadioName'])) {
        $where[] = "postName LIKE :searchRadioName";
        $params[':searchRadioName'] = '%'.$_POST['postRadioName'].'%';

    }

    if (!empty($_POST['postCountryID'])) {
        $where[] = "postCountryID = :postCountryID";
        $params[':postCountryID'] = $_POST['postCountryID'];
    }


    if (!empty($where)) {
        $sql .= ' WHERE (' . implode(') AND (', $where) . ') ' ;
    }

    $stmt = $db->prepare($sql);

    foreach($params as $param => $value) {
        $stmt->bindParam($param, $value);
    }
    $stmt->execute();    

}

?>

Моя таблица - radio_posts, также есть несколько столбцов, postID, postName, postCountryID, postDate. В postName у меня несколько строк: новое радио, новое радио 2, новое радио 3. Когда я ищу термин, например «новый», отображаются все три строки, хорошо. Если я ищу по postCountryID, например «3», отображается только одна строка, что тоже хорошо, потому что только одна назначается идентификатору 3. Но когда я ищу оба, postName «new» и postCountryID «3» не отображаются результаты. Как это решить? для отображения строк, соответствующих как postName, так и postCountryID. В phpMyAdmin работает, но с формой поиска не работает:

SELECT * FROM `radio_posts` WHERE postName LIKE '%new%' AND postCountryID = 3

Также, если возможно, я хотел бы спросить, как лучше всего упорядочить результаты по столбцу postDate, по возрастанию, по убыванию.

Вы пробовали заключать postName LIKE :searchRadioName в кавычки? Я обычно не использую именованные заполнители, только заполнители ? с запросами, поэтому я не уверен, может ли изменение его на postName LIKE ':searchRadioName' привести к ожидаемому результату.

Jaquarh 07.01.2019 12:38

Да, SQL выглядит правильно. Возможно, "3" не является обязательным как int? Тем более, что данные HTML-формы в PHP всегда являются строкой, пока вы явно не приведете их как что-то еще.

Dominic 07.01.2019 12:38

@Dominic В любом случае лучше всего использовать правильный тип данных, $params[':postCountryID'] = $_POST['postCountryID'] должен быть $params[':postCountryID'] = (int) $_POST['postCountryID'] - хорошо указано, но я не думаю, что это вызывает неожиданное поведение.

Jaquarh 07.01.2019 12:40

Спасибо @Jaquarh. Кроме того, я предпочитаю использовать $stmt->bindParam($param, $value, \PDO::PARAM_INT); (или соответствующую константу PDO типа данных).

Dominic 07.01.2019 12:42

Попробуйте изменить '%'.$_POST['postRadioName'].'%' на "'%{$_POST['postRadioName']}%'" - тогда кавычки будут включены при привязке значения к заполнителю.

Jaquarh 07.01.2019 12:48

Я пробовал $ where [] = "postName НРАВИТСЯ?"; $ params [] = '%'. $ _ POST ['postRadioName']. '%'; затем $ params [': postCountryID'] = (int) $ _POST ['postCountryID'], изменил '%'. $ _ POST ['postRadioName']. '%' на "'% {$ _ POST [' postRadioName ']} % '", похоже, ничего не работает.

flvsme 08.01.2019 12:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
6
61
1

Ответы 1

После замены $stmt->bindParam($param, $value); на $stmt->bindValue($param, $value); код работает должным образом. Один результат получается для термина "новый" и ID страны = 3.

Другие вопросы по теме