Функция поиска PHP не может вернуть результаты - PullRequest
0 голосов
/ 30 октября 2018

Я в процессе рефакторинга PHP-скрипта (переход от mysqli к PDO). Его цель - создать список ресурсов для сайта и позволить пользователям фильтровать их. Существует также базовая функция поиска. Все в переделанном скрипте работает нормально, кроме функции поиска. Попытка поиска не дает результатов. Информация присутствует в базе данных, и я не могу найти никаких ошибок в журналах Apache. Вот код:

require_once('web_misc_config');

...    

$search=(isset($_GET['search']) ? $_GET['search'] : null);
$search= addslashes($search); 
$searchletter=(isset($_GET['searchletter']) ? $_GET['searchletter'] : null);

//This while loop creates the searched version of the A to Z list.
if (!empty($search)){
    $result = $con->prepare("SELECT title,summary,url,coverage,format FROM 

    dbs where title like :search or summary like :search");
    $result->bindParam(':search', $search, PDO::PARAM_STR);
    $result->execute();

    while($row = $result->fetch())
    {
        $url=$row['url'];
        $title=$row['title'];
        $summary=$row['summary'];
        $coverage=$row['coverage'];
        $format=$row['format'];

        echo ('<p><h6><a href="' . $url . '">' . $title . '</a></h6>
                        <br />' . $summary . '</p>');
    } 
}

//This block creates the filtered and searched version of the list.
elseif (!empty($searchletter)) {
    $result = $con->prepare("SELECT title,summary,url,coverage,format,fletter FROM dbs where fletter = :searchletter");
    $result->bindParam(':searchletter', $searchletter);
    $result->execute();

    while($row = $result->fetch())
    {
        $url=$row['url'];
        $title=$row['title'];
        $summary=$row['summary'];
        $coverage=$row['coverage'];
        $format=$row['format'];

        echo ('<p><h6><a href="' . $url . '">' . $title . '</a></h6>
                        <br />' . $summary . '</p>');
    }
}  

//This block loop creates the inital A to Z list.
else {
    $result = $con->prepare("SELECT title,summary,url,coverage,format FROM dbs");
    $result->execute();

    while($row = $result->fetch())
    {
        $url=$row['url'];
        $title=$row['title'];
        $summary=$row['summary'];
        $coverage=$row['coverage'];
        $format=$row['format'];

        echo ('<p><h6><a href="' . $url . '">' . $title . '</a></h6>
                        <br /> ' . $summary . '</p>');
    } 
}   
$result = null;
$con = null;

Блоки ELSEIF и ELSE работают нормально. Первоначальный, нефильтрованный список заполняется, и пользователи могут фильтровать его по алфавиту. Они включены сюда для полноты и сравнения. Проблема в цикле while в блоке IF (под первым комментарием). Он оценивается как ложное, в результате чего вместо результатов поиска появляется пустой экран. Он должен принимать значение true, пока результаты извлекаются из базы данных. Кто-нибудь может увидеть то, что я мог пропустить?

1 Ответ

0 голосов
/ 31 октября 2018

Поскольку $search не содержит подстановочных знаков, LIKE будет обрабатываться как = и искать точное совпадение. Если вы хотите найти его в любом месте столбца, вам нужно добавить символы подстановки.

if (!empty($search)){
    $search = "%$search%";
    $result = $con->prepare("SELECT title,summary,url,coverage,format 
        FROM dbs 
        where title like :search or summary like :search");
    $result->bindValue(':search', $search, PDO::PARAM_STR);
    $result->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...