MySQL下一个和prev记录问题

时间:2013-08-01 15:10:13

标签: php mysql pdo

我制作了这个PHP脚本,我试着让它返回下一个和previus行,但是当我输入我的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'];

?>

2 个答案:

答案 0 :(得分:1)

我不确定问题是否如此愚蠢,但我没有其他解释。

要获得您的页面,您需要进行3次选择:

  1. 获取当前页面数据
  2. 获得prev id
  3. 获得下一个
  4. 但我只能看到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();
    

答案 1 :(得分:-1)

  

我试着让它返回下一个和previus行

表中没有“上一个”或“下一个”行。如果没有显式排序,则必须将表视为行的无序 set 。并且您不应该依赖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, ?)

查询“next”和“prev”:

SELECT * FROM tbl WHERE sequence_number = ?-1 OR sequence_number = ?+1 
ORDER BY sequence_number;