2015-06-30 79 views
0

因此,我最近開始學習PHP和PDO。當我閱讀一些教程時,我創建了一個包含2頁的簡單網站。 index.phpsingle.php。在索引頁面上,我從數據庫加載圖像(這已完成)。然後,當我點擊單張圖像時,請轉至顯示此圖像的single.php(也是這樣做的)。現在我正在嘗試爲數據庫中的下一個和上一個圖像製作按鈕。我不太確定這是如何工作的,但在閱讀了一些教程後,我想我已經明白了。獲取上一個和下一個按鈕的工作

這是在其重定向到single.php

<a href="single.php?image_id='.$row['image_id'].'"> 
    <img src="'.$row['image_name'].'"/> 
</a> 

這裏index.php鏈路single.php(的一部分)

if(isset($_GET['image_id']) && is_numeric($_GET['image_id'])) 
{ 
    $image_id = $_GET['image_id']; 
    $result = $pdo->prepare("SELECT * FROM images WHERE image_id= ? LIMIT 1"); 
    if ($result->execute(array($_GET['image_id']))) 
    {  
     if($row = $result->fetch()) 
     { 
      $update = $pdo->prepare("UPDATE images SET image_hits = image_hits + 1 WHERE image_id = ?"); 
      $update->bindParam(1, $_GET['image_id'], PDO::PARAM_INT); 
      $update->execute(); 
      echo ' // image data '; 
     } 
    } 
} 

如果我理解正確的是如何工作的,我需要電流id應該是image_id,下一個id和prev id。這聽起來很簡單..但不適合我。我有我需要這樣的東西,但問題是在哪裏以及如何將它實現到當前的代碼中?

$result = $pdo->prepare("SELECT image_id FROM images WHERE image_id > $image_id ORDER BY image_id ASC LIMIT 1"); 

if($result){ 
    $next_id = $result->fetch(); 
} 

//get previous picture id 
$result = $pdo->prepare("SELECT image_id FROM images WHERE image_id < $image_id ORDER BY image_id DESC LIMIT 1"); 
if($result){ 
    $prev_id = $result->fetch(); 
} 

if($result){ 

    //construct next/previous button 
    $prev_button = (isset($prev_id) && $prev_id>0)?'<a href="#" data-id="'.$prev_id.'"><img src="prev.png" /></a>':''; 
    $next_button = (isset($next_id) && $next_id>0)?'<a href="#" data-id="'.$next_id.'"><img src="next.png" /></a>':''; 

回答

1

有在你的代碼中的許多問題:

  1. prepare方法沒有直接返回結果。它返回一個可執行語句。他們需要明確執行。
  2. 使用預處理語句,您應該通過準備好的語句將$image_id,而不是在準備之前附加它。
  3. 方法fetch()不返回$prev_id$next_id。相反,它返回一個結果行。默認情況下,它應該是一個關聯數組,其鍵與行中的字段相同。

要解決你的代碼應該是這個樣子:

// get next picture id 
$stmt = $pdo->prepare('SELECT image_id FROM images WHERE image_id > :image_id ORDER BY image_id ASC LIMIT 1'); 
if($stmt){ 
    $stmt->execute(array(':image_id' => $image_id)); 
    if (($row = $result->fetch()) !== FALSE) { 
     $next_id = $row['image_id']; 
    } 
} 

// get previous picture id 
$stmt = $pdo->prepare('SELECT image_id FROM images WHERE image_id < :image_id ORDER BY image_id DESC LIMIT 1'); 
if($stmt){ 
    $stmt->execute(array(':image_id' => $image_id)); 
    if (($row = $result->fetch()) !== FALSE) { 
     $prev_id = $row['image_id']; 
    } 
} 

// construct next/previous button 
$prev_button = (isset($prev_id) && $prev_id>0)?'<a href="#" data-id="'.$prev_id.'"><img src="prev.png" /></a>':''; 
$next_button = (isset($next_id) && $next_id>0)?'<a href="#" data-id="'.$next_id.'"><img src="next.png" /></a>':''; 
+0

謝謝你的答案。這部分代碼應該放在哪裏?在if語句之後if($ result-> execute(array($ _ GET ['image_id'])))還是別的地方? – Jared

+0

'execute'中的輸入參數應該是一個assoc數組。密鑰應該與準備好的查詢字符串中的佔位符相匹配。例如,因爲我使用':image_id'作爲SQL字符串中的佔位符,所以我在執行中使用了'array(':image_id'=> $ image_id)'。您可以閱讀[相關文檔](http://php.net/manual/en/pdostatement.execute.php)以供進一步學習。 –

+0

好的,我已經幾乎可以工作,但是next和prev鏈接存在問題。這就像'http:// localhost/sitefolder/2 /'應該是'http://localhost/single.php?image_id = 2'。我如何得到這個?我沒有.htaccess或可以重寫URL的東西? – Jared

相關問題