做一个简单的功能既然做了这么久

要给柒仟这个网站case页面做一个上一页、下一页的导航按钮,本来感觉很简单的,硬是做到现在,主要是因为是在以前代码的基础上面修改的,于是各种漏洞百出,自己写的代码自己都忘记了。这告诉我一个道理,想要问题要一步到位,别抱着以后去优化的心态去敲代码。

情况是这样的,数据库有n条数据,每一条对应网站的一个case子页面,每个页面用数据的id来区分,一开始,我是这么做上一页和下一页链接的:获取当前页面的id,分别+1和-1就得到上一页下一页的链接,后来发现一个问题是,数据库中的记录是不连贯的,特么的请注意id是不连贯的,出现这样的情况是有时网站编辑会删掉一些不必要的记录,这样一来,比如删掉的记录的id为25,那么id为24的这个页面上的下一页按钮就是错误的,因为下一页应该是id为26或者27或者28等等的记录生成的页面,想到这,晚上要睡就开始改代码,本来思路很明了的,如下:

查询整个个表,得到最小的id和最大的id:

$link = $case->order('id ASC')->select();
$min_id = $link[0]['id'];
$max_id = $link[count($link)-1]['id'];

得到下一页的id,将当前id+1得到暂时的下一个id,循环判断下一个id是否能从数据库取得数据,如果不能,这让这个id和最大的id $max_id进行比较,如果比这个id小,则让id++并继续循环,如果大于最大的id,则跳出循环(说明当前页面已经是最新的页面),因为通过这个id查询不到记录,于是进入这个id的页面的话会跳到错误提示页面:

if ($data == null)
    $this->error("不存在该作品!", 'tp_case');
$next_id = I('get.id')+1;
while(($case->where('id="'.$next_id.'"')->getField('id')) == false)
{
    if ($next_id >= $max_id) {
        break;
    }
    $next_id++;
}
$this->assign('next_case', $next_id);

同理,上一页id方法类似,不必多说。最大的障碍是没有仔细看以前写的东西,还有就是刚开始忘记了要判断要查询的id是否在有效id区间。

更新

后来,发现“下一篇文章”这样的功能完全没有必要这么复杂,虽然上面的代码行的通,但是我相信一个有经验的程序员绝对不会用上面的代码来完成这样一个简单的功能,当时选择了用这个方案,是因为经验不够,文档看的少,如果多看看书,完全是可以写出下面这样一行就能搞定的代码的:

$nextId = $case->where("id > " . intval(I('get.id')))->limit(1)->getField('id');

发表评论

电子邮件地址不会被公开。 必填项已用*标注