Второе подготовительное утверждение не работает, даже если sql правильный - PullRequest
0 голосов
/ 03 мая 2018

У меня проблема с функциями поиска.

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

Если в первом поисковом запросе нет результата, мы получаем из таблицы категорий category_id и пытаемся найти по этому номеру категории сообщения из таблицы сообщений в 3-м запросе.

К сожалению, когда он нажал второй запрос, я получил строку: «Нет результатов поиска. Повторите попытку позже».

Кроме того, я получаю эту вторую строку запроса для целей отладки, и это:

SELECT cat_id FROM categories WHERE cat_title LIKE '%HTML%'

Когда я запускаю этот запрос в phpmyadmin, он возвращает 1 строку, как и предполагалось, но в моем php-коде он не работает. Не знаю почему. Может быть, что-то не так с этим оператором prepare, например, с методами close.

Я использую в своем коде 3 запроса stmt. Вот мой код:

if(isset($_POST['search']) && !empty($_POST['search'])) {

        $search = escape($_POST['search']);
        $search = "%{$search}%";

   //FIRST WE ARE LOOKING BY TITLE, TAGS AND AUTHOR.

   $stmt = mysqli_prepare($connection, "SELECT post_id, post_title, post_author, post_date, post_image, post_content, post_tags FROM " . DB_PREFIX . "posts WHERE post_tags LIKE ? OR post_title LIKE ? OR post_author LIKE ?");

   mysqli_stmt_bind_param($stmt, "sss", $search, $search, $search);
   mysqli_stmt_execute($stmt);
   confirmQuery($stmt);
   mysqli_stmt_bind_result($stmt, $post_id, $post_title, $post_author, $post_date, $post_image, $post_content, $post_tags);

   mysqli_stmt_store_result($stmt);  
   if(mysqli_stmt_num_rows($stmt) === 0) {
           mysqli_stmt_close($stmt);

           //NOW WE ARE LOOKING BY CATEGORY

           $search = escape($_POST['search']);
           $search = "'%{$search}%'";

           $stmt1 = mysqli_prepare($connection, "SELECT cat_id FROM " . DB_PREFIX . "categories WHERE cat_title LIKE ?");
           mysqli_stmt_bind_param($stmt1, "s", $search);
           mysqli_stmt_execute($stmt1);
           confirmQuery($stmt1);
           mysqli_stmt_bind_result($stmt1, $cat_id);
           mysqli_stmt_fetch($stmt1);
           mysqli_stmt_store_result($stmt1);  
           if(mysqli_stmt_num_rows($stmt1) === 0) {

                //NO RESULT IN FIRST SEARCH AND SECOND SEARCH QUERY                

                mysqli_stmt_close($stmt1);

                echo "<h1 class='search-no-result'>No Result of Search. Try again later.</h1>";

                //DELETE THIS LATER.
                echo "<h1 class='search-no-result'>SELECT cat_id FROM " . DB_PREFIX . "categories WHERE cat_title LIKE {$search}</h1>";
                //--------------------
                $no_result = true;

           //IF THERE IS CATEGORY LIKE SEARCHED
           } else {

           //WE ARE LOOKING FOR POST FROM THIS CATEGORY

           $stmt2 = mysqli_prepare($connection, "SELECT post_id, post_title, post_author, post_date, post_image, post_content, post_tags FROM " . DB_PREFIX . "posts WHERE post_category_id = ?");

           mysqli_stmt_bind_param($stmt2, "i", $cat_id);
           mysqli_stmt_execute($stmt2);
           confirmQuery($stmt2);
           mysqli_stmt_bind_result($stmt2, $post_id, $post_title, $post_author, $post_date, $post_image, $post_content, $post_tags);
        }
     } else {
           $no_result = false;
     }
   } else {
       redirect("/Udemy/cms/index");
 }

Дополнительно могу сказать, что поиск хорошо работает с поиском по названию, автору и тегам. Только с категорией не получается.

Так в чем же проблема?

Что-то не так с запросами stmt или чем-то еще?

// EDIT

Я изменил запрос scond на:

$sql = "SELECT COUNT(*) AS cnt FROM " . DB_PREFIX . "categories WHERE cat_title LIKE ?";

Результат:

Нет результатов поиска. Попробуйте позже. ВЫБЕРИТЕ СЧЕТ (*) КАК ОТ категории ГДЕ cat_title НРАВИТСЯ '% html%' | Cnt 0

Так что, очевидно, что-то не так с SQL-запросом, но когда я набираю этот запрос в phpmyadmin, я получаю такой результат:

cnt 1

Я думаю, что ошибка в том, что я делаю второй оператор подготовки после первого, но я думал, что $ stmt-> close () сделает это хорошо. Может быть, это так, но я не уверен.

У вас есть идеи, как это решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...