所以我最近开始学习PHP和PDO。当我阅读一些教程时,我创建了一个有2页的简单网站。 index.php
和single.php
。在索引页面上,我从数据库加载图像(这样做)。然后,当我点击单张图像时,转到显示此图像的single.php
(也是这样做)。现在我正在尝试从数据库为下一张和上一张图像制作按钮。我不太确定这是如何工作的,但在阅读了一些教程之后我觉得我已经有了这个想法。
这是重定向到index.php
single.php
上的链接
<a href="single.php?image_id='.$row['image_id'].'">
<img src="'.$row['image_name'].'"/>
</a>
这是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
,next 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>':'';
答案 0 :(得分:1)
您的代码中存在许多问题:
prepare
方法不会直接返回结果。它返回一个可执行语句。他们需要明确执行。$image_id
放在准备好的语句中,而不是在准备之前附加它。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>':'';