peter sababa Ответов: 1

Как использовать разбиение на страницы в поисковом фильтре


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

Что я уже пробовал:

<form method="POST"  action="search_christian_songs.php">
        <div class="form-group input-group">
           <input class="form-control mr-sm-2" required="" name="search" type="text" placeholder="Search" aria-label="Search">
          <span class="input-group-btn">
            <button class="button"  name="submit-submit" type="submit">

            Search
            </button>
          </span>        
        </div>
      </form>
</div> 
                  <div class="col-sm-8">
                     <div class="blog_left_sidebar">

                           <aside class="single_sidebar_widget popular_post_widget">
                                   
                                                   <?php
  if (isset($_GET['page_no']) && $_GET['page_no']!="") {
  $page_no = $_GET['page_no'];
  } else {
    $page_no = 1;
        }

  $total_records_per_page = 3;
    $offset = ($page_no-1) * $total_records_per_page;
  $previous_page = $page_no - 1;
  $next_page = $page_no + 1;
  $adjacents = "2"; 

  $result_count = mysqli_query($conn,"SELECT COUNT(*) As total_records FROM african_songs ");
  $total_records = mysqli_fetch_array($result_count);
  $total_records = $total_records['total_records'];
    $total_no_of_pages = ceil($total_records / $total_records_per_page);
  $second_last = $total_no_of_pages - 1; // total page minus 1
                                            if (isset($_POST['search'])) {
                              
                                        $search = mysqli_real_escape_string($conn, $_POST['search'] );
                                        $query =  ("SELECT * FROM christian_songs WHERE Title LIKE '%$search%'  LIMIT $offset, $total_records_per_page ");
              
                                       $result = mysqli_query($conn, $query);
                                       $queryResult = mysqli_num_rows($result);
                       
                                echo "<h2 class='widget_title'> There are ".$queryResult." results found! </h2>";
                                        if ($queryResult > 0) {
                                            while ($row = mysqli_fetch_assoc($result)) {
                                               $id = $row['id']; 
                                            echo " <div class='media post_item'> 
                             <img src=".$row['image']." alt='post'> <div class='media-body'><ul class='list cat-list'><li>
                                     <a href='download_christian_songs.php?id=$id'> <h5>".($row['Title'])."</h5></a>
                             <p> ".($row['date'])."</p></li>
      
                           </div></ul>
                                          

               </div>";
                                               } 

                                         }
                                      } else{
              echo "<div class='alert alert-warning'>You Have No Record!</div>";
      }

                                      ?>
   
                                                                                          <br>
<h3>Page <?php echo $page_no." of ".$total_no_of_pages; ?></h3>

  <div class="page_nav">
    <ul class="d-flex flex-row align-items-start justify-content-start">
   <?php // if($page_no > 1){ echo "<li><a href='?page_no=1'>First Page</a></li>"; } ?>
    
  <li <?php if($page_no <= 1){ echo "class='disabled'"; } ?>>
  <a <?php if($page_no > 1){ echo "href='?page_no=$previous_page'"; } ?>>Prev</a>
  </li>
       
    <?php 
  if ($total_no_of_pages <= 3){     
    for ($counter = 1; $counter <= $total_no_of_pages; $counter++){
      if ($counter == $page_no) {
       echo "<li class='active'><a>$counter</a></li>";  
        }else{
           echo "<li><a href='?page_no=$counter'>$counter</a></li>";
        }
        }
  }
  elseif($total_no_of_pages > 10){  
  if($page_no <= 4) {     
   for ($counter = 1; $counter < 8; $counter++){     
      if ($counter == $page_no) {
       echo "<li class='active'><a>$counter</a></li>";  
        }else{
           echo "<li><a href='?page_no=$counter'>$counter</a></li>";
        }
        }
    echo "<li><a>...</a></li>";
    echo "<li><a href='?page_no=$second_last'>$second_last</a></li>";
    echo "<li><a href='?page_no=$total_no_of_pages'>$total_no_of_pages</a></li>";
    }

   elseif($page_no > 4 && $page_no < $total_no_of_pages - 4) {     
    echo "<li><a href='?page_no=1'>1</a></li>";
    echo "<li><a href='?page_no=2'>2</a></li>";
        echo "<li><a>...</a></li>";
        for ($counter = $page_no - $adjacents; $counter <= $page_no + $adjacents; $counter++) {     
           if ($counter == $page_no) {
       echo "<li class='active'><a>$counter</a></li>";  
        }else{
           echo "<li><a href='?page_no=$counter'>$counter</a></li>";
        }                  
       }
       echo "<li><a>...</a></li>";
     echo "<li><a href='?page_no=$second_last'>$second_last</a></li>";
     echo "<li><a href='?page_no=$total_no_of_pages'>$total_no_of_pages</a></li>";      
            }
    
    else {
        echo "<li class='active'><a href='?page_no=1'>1</a></li>";
    echo "<li><a href='?page_no=2'>2</a></li>";
        echo "<li><a>...</a></li>";

        for ($counter = $total_no_of_pages - 6; $counter <= $total_no_of_pages; $counter++) {
          if ($counter == $page_no) {
       echo "<li class='active'><a>$counter</a></li>";  
        }else{
           echo "<li><a href='?page_no=$counter'>$counter</a></li>";
        }                   
                }
            }
  }
?>
 
  <li <?php if($page_no >= $total_no_of_pages){ echo "class='disabled'"; } ?>>
  <a <?php if($page_no < $total_no_of_pages) { echo "href='?page_no=$next_page'"; } ?>>Next</a>
  </li>
    <?php if($page_no < $total_no_of_pages){
    echo "<li><a href='?page_no=$total_no_of_pages'>Last</a></li>";
    } ?>
</ul> 

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

PHP: SQL-инъекция - руководство пользователя[^]

1 Ответов

Рейтинг:
12

Richard Deeming

Ваши ссылки на номер страницы будут делать запрос GET на сервер. Они не будут включать в себя ранее введенный поисковый запрос.

Вам нужно изменить номер страницы ссылки на кнопки и заставить их отправить форму поиска. Если кнопка должна находиться вне формы, вы можете добавить form атрибут, чтобы сказать ему, какую форму отправить. А с помощью Bootstrap вы можете добавить class="btn btn-link" если вы хотите, чтобы он выглядел как ссылка, а не кнопка.

Вам также необходимо повторно заполнить входные данные поиска значением, которое было отправлено на сервер, убедившись, что оно закодировано в HTML, чтобы избежать уязвимостей межсайтового скриптинга.

И вы захотите отфильтровать Count запрос, а также запрос, который выбирает записи.

Попробуйте что-нибудь вроде этого:

<?php
    if (isset($_POST['search'])) {
        $search = $_POST['search'];
    } else {
        $search = "";
    }
    
    if (isset($_GET['page_no'])) {
        $page_no = intval($_GET['page_no']);
    } else if (isset($_POST['page_no'])) {
        $page_no = intval($_POST['page_no']);
    }
    else {
        $page_no = 1;
    }
    
    if (empty($search)) {
        $total_records = 0;
    }
    else {
        $stmt = $mysqli_prepare("SELECT Count(*) FROM christian_songs WHERE Title LIKE Concat('%', ?, '%')");
        mysqli_stmt_bind_param($stmt, "s", $search);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_bind_result($stmt, $total_records);
        mysqli_stmt_fetch($stmt);
    }
?>

<form id="search_form" method="POST"  action="search_christian_songs.php">
    <div class="form-group input-group">
        <input class="form-control mr-sm-2" required="" name="search" type="text" placeholder="Search" aria-label="Search" value="<?php echo htmlspecialchars($search) ?>">
        <span class="input-group-btn">
            <button class="button"  name="submit-submit" type="submit">Search</button>
        </span>
    </div>
</form>

<?php 
if (empty($search)) {
    echo "<div class='text-muted'>Please enter your search term</div>";
} else if ($total_records == 0) {
    echo "<div class='alert alert-warning'>No matching records found</div>";
} else {
    $total_records_per_page = 3;
    $offset = ($page_no - 1) * $total_records_per_page;
    $total_no_of_pages = ceil($total_records / $total_records_per_page);
    
    echo "<h2 class='widget_title'> There are ".$total_records." results found! </h2>";
    
    $stmt = $mysqli_prepare("SELECT Id, Title, Image, Date FROM christian_songs WHERE Title LIKE Concat('%', ?, '%') LIMIT ?, ?");
    mysqli_stmt_bind_param($stmt, "sii", $search, $offset, $total_records_per_page);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $Id, $Title, $Image, $Date);
    
    while (mysqli_stmt_fetch($stmt)) {
        echo "<div class='media post_item'>
            <img src='$Image' alt='post'>
            <div class='media-body'>
                <ul class='list cat-list'>
                    <li>
                        <h5><a href='download_christian_songs.php?id=$Id'>$Title</a></h5>
                        <p>$Date</p>
                    </li>
                </ul>
            </div>
        </div>";
    }

    echo "<h3>Page $page_no of $total_no_of_pages</h3>";
    echo "<div class='page_nav'>";
    echo "<ul class='d-flex flex-row align-items-start justify-content-start'>";
    
    if ($page_no <= 1) {
        echo "<li class='disabled'>First</li>";
        echo "<li class='disabled'>Prev</li>";
    }
    else {
        $previous_page = $page_no - 1;
        echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='1'>First</button></li>";
        echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='$previous_page'>Prev</button></li>";
    }
    
    for ($counter = 1; $counter <= $total_no_of_pages; $counter++) {
        if ($counter == $page_no) {
            echo "<li class='active'>$counter</li>";
        }
        else {
        echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='$counter'>$counter</button></li>";
        }
    }
    
    if ($page_no >= $total_no_of_pages) {
        echo "<li class='disabled'>Next</li>";
        echo "<li class='disabled'>Last</li>";
    }
    else {
        $next_page = $page_no + 1;
        echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='$next_page'>Next</button></li>";
        echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='$total_no_of_pages'>Last</button></li>";
    }
    
    echo "</ul>";
    echo "</div>";
}
?>
(Я проигнорировал код для обрезки списка номеров страниц, но вы должны понять общую идею.)

РНР: htmlspecialchars - руководство пользователя[^]
PHP: intval - руководство пользователя[^]


peter sababa

Я получаю ошибку, сэр, или я могу отправить вам программу, чтобы помочь мне....?
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный ')' в C:\xampp\htdocs\music\search_christian_songs.php на линии 36

Richard Deeming

Какая линия является линией 36?

peter sababa

if (isset($_GET['page_no'])) {
//этот // $page_no = intval($_GET['page_no']));
} else if (isset($_POST['page_no'])) {
$page_no = intval($_POST['page_no']));
}

Richard Deeming

Ах, извините - есть еще одно закрытие ) на этой строке.

if (isset($_GET['page_no'])) {
    $page_no = intval($_GET['page_no']);
} else if (isset($_POST['page_no'])) {
    $page_no = intval($_POST['page_no']);
}

peter sababa

mysqli_stmt_bind_param($stmt, "s", $search)
// все еще получаю еще одну ошибку в этой строке//mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $total_records);
mysqli_stmt_fetch($полу);

Richard Deeming

А ошибка есть?

Richard Deeming

Может быть, MySql не нравится + для добавления подстановочных знаков. Попробуйте использовать Concat вместо этого в обоих запросах.

Заменять:

'%' + ? + '%'

с:
Concat('%', ?, '%')

peter sababa

mysqli_stmt_execute($полу);

peter sababa

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный 'mysqli_stmt_execute' (T_STRING) в C:\xampp\htdocs\music\search_christian_songs.php на линии 30

Richard Deeming

Там что-то пропало ; на предыдущей строке.

mysqli_stmt_bind_param($stmt, "s", $search);

То же самое и с другим запросом.
mysqli_stmt_bind_param($stmt, "sii", $search, $offset, $total_records_per_page);

peter sababa

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное '-', ожидание :: (T_PAAMAYIM_NEKUDOTAYIM) in C:\xampp\htdocs\music\search_christian_songs.php на линии 103
Эхо "Prev";

Richard Deeming

Ну, это раздражает. Похоже, что такого рода вещи должны поддерживаться в "сложном синтаксисе":
PHP: Strings - Manual[^]

Вам нужно будет извлечь вычисление в другую переменную - например:

$previous_page = $page_no - 1;
echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='$previous_page'>Prev</button></li>";

и:
$next_page = $page_no + 1;
echo "<li><button class='btn btn-link' form='search_form' type='submit' name='page_no' value='$next_page'>Next</button></li>";

peter sababa

я все еще получаю ошибки, Сэр, пожалуйста, могу ли я просто отправить вам программу lto, чтобы помочь мне отредактировать ее...?

Richard Deeming

Нет. Это не то, как работает этот сайт.

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