Разбиение на страницы AJAX, обновление текущей страницы

#php #ajax

#php #ajax

Вопрос:

Я создал числовую разбивку на страницы, которая загружает данные через AJAX.

Это код:

  $(document).ready(function(){  
      load_data(1); 
     
      function load_data(page)  
      {          
        $.ajax({
                url:"pagination2.php",  
                method:"POST", 
                data:{page:page},  
                success:function(data){  
                     $('#load_data').html(data);
                } 
           }); 
      }  

      $(document).on('click', '.pagination_link', function(event) 
        {
            event.preventDefault(); 
            var page = $(this).attr("id"); 
            load_data(page);
            //Now push PAGE to URL
            window.history.pushState({page}, `Selected: ${page}`, `${'page='    page}`)
            return event.preventDefault(); 
      });
            window.addEventListener('popstate', e => {
            var page = $(this).attr("id");
            load_data(e.state.page);
            console.log('popstate error!');
    });
    
 }); 
  

Код работает, но когда я обновляю страницу, данные снова загружаются с первой страницы. test_ajax

Пример: если я нажму кнопку, которая загружает страницу 2, когда я обновляю страницу, данные отображаются со страницы 1.

Есть способ оставаться на той же странице даже после обновления страницы?

pagination2.php

 <?php 

$rowperpage = 10;

$page = 1;
if($_REQUEST['page'] > 1)
{
  $p = (($_REQUEST['page'] - 1) * $rowperpage);
  $page = $_REQUEST['page'];
}
else
{
  $p = 0;
}

?>


<?php   
 $visible = $visible ?? true;
  
$products_count = count_all_products(['visible' => $visible]);    
      
$sql = "SELECT * FROM products ";
$sql .= "WHERE visible = true ";
$sql .= "ORDER BY position ASC ";
$sql .= "LIMIT ".$p.", ".$rowperpage."";  
        
$product_set = find_by_sql($sql);
      
$product_count = mysqli_num_rows($product_set);
    
if($product_count == 0) {
      echo "<h1>No products</h1>";
      }

while($run_product_set = mysqli_fetch_assoc($product_set)) { ?>

    <div style="float: left; margin-left: 20px; margin-top: 10px; class="small">

      <a href="<?php echo url_for('/show.php?id=' . h(u($run_product_set['id'])));   ?>">
          <img src="staff/images/<?php echo h($run_product_set['filename']); ?> " width="150">
        </a>

      <p><?php echo h($run_product_set['prod_name']); ?></p>

    </div>

    <?php }

    mysqli_free_result($product_set);
      
?>
<section id="pagination">
                           
    
<?php
    
$url = url_for('index_all.php');
                        
if($_REQUEST['page'] > 1)
    { 
      $page_nb = $_REQUEST['page'];
    }
    else
    {
      $page_nb = 1;
    }                       
                            
$check = $p   $rowperpage;
$prev_page = $page_nb - 1;

$limit = $products_count / $rowperpage;
    //echo $limit;
    //exit;
$limit = ceil($limit);
$current_page = $page_nb;
    
if($page_nb > 1) {
    //echo "<a href='index_all.php?page=".$prev_page."'>Back</a>";
    echo "<span class='pagination_link' style='cursor:pointer;'  id='".$prev_page."'>Back</span>";

}
    
if ( $products_count > $check ) {

    for ( $i = max( 1, $page_nb - 5 ); $i <= min( $page_nb   5, $limit ); $i   ) {
        if ( $current_page == $i ) {
            echo "<span class="selected">{$i}</span>";
        } else {
            echo "<span class='pagination_link' style='cursor:pointer;' id='".$i."'>".$i."</span>"; 
        }
      }
    }       
    
if ($products_count > $check) { 
$next_page = $page_nb   1;  
    echo "<span class='pagination_link' style='cursor:pointer;' id='".$next_page."'>Next</span>";
    
}
  

Комментарии:

1. Что вы пытались отладить проблему? Обычно window.history.pushState следует изменить URL-адрес в строке местоположения

2. @Nico Пожалуйста window.history.pushState , да, верно, это работает, но после обновления (F5) он переходит на страницу. 1.

3. @Nico Пожалуйста, если хотите, я не могу отправить вам почтовый индекс.

4. page является $_GET аргументом для URL, но вы, вероятно, отвечаете только на $_POST аргумент из вызова AJAX. Просто замените $_POST на $_REQUEST , и он ответит на оба.

5. @ KIKO Software $_POST $_REQUEST сделано, но то же самое — после обновления перейдите на страницу 1

Ответ №1:

Когда документ будет готов, вы используете load_data(1);

Это неправильно, потому что, если кто-то обновляет страницу 5, она все равно начинается со страницы 1.
Проверяйте текущую страницу при каждом обновлении. Код должен быть примерно таким:

 var url_string = window.location.href;
var url_parts = url_string.split('/');
var piece = url_parts[url_parts.length -1]; //get last part of url (it should be page=n)
var page;
if(piece.substring(0, 5) === 'page=') {
   page = parseInt(piece.substr(5));
} else { //if it's the first time you landed in the page you haven't page=n
   page = 1;
}
load_data(page);
  

Комментарии:

1. Спасибо за вашу помощь, но куда вставить код? Кому click ?

2. Сразу после $(document) . готово(функция(){ . Удалите этот load_data(1) и попробуйте код

3. http://mantykora.cleoni.com:8080/2020_pagination_1/public/index2.php Uncaught ReferenceError: url_part is not defined

4. потому что я забыл s, извините. В переменной piece = url_part[ измените его на url_parts[ Или просто скопируйте и вставьте снова. Я это исправил.

5.Я исправил url_part url_parts http://mantykora.cleoni.com:8080/2020_pagination_1/public/page=6 , теперь все, кажется, работает.