繁体   English   中英

PHP图像库分页

[英]php image gallery pagination

我正在尝试向图像库添加简单的分页,但是到了没有收到任何错误消息并且仍然无法正常工作的地步。 我不知道在哪里找错。 我的代码是;

<?php 
include 'core/init.php';
ini_set('display_errors', 'On'); // aan of uit
error_reporting(E_ALL); 
?>
<body>
<div id="wrap">
<div id="header">
<h1>Rob Cnossen</h1>
</div>
<div id="titel">
<?php
if (isset($_GET['album_id'])) {
$album_id = $_GET['album_id'];
$album_data = $albums->album_data($album_id, 'name', 'description');

echo '<h2>', $album_data['name'], '</h2>';

$albums = $albums->get_albums();
$images = $images->get_images($album_id);
}
?>
</div>
<div id="sidebarleft">
<?php
if (empty($images)) {
echo 'Er zijn geen foto\'s in dit album';
} else {
foreach ($albums as $album) {
foreach ($images as $image) {
    ?><div id="fotoos"><?php
        if ($image["album"] === $album["id"])
echo'<a href="view_album.php?album_id=', $album["id"],'&image_id=uploads/', $image["album"], '/', $image["img_name"],'"><img src="uploads/thumbs/', $image["album"], '/', $image["img_name"],'" title="" /></a><div id="kruisje"><a href="delete_image.php?image_id=', $image["id"],'">_|</div></a>';
                ?></div><?php                   
}          
}
}
?>
<div id="pagination">
<?php
$count_query = $db->prepare('SELECT * FROM images where album_id= ?');
$count_query->bindValue(1, $album_id);
try{
$count_query->execute();
}catch (PDOException $e){
die($e->getMessage());
}
$count = $count_query->fetchColumn();

if(isset($_GET['page'])){
$page = preg_replace("#[^0-9]#,",$_GET['page']);
}else{
$page = 1;
}
$limit = 2;
$lastPage = ceil($count/$limit);

if($page<1){
$page = 1;
}elseif($page>$lastPage){
$page = $lastPage;
}
$offset = ($page-1)*$limit;
$query = $db->prepare('SELECT image_id FROM images WHERE album_id= ? ORDER BY image_id DESC
 LIMIT ?,?');
$query->bindValue(1, $album_id);
$query->bindParam(2, $offset, PDO::PARAM_INT);
$query->bindParam(3, $limit, PDO::PARAM_INT);

try{
$query->execute();
}catch (PDOException $e){
die($e->getMessage());
} 

if($lastPage !=1){

if($page != $lastPage){
$next = $page + 1;
$pagination='<a href="'. $_SERVER['REQUEST_URI'] .'?page='.$next.'">Volgende</a>';  
}
if($page != $lastPage){
$prev = $page - 1;
$pagination.='<a href="'. $_SERVER['REQUEST_URI'] .'?page='.$prev.'">Vorige</a>';
}
}
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {                
    echo $row['image_id'];//This echoes out two image id's, at the moment that is number 75 and 73
}

echo $pagination;
?>
</div>
</div>
</div>
</body>

get_image函数是;

public function get_images($album_id) {
$images = array();

$count_query = $this->db->prepare("SELECT `image_id`, `image_name`, `album_id`, `timestamp`, `ext` FROM `images` WHERE `album_id`=? ORDER BY `timestamp` DESC");

$count_query->bindValue(1, $album_id);

try{
$count_query->execute();

while ($images_row = $count_query->fetch(PDO::FETCH_ASSOC)) {       
    $images[] = array(
    'id' => $images_row['image_id'],
    'img_name' => $images_row['image_name'],
    'album' => $images_row['album_id'],
    'timestamp' => $images_row['timestamp'],
    'ext' => $images_row['ext']
    );
}
return $images;
}catch(PDOException $e){
die($e->getMessage());
}
}

我认为$ pagination变量有问题,但我不知道是什么,我在这张专辑中得到了7张图像,而$ limit位于2上,仍然显示了所有7张图像。 如果我单击分页链接,则该URL显示我单击分页链接,仅此而已。 例如,如果我在下一个或上一个链接上单击多次,URL可以显示此链接。 http://www.robcnossen.nl/view_album.php?album_id=8?page=2?page=2?page=0?page=2?page=0

该站点为http://www.robcnossen.nl/view_album.php?album_id=8

希望您能看到引起问题的原因。 谢谢...

如果您是我,则可以从网上下载一个可行的解决方案并使之适应您的特定情况,或者在考虑某些SoC(关注分离)的情况下重构整个组件。

  • 分开您的顾虑,将逻辑排除在演示文稿之外
  • 将分页逻辑与其余部分分开。 分页最多只需要知道4件事即可显示其链接
    1. 目标网址:链接需要一个均匀的URL方案,只有pageNumurl将改变
    2. 必须显示多少个链接(可能是包含可变部分的pageNum数组)
    3. [可选]当前正在查看的ID,可能会使页面模糊
    4. [可选]在first / lastprev / next之后的逻辑
  • 通过清理代码并封装一些功能来帮助自己。 例如:

     function html_a($href, $content) { return '<a href="'.$href.'">'.$content.'</a>'; } function pag_href($url, $id) { return sprintf($url,$id);// url: host/target.php?pageNum=%s&someOtherstuff... } // usage inside loop echo html_a(pag_href($url,$id),$pageNum); // if you do this right, your pagination code can become reusable 
  • 使用一些mysql功能对您有利。 您可以使用LIMIT限制结果数,使用OFFSET设置页面的第一个元素,而仍然可以使用SQL_CALC_FOUND_ROWS获取行SQL_CALC_FOUND_ROWS

     // This way is clearer for me $q = 'SELECT SQL_CALC_FOUND_ROWS image_id FROM images WHERE album_id=? ORDER BY image_id DESC LIMIT ? OFFSET ?' // after executing your query you may now use pdo's foundRows $totalNumEntries = $pdo->foundRows(); // get number of pages with pageSize $totalNumPages = (int)ceil($totalNumEntries / $yourPageSize); 

总而言之,尝试对问题进行封装/分离,提前进行一些计划,并且您不必处理甚至不需要调试的代码

抱歉,这对您现有的代码没有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM