Поиск с использованием нескольких параметров, LIKE, ORDER BY - PullRequest
0 голосов
/ 07 января 2019

Я хочу создать форму поиска для своего сайта и иметь возможность поиска, выбрав несколько параметров, используя 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», результаты не отображаются. Как это решить? чтобы отобразить строки / s, соответствующие как postName, так и postCountryID. В phpMyAdmin работает, но с помощью формы поиска это не работает:

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

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

1 Ответ

0 голосов
/ 09 января 2019

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

...