即使我添加了过滤器以在同一页面上分页更多行,我的分页也能正常工作,也就是说通过过滤器我可以显示 10 或 50 行。
我的代码中的一个小缺陷是重新加载页面,更改显示的行数,分页按钮也会发生同样的情况。
这是我的代码,所有内容都在同一页面上运行index2.php。
<div id="wrapper">
<div class="container">
<div id="news-header" class="bootgrid-header container-fluid">
<div class="row">
<div class="col-sm-12 actionBar">
<div class="search-bar">
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="What are you looking for?">
</div>
<div class="actions btn-group">
<?php
$select_quantity = '';
if (isset($_POST['amount_show'])) :
$select_quantity = $_POST['amount_show'];
endif;
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<select id="amount_show" name="amount_show" onchange="this.form.submit()">
<option value="10" <?php if ($select_quantity==10) echo "selected"; ?>>10</option>
<option value="25" <?php if ($select_quantity==25) echo "selected"; ?>>25</option>
<option value="50" <?php if ($select_quantity==50) echo "selected"; ?>>50</option>
<option value="100" <?php if ($select_quantity==100) echo "selected"; ?>>100</option>
</select>
</form>
</div>
</div>
</div>
</div>
<?php
if (isset($_GET['page'])) :
$page = $_GET['page'] ?: '';
else :
$page = 1;
endif;
if (isset($_POST['amount_show'])) :
$records_by_page = $_POST['amount_show'];
else :
$records_by_page = 10;
endif;
$localization_sql = ($page-1) * $records_by_page;
$sql = "SELECT id,title,description
FROM news
ORDER BY id DESC LIMIT $localization_sql, $records_by_page";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows>0) :
echo '<table id="myTable" class="table table-condensed table-hover table-striped bootgrid-table">
<thead>
<tr>
<th>Id</th>
<th>Title</th>
<th>Description</th>
<th>Action</th>
</tr>
</thead>
<tbody>';
$stmt->bind_result($id,$title,$description);
while ($stmt->fetch()) :
echo '<tr>
<td>'.$id.'</td>
<td>'.$title.'</td>
<td>'.$description.'</td>
<td>Edit</td>
</tr>';
endwhile;
echo '</tbody>';
echo '</table>';
$stmt->close();
$sql = "SELECT * FROM news";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->store_result();
$BD_records = $stmt->num_rows;
$stmt->close();
$con->close();
$total_page = ceil($BD_records / $records_by_page);
$prev = $page - 1;
$next = $page + 1;
echo '<div class=pagination>
<ul class="pagination">';
if ($prev > 0) :
echo "<li><a href='index2.php?page=1'><i class='icon-angle-double-arrow'></i></a></li>";
echo "<li><a href='index2.php?page=$prev'><i class='icon-angle-left'></i></a></li>";
endif;
for ($i=1; $i<=$total_page; $i++) :
if ($page==$i) :
echo "<li><a class=active>". $page . "</a></li>";
else :
echo "<li><a href='index2.php?page=$i'>$i</a></li>";
endif;
endfor;
if ($page < $total_page ) :
echo "<li><a href='index2.php?page=$next'><i class='icon-angle-right'></i></a></li>";
echo "<li><a href='index2.php?page=$total_page'><i class='icon-angle-double-right'></i></a></li>";
endif;
echo '</ul></div>';
else :
$stmt->close();
endif;
?>
</div>
</div>
在网上搜索时,我发现了一个 ajax 代码,但老实说,我没有管理 ajax 或 javascript/jquery 代码的使用。
你可以解释如何实现这个ajax代码或者如何避免重新加载页面的小缺陷。
<script type="text/javascript">
$(document).ready(function() {
$('.pagination li a').on('click', function(){
/*$('.items').html('<div class="loading"><img src="images/loading.gif" width="70px" height="70px"/><br/>Loading...</div>');*/
$('.items').html('<div class="loading">Loading...</div>');
var page = $(this).attr('data');
var dataString = 'page='+page;
$.ajax({
type: "GET",
url: "ajax.php",
data: dataString,
success: function(data) {
$('.items').fadeIn(2000).html(data);
$('.pagination li').removeClass('active');
$('.pagination li a[data="'+page+'"]').parent().addClass('active');
}
});
return false;
});
});
</script>
我的代码是这样工作的,如下图所示:
最佳答案
Ajax 将在不重新加载页面的情况下更新页面上的信息。我们希望将数据与 HTML 分开,以便我们可以更改我们看到的数据。如果 PHP 是将数据写入 HTML 的工具,我们就无法做到这一点。所以我建议将 index2.php 分成几个文件。此示例使用 JSON。
收集数据
ajax.php
<?php
$data_rows = array();
for ($i = 0; $i < 1000; $i++) {
$data_rows[] = array(
"id" => "id_$i",
"title" => "title_$i",
"description" => "description_$i",
);
}
echo json_encode($data_rows, JSON_PRETTY_PRINT);
这是一些垃圾数据的例子,不知道你需要什么数据。这里重要的是将你想要的所有信息创建一个关联数组,json_encode()
数组,然后 echo
它。重要的是,这是唯一得到回应或打印的东西!如果您在此脚本中打印任何其他内容,这将不起作用。
编辑:
ajax.php
if (isset($_GET['page'])) :
$page = $_GET['page'] ?: '';
else :
$page = 1;
endif;
if (isset($_POST['amount_show'])) :
$records_by_page = $_POST['amount_show'];
else :
$records_by_page = 10;
endif;
$sql = "SELECT id, title, description
FROM news
ORDER BY id DESC LIMIT $localization_sql, $records_by_page";
$result = $con->query($sql);
$data_rows = array();
while ($row = $result->fetch_assoc()) {
$data_rows = $row;
}
echo json_encode($data_rows, JSON_PRETTY_PRINT);
您的原始代码包含此 mysqli 连接,这是我无权访问的数据,因此无法测试此脚本的功效。但是,这应该会显示您要询问的所有数据。
使用 jQuery 的 Ajax
脚本.js
$(document).ready(function() {
$.ajax({
type: "GET",
url: "ajax.php",
dataType: "json",
success: function(data) {
tableRows = '';
for (let i = 0; i < data.length; i++) {
tableRows += `
<tr>
<td>${data[i].id}</td>
<td>${data[i].title}</td>
<td>${data[i].description}</td>
<td>Edit<td>
</tr>`;
}
$("#tbody-insert").html(tableRows);
}
});
});
将 ajax 调用的 url 参数设置为传递数据的 php 文件的名称。在我使用 JSON 的示例中,设置 dataType: "json"
很重要。 jQuery 会自动为你解析它。在success参数中可以看到,data
就是我们创建的php数组的名字。我使用了一个简单的 for 循环来创建一堆表行,然后将它们插入到我用 id="tbody-insert"
标记的表体中。
呈现数据
index.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="script.js"></script>
<table id="myTable" class="table table-condensed table-hover table-striped bootgrid-table">
<thead>
<tr>
<th>Id</th>
<th>Title</th>
<th>Description</th>
<th>Action</th>
</tr>
</thead>
<tbody id="tbody-insert">
</tbody>
</table>
我已经从你的索引页面中取出所有的 PHP,它不是很灵活并且需要在更新信息之前重新加载整个页面。需要注意的重点是脚本标签,您需要包含 jQuery 并且需要包含 script.js。您还需要为我们要插入信息的表体提供一个 ID。您可以将 ajax 包装在一个函数中,每次您想要分页时都会调用该函数,并查询 ajax.php 以获取不同的页面。我不知道您的数据结构,因此无法提供进一步的帮助。
关于php - 如何用ajax显示页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747673/