#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
, теперь все, кажется, работает.