-1

我制作了这个 php 脚本,我试图让它返回下一行和上一行,但是当我输入我的 id 脚本返回不同的东西时有一个问题,例如:

这是我的数据库

ID  String
1   Test 1
2   Test 2
3   Test 3
4   Test 4

因此,如果我输入 ./index.php?id=1 这将返回 id=2 和 id=2 => id=3 的结果,依此类推...我的问题是如何修复它以返回准确的结果而不是 +1 . 我尝试使用 <= 或 => 运算符,结果是正确的,但是我的链接不起作用。

这是脚本

<?php

    if(isset($_GET['id']))
{
    $id = (int)$_GET['id'];
}else
{
    $id = 0;
}

$stmt1 = $db->prepare("SELECT * FROM records WHERE id > ? ORDER BY id ASC LIMIT 1");
$stmt1->bindValue(1,$id);
$stmt1->execute();
$row = $stmt1->fetch();

$stmt2 = $db->prepare("SELECT * FROM records WHERE id < ? ORDER BY id DESC LIMIT 1");

$stmt2->bindValue(1,$id);
$stmt2->execute();
$row = $stmt2->fetch();




echo $row['id'];
echo "<br/>";
echo $row['string'];

?>
4

2 回答 2

1

我不确定问题是否像那样愚蠢,但我没有其他解释。

要拥有您的页面,您需要进行 3 次选择:

  1. 获取当前页面数据
  2. 获取prev id
  3. 得到下一个

但我只能看到 2 个选择

因此,您必须为要显示的页面选择数据

if(isset($_GET['id']))
{
    $sql = "SELECT * FROM records WHERE id = ?";
    $stm = $db->prepare($sql);
    $stm->execute(array($_GET['id']));
} else {
    $sql = "SELECT * FROM records ORDER BY id ASC LIMIT 1";
    $stm = $db->query($sql);
}
$row = $stm->fetch();

现在你可以去获取上一个和下一个 id

$sql = "SELECT id FROM records WHERE id < ? LIMIT 1";
$stm = $db->prepare($sql);
$stm->execute(array($row['id']));
$prev = $stm->fetchColumn();

$sql = "SELECT id FROM records WHERE id > ? LIMIT 1";
$stm = $db->prepare($sql);
$stm->execute(array($row['id']));
$next = $stm->fetchColumn();
于 2013-08-01T15:30:42.890 回答
-1

我正在努力让它返回下一排和上一排

表中没有“上一个”或“下一个”行。如果没有显式排序,表必须被视为无序的行。而且您不应该依赖 auto_increment 字段来按顺序编号。例如:

  • 因为桌子上有交错插入,
  • 因为允许服务器在删除行后重用 auto_increment。

您可能必须修改表结构以添加序列号:

CREATE TABLE tbl (id in primary key not null auto_increment,
 sequence_number int unique,
 value char(40));

在插入数据时,您可能会依赖以下内容:

INSERT INTO tbl (sequence_number, value)
VALUES (SELECT COUNT(*) FROM tbl, ?)

以及“下一个”和“上一个”的查询:

SELECT * FROM tbl WHERE sequence_number = ?-1 OR sequence_number = ?+1 
ORDER BY sequence_number;
于 2013-08-01T15:22:42.863 回答