【问题标题】:Display Mysql Tbl Results With Pagination使用分页显示 Mysql Tbl 结果
【发布时间】:2018-03-17 02:30:04
【问题描述】:

我需要使用 mysqli 以程序化的方式做事。还没有学过 oop 样式或 pdo。

我正在尝试创建一个分页页面,其中 10 页显示所有记录。记录分布在 10 页上。 尽管我的 tbl 有记录,但我注意到没有记录存在。 html 表中没有显示任何记录。 这是为什么呢?

以下是我尝试使用 mysqli 使用 PREP STMT 程序样式显示记录。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional/EN"> 
<html> 
<head> 
<meta content="text/html; charset=ISO-8859-1"  http-equiv="content-type"> 
<title><?php echo "$site_name $user"; ?> User's Notices in <?php echo 
$server_time; ?> time.</title> 
</head> 
<body> 
<br> 
<center><span style="font-weight: bold;"><?php echo "$site_name $user"; ?> 
User's Notices in <?php echo $server_time; ?> time.</span></center> 
<br> 
<br> 
<?php 
$query = "SELECT id,date_and_time,recipient_username,sender_username,notice 
FROM notices WHERE recipient_username = ?"; 

if ($stmt = mysqli_prepare($conn,$query)) 
{     
    //Bind Parameter 
    mysqli_stmt_bind_param($stmt,'s',$recipient_username);  
    //Execute Statement 
    mysqli_stmt_execute($stmt);
    //$result_1 = mysqli_query($conn,$query); 
    //Bind Result Variables     
    $result_1 = mysqli_stmt_bind_result
    ($stmt,$id,$date_and_time,
    $recipient_username,$sender_username,$notice); 
    mysqli_stmt_store_result($stmt); 
    $rows_num = mysqli_stmt_num_rows($stmt);    
    printf("Result set has %d rows.\n",$rows_num); 

    $page_count = 10; 
    $page_size = ceil($rows_num / $page_count); 
    //Get the Page Number, Default is 1 (First Page).   
    $page_number = $_GET["page_number"]; 
    if ($page_number == "") $page_number = 1; 
    $offset = ($page_number -1) * $page_size; 

    $query .= " limit {$offset},{$page_size}";      

?>  
<table width="1500" border="0" cellpadding="5" cellspacing="2" 
bgcolor="#666666"> 
<?php if($rows_num) {?> 
<tr name="headings"> 
<td bgcolor="#FFFFFF" name="column-heading_submission-number">Submission 
Number</td> 
<td bgcolor="#FFFFFF" name="column-heading_logging-server-date-&-time">Date 
& Time in <?php echo $server_time ?></td> 
<td bgcolor="#FFFFFF" name="column-heading_to">To</td> 
<td bgcolor="#FFFFFF" name="column-heading_from">From</td> 
<td bgcolor="#FFFFFF" name="column-heading_notice">Notice</td> 
</tr>   
<?php while($row = mysqli_stmt_fetch($stmt)) 
{ 
    ?> 
    <tr name="user-details"> 
    <td bgcolor="#FFFFFF" name="submission-number"><?php echo $row['id']; ?>
</td> 
    <td bgcolor="#FFFFFF" name="logging-server-date-&-time"><?php echo 
$row['date_and_time']; ?></td> 
    <td bgcolor="#FFFFFF" name="recipient_username"><?php echo 
$row['recipient_username']; ?></td> 
    <td bgcolor="#FFFFFF" name="sender_username"><?php echo 
$row['sender_username']; ?></td> 
    <td bgcolor="#FFFFFF" name="notice"><?php echo $row['notice']; ?></td>  
    </tr> 
    <?php 
} 
?> 
<tr name="pagination"> 
<td colspan="10" bgcolor="#FFFFFF"> Result Pages: 
<?php 
$rows_num = mysqli_stmt_num_rows($stmt); 
if($rows_num <= $page_size) 
{ 
    echo "Page 1"; 
} 
else 
{ 
    for($i=1;$i<=$page_count;$i++) 
    echo "<a href=\"{$_SERVER['PHP_SELF']}?page_number={$i}\">{$i}</a>  "; 
} 
?> 
</td> 
</tr> 
<?php 
} 
else 
{ 
    ?> 
    <tr> 
    <td bgcolor="FFFFFF">No record found! Try another time.</td> 
    </tr> 
    <?php 
} 
?> 
</table> 
<br> 
<br> 
<center><span style="font-weight: bold;"><?php echo "$site_name $user"; ?> 
User's Notices in <?php echo $server_time; ?> time.</span></center> 
<br> 
<br> 
</div> 
<br> 
</body> 
</html> 
<?php 
} 
//Free Result Set 
mysqli_stmt_free_result($stmt); 

//Close Database Connection 
mysqli_stmt_close($stmt); 

?> 

我得到了回应:

结果集有 0 行。 没有找到记录!再试一次。

这是错误的。 mysql tbl中有记录。

忽略过时的 html,因为我稍后会将它们升级到 html 5。目前,我正在修复 php。

【问题讨论】:

  • 你当然可以做一个更简单的例子,而不是把你的整个代码放在这里
  • 如果我不在这里转储我的整个代码,那么你们专家将一无所知导致故障的原因,因为我对这整个事件完全感到困惑。
  • 你当然需要用尽可能短的代码来复制问题——这也是你找出问题所在的方法。

标签: php mysqli pagination


【解决方案1】:

这是我用于分页的内容。它也比将其固定为 10 页更灵活。

// Get inital params
if (isset($_GET['page'])) { $page = $_GET['page']; } else { $page = 1; }
$max_results = 100;
$offset = $page*$max_results - $max_results;
// This is the maximium amount of pages to display before adding Prev \ Next
$max = 10;

$query = "SELECT id FROM notices WHERE recipient_username = ?";
if ($stmt = mysqli_prepare($conn,$query)) {
    mysqli_stmt_bind_param($stmt,'s',$recipient_username);  
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt); 
    $records = mysqli_stmt_num_rows($stmt);
    mysqli_stmt_close($stmt);
}
function get_paging_info($count, $offset, $curr_page)
{
    $pages = ceil($count / $offset);

    $data = array();
    $data['si']        = ($curr_page * $offset) - $offset;
    $data['pages']     = $pages;
    $data['curr_page'] = $curr_page;

    return $data; //return the paging data

}

$paging_info = get_paging_info($records, $max_results, $page);

$html = "";

if($paging_info['curr_page'] > 1) {

        $html = $html . "<a href='1' title='Page 1'>First</a> <a href='" . ($paging_info['curr_page'] - 1) . "' title='Page " . ($paging_info['curr_page'] - 1) . "'>Prev</a>";

}

if($paging_info['curr_page'] < $max) {
    $sp = 1;
} else {
    if($paging_info['curr_page'] >= ($paging_info['pages'] - floor($max / 2)) ) {
        $sp = $paging_info['pages'] - $max + 1;
    } else {
        if($paging_info['curr_page'] >= $max) {
            $sp = $paging_info['curr_page']  - floor($max/2);
        }
    }
}

if($paging_info['curr_page'] >= $max) {
    $html = $html . "<a href='1' title='Page 1'> 1</a> ... ";
}

for($i = $sp; $i <= ($sp + $max -1);$i++) {
    if($i > $paging_info['pages']) { continue; }

    if($paging_info['curr_page'] == $i) {
        $html = $html . "<span class='bold'> {$i}</span>";
    } else {
        $html = $html . "<a href='{$i}' title='Page {$i}'> {$i}</a>";
    }
}

if($paging_info['curr_page'] < ($paging_info['pages'] - floor($max / 2)) && ($paging_info['pages'] > ($sp + $max -1))) {
    $html = $html . " ... <a href='{$paging_info['pages']}' title='Page {$paging_info['pages']}'>{$paging_info['pages']}</a>";
}
if($paging_info['curr_page'] < $paging_info['pages']) {
    $html = $html . " <a href='" . ($paging_info['curr_page'] + 1) . "' title='Page " . ($paging_info['curr_page'] + 1) . "'>Next</a><a href='{$paging_info['pages']}' title='Page {$paging_info['pages']}'> Last</a>";
}

然后让代码通过数据库:

<table width="1500" border="0" cellpadding="5" cellspacing="2" 
bgcolor="#666666"> 
<?php if($records) {?> 
<tr name="headings"> 
<td bgcolor="#FFFFFF" name="column-heading_submission-number">Submission 
Number</td> 
<td bgcolor="#FFFFFF" name="column-heading_logging-server-date-&-time">Date 
& Time in <?php echo $server_time ?></td> 
<td bgcolor="#FFFFFF" name="column-heading_to">To</td> 
<td bgcolor="#FFFFFF" name="column-heading_from">From</td> 
<td bgcolor="#FFFFFF" name="column-heading_notice">Notice</td> 
</tr>   

<?php
$query = "SELECT id,date_and_time,recipient_username,sender_username,notice 
FROM notices WHERE recipient_username = ? LIMIT ? OFFSET ?";

if ($stmt = mysqli_prepare($conn,$query)) 
{     
    mysqli_stmt_bind_param($stmt,'sii',$recipient_username, $max_results, $offset);  
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt,$id,$date_and_time,$recipient_username,$sender_username,$notice); 
    mysqli_stmt_store_result($stmt); 
    while(mysqli_stmt_fetch($stmt))
    ?>
        <tr name="user-details"> 
            <td bgcolor="#FFFFFF" name="submission-number"><?php echo $id; ?></td> 
            <td bgcolor="#FFFFFF" name="logging-server-date-&-time"><?php echo $date_and_time; ?></td> 
            <td bgcolor="#FFFFFF" name="recipient_username"><?php echo $recipient_username; ?></td> 
            <td bgcolor="#FFFFFF" name="sender_username"><?php echo $sender_username; ?></td> 
            <td bgcolor="#FFFFFF" name="notice"><?php echo $notice; ?></td>  
        </tr> 
    <?php 
    }
    mysqli_stmt_close($stmt);
}
?>

<tr name="pagination"><td colspan="10" bgcolor="#FFFFFF"><?php echo $html; ?></td></tr>

注意:您显然必须将链接编辑为您需要的链接。该脚本将允许您动态设置最大页面长度,而不是将其固定为 10,这可能会导致问题。

【讨论】:

  • 非常感谢您的辛勤工作。最欣赏。但是,我是初学者,仍在使用 mysqli 学习程序风格。将迁移到 pdo 和 oop 样式。我猜你的代码是 oop 风格的。我可以复制并粘贴您的代码,我相信它会起作用,但由于无法理解 oop 风格,我的学习不会有太大进展。因此,在此评论之后,您是否有机会通过保留上面的 oop 样式将其转换为程序样式?这样,我迁移到 pdo 后就可以学习 oop 风格的版本了。
  • 目前,我为这个项目构建的大部分页面都是程序风格的,所以不能在中间跳转到 oop 风格。我会感到困惑。我希望我没有要求太多。毕竟,我需要向各位前辈学习,而不是在没有完全理解我在复制什么的情况下复制粘贴。希望你能理解。
  • 好吧,应该差不多吧,我试着清理了你的一些多余的代码,没有时间全面测试,所以可能会有一些小问题,只是提前警告,但您应该能够从该更新中理解它的要点
  • 谢谢梅森。但是我到底应该放什么://你的代码我以为你给了我完整的代码。无论如何,我看到你已经创建了 2 个代码块。所以,在我的页面上,我首先插入第一个块,然后在它下面插入第二个?那样做对我来说是行不通的。我错过了什么?
  • "Your code" 是您在其中的所有 HTML \ display 内容,我不想粘贴到答案中。顶部生成页面的动态计数,如果列表长度超过变量 $max,则自动添加 First Prev \ Next Last。我还更改了 SQL 查询以处理 SQL 查询本身中的偏移量\限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2016-06-04
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2017-02-19
  • 2011-02-17
相关资源
最近更新 更多