2013-08-24 56 views
0

與mysqli的當前工作代碼如下。我想將其轉換爲預先準備的語句。基本上有三個sql查詢需要轉換爲準備好的語句。第一部分對我來說是最困難的部分,我想出了計算價值的準備方法,而我最終還是設法弄清楚了。將mysqli分頁轉換爲預處理語句分頁

<?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> 

由於事先的任何援助

回答

0
$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; 

的第一部分。我想你已經得到它

+0

爲什麼while和array在這裏? –

+0

我其實只是試圖檢索計數number..any更好的方式來獲得這個值? –

-1

嘗試,並把錯誤報告,看看是否有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(); 

希望這有助於。

+0

我得到這個數組數組(1){[0] => array(1){[「id」] => int(50)}},我如何提取50個數? – user2712729

+0

不用擔心,全部排序爲 – user2712729

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>