2015-06-30 127 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

相关问题