【问题标题】:Convert mysqli pagination to prepared statement pagination将 mysqli 分页转换为准备好的语句分页
【发布时间】:2013-08-25 21:30:43
【问题描述】:

mysqli 的当前工作代码如下。我想将其转换为准备好的陈述。基本上有三个 sql 查询需要转换为准备好的语句。第一部分是我最难弄清楚获得计数值的准备方法的部分,我最终设法弄明白了。

<?php
// Script and tutorial written by Adam Khoury @ developphp.com
// Line by line explanation : youtube.com/watch?v=T2QFNu_mivw
include_once("storescripts/connect_to_mysqli.php");
// This first query is just to get the total count of rows
$sql2 = "SELECT COUNT(id) FROM products ";
$query2 = mysqli_query($myConnection, $sql2);
$row = mysqli_fetch_row($query2);
// Here we have the total row count
$rows = $row[0];
// This is the number of results we want displayed per page
$page_rows = 10;
// This tells us the page number of our last page
$last = ceil($rows/$page_rows);
// This makes sure $last cannot be less than 1
if($last < 1){
    $last = 1;
}
// Establish the $pagenum variable
$pagenum = 1;
// Get pagenum from URL vars if it is present, else it is = 1
if(isset($_GET['pn'])){
    $pagenum = preg_replace('#[^0-9]#', '', $_GET['pn']);
}
// This makes sure the page number isn't below 1, or more than our $last page
if ($pagenum < 1) { 
    $pagenum = 1; 
} else if ($pagenum > $last) { 
    $pagenum = $last; 
}
// This sets the range of rows to query for the chosen $pagenum
$limit = 'LIMIT ' .($pagenum - 1) * $page_rows .',' .$page_rows;
// This is your query again, it is for grabbing just one page worth of rows by applying $limit
$sql = "SELECT id,product_name, price FROM products ORDER BY product_name DESC $limit";
$query = mysqli_query($myConnection, $sql);
// This shows the user what page they are on, and the total number of pages
$textline1 = "Products (<b>$rows</b>)";
$textline2 = "Page <b>$pagenum</b> of <b>$last</b>";
// Establish the $paginationCtrls variable
$paginationCtrls = '';
// If there is more than 1 page worth of results
if($last != 1){
    /* First we check if we are on page one. If we are then we don't need a link to 
       the previous page or the first page so we do nothing. If we aren't then we
       generate links to the first page, and to the previous page. */
    if ($pagenum > 1) {
        $previous = $pagenum - 1;
        $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$previous.'">Previous</a> &nbsp; &nbsp; ';
        // Render clickable number links that should appear on the left of the target page number
        for($i = $pagenum-4; $i < $pagenum; $i++){
            if($i > 0){
                $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
            }
        }
    }
    // Render the target page number, but without it being a link
    $paginationCtrls .= ''.$pagenum.' &nbsp; ';
    // Render clickable number links that should appear on the right of the target page number
    for($i = $pagenum+1; $i <= $last; $i++){
        $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
        if($i >= $pagenum+4){
            break;
        }
    }
    // This does the same as above, only checking if we are on the last page, and then generating the "Next"
    if ($pagenum != $last) {
        $next = $pagenum + 1;
        $paginationCtrls .= ' &nbsp; &nbsp; <a href="'.$_SERVER['PHP_SELF'].'?pn='.$next.'">Next</a> ';
    }
}


$dynamicList = '';
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){
    $id = $row["id"];
    $product_name = $row["product_name"];
    $price = $row["price"];
    $dynamicList .= "
                <li><div class='product'>
                <a href='product.php?id=$id' class='info'>
                <span class='holder'>
                <img src='inventory_images/$id.jpg' alt='$product_name' />
                <span class='book-name'>$product_name</span>
                </a>
                 <a href='product.php?id=$id' class='buy-btn'>RM<span class='price'>$price</span></a>
                </div>
                </li>

              ";
}
// Close your database connection
mysqli_close($myConnection);
?>
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{ font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;}
div#pagination_controls{font-size:21px;}
div#pagination_controls > a{ color:#06F; }
div#pagination_controls > a:visited{ color:#06F; }
</style>
</head>
<body>
<div>
  <h2><?php echo $textline1; ?> Paged</h2>
  <p><?php echo $textline2; ?></p>
  <p><?php echo $dynamicList; ?></p>
  <div id="pagination_controls"><?php echo $paginationCtrls; ?></div>
</div>
</body>
</html>

提前感谢您的帮助

【问题讨论】:

    标签: php mysql mysqli pagination


    【解决方案1】:

    这个答案已经用Paginate result set having written the query with prepared statements,方法2解决了。

    完整代码供参考如下。谢谢

    <?php
    // Script and tutorial written by Adam Khoury @ developphp.com
    // Line by line explanation : youtube.com/watch?v=T2QFNu_mivw
    include_once("storescripts/connect_to_mysqli.php");
    // This first query is just to get the total count of rows
    $stmt=$myConnection->prepare('SELECT COUNT(id) FROM products');
    // Don't use bind_result()...
    // execute your statement
    $stmt->execute();
    // Get result set into a MySQLi result resource
    $result = $stmt->bind_result($id);
    
    // array to hold all rows
    $rows = array();
    
    // All results bound to output vars
    while ($stmt->fetch()) {
      // Append an array containing your result vars onto the rowset array
      $rows[] = array(
        'id' => $id
      );
    }
      $rows=$id;
    
    
    // This is the number of results we want displayed per page
    $page_rows = 10;
    // This tells us the page number of our last page
    $last = ceil($rows/$page_rows);
    // This makes sure $last cannot be less than 1
    if($last < 1){
        $last = 1;
    }
    // Establish the $pagenum variable
    $pagenum = 1;
    // Get pagenum from URL vars if it is present, else it is = 1
    if(isset($_GET['pn'])){
        $pagenum = preg_replace('#[^0-9]#', '', $_GET['pn']);
    }
    // This makes sure the page number isn't below 1, or more than our $last page
    if ($pagenum < 1) { 
        $pagenum = 1; 
    } else if ($pagenum > $last) { 
        $pagenum = $last; 
    }
    $dynamicList = "";
    $stmt = $myConnection->prepare('SELECT id,product_name,price FROM products ORDER BY product_name LIMIT ?,? ');
    $begin= ($pagenum - 1) * $page_rows;
    $end= $page_rows;
    $stmt->bind_param('ii',$begin,$end);
    $stmt->execute();
            /* store result */
            $stmt->store_result();
            /* get the row count */
            $count = $stmt->num_rows;
            if ($count >= 1) {
                $stmt->bind_result($id, $product_name, $price);
    // This shows the user what page they are on, and the total number of pages
    $textline1 = "Products (<b>$rows</b>)";
    $textline2 = "Page <b>$pagenum</b> of <b>$last</b>";
    // Establish the $paginationCtrls variable
    $paginationCtrls = '';
    // If there is more than 1 page worth of results
    if($last != 1){
        /* First we check if we are on page one. If we are then we don't need a link to 
           the previous page or the first page so we do nothing. If we aren't then we
           generate links to the first page, and to the previous page. */
        if ($pagenum > 1) {
            $previous = $pagenum - 1;
            $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$previous.'">Previous</a> &nbsp; &nbsp; ';
            // Render clickable number links that should appear on the left of the target page number
            for($i = $pagenum-4; $i < $pagenum; $i++){
                if($i > 0){
                    $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
                }
            }
        }
        // Render the target page number, but without it being a link
        $paginationCtrls .= ''.$pagenum.' &nbsp; ';
        // Render clickable number links that should appear on the right of the target page number
        for($i = $pagenum+1; $i <= $last; $i++){
            $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
            if($i >= $pagenum+4){
                break;
            }
        }
        // This does the same as above, only checking if we are on the last page, and then generating the "Next"
        if ($pagenum != $last) {
            $next = $pagenum + 1;
            $paginationCtrls .= ' &nbsp; &nbsp; <a href="'.$_SERVER['PHP_SELF'].'?pn='.$next.'">Next</a> ';
        }
    }
    
    
    while ($stmt->fetch()) {
                    "$id, $product_name, $price,";
                    $dynamicList .= "
                    <li><div class='product'>
                    <a href='product.php?id=$id' class='info'>
                    <span class='holder'>
                    <img src='inventory_images/$id.jpg' alt='$product_name' />
                    <span class='book-name'>$product_name</span>
                    </a>
                     <a href='product.php?id=$id' class='buy-btn'>RM<span class='price'>$price</span></a>
                    </div>
                    </li>
    
                  ";
    }
        }
    // Close your database connection
    mysqli_close($myConnection);
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <style type="text/css">
    body{ font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;}
    div#pagination_controls{font-size:21px;}
    div#pagination_controls > a{ color:#06F; }
    div#pagination_controls > a:visited{ color:#06F; }
    </style>
    </head>
    <body>
    <div>
      <h2><?php echo $textline1; ?> Paged</h2>
      <p><?php echo $textline2; ?></p>
      <p><?php echo $dynamicList; ?></p>
      <div id="pagination_controls"><?php echo $paginationCtrls; ?></div>
    </div>
    </body>
    </html>
    

    【讨论】:

      【解决方案2】:
      $stmt=$myConnection->prepare('SELECT COUNT(id) FROM products');
      // Don't use bind_result()...
      // execute your statement
      $stmt->execute();
      // Get result set into a MySQLi result resource
      $result = $stmt->bind_result($id);
      
      // array to hold all rows
      $rows = array();
      
      // All results bound to output vars
      while ($stmt->fetch()) {
        // Append an array containing your result vars onto the rowset array
        $rows[] = array(
          'id' => $id
        );
      }
        $rows=$id;
      

      第一部分。我想你已经明白了

      【讨论】:

      • 为什么在这里使用while和array?
      • 我实际上只是想检索 Count 数..有更好的方法来获取这个值吗?
      【解决方案3】:

      试试把报错放到mysqli语句上看看有没有错误:

      $stmt=$myConnection->prepare('SELECT id FROM products');
      
      // due to syntax error or other reasons may be like privileges prepare can fail so
      if ( false===$stmt ) 
      {
        // hope you will use better than die to handle but here's only example.
        die('prepare() failed: ' . htmlspecialchars($myConnection->error));
      }
      
      $ExecuteStmt = $stmt->execute();
      // execute() can also fail for various reasons.
      if ( false===$ExecuteStmt ) 
      {
        //again same thing about die();
        die('execute() failed: ' . htmlspecialchars($myConnection->error));
      }
      
      $myConnection->close();
      

      希望这会有所帮助。

      【讨论】:

      • 我得到了这个数组 array(1) { [0]=> array(1) { ["id"]=> int(50) } },我如何提取这 50 个数字?
      猜你喜欢
      • 2023-04-09
      • 2013-12-01
      • 2017-04-09
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2012-08-23
      相关资源
      最近更新 更多