使用AJAX从MySQL获取上下行时,点击上一页始终返回首行的问题
问题分析与解决方案
我来帮你搞定这个问题!你的核心问题出在获取上一条数据时的排序逻辑缺失:
当你点击「上一页」按钮时,后端代码只筛选了 id < 当前card_id 的记录,但没有指定排序规则。数据库默认会按id升序返回结果,getOne() 方法就会取到符合条件的第一条记录(也就是id最小的那条),这就是为什么你每次点上一页都会回到第一条数据。
我们需要的是当前id的前一条数据,也就是所有id < 当前card_id的记录中,id最大的那条——这就需要给查询加上ORDER BY id DESC的排序规则。
修改后的后端PHP代码
<?php include 'config.php'; if(isset($_POST["card_id"])) { $card_id = $_POST["card_id"]; if(isset($_POST["next"])){ // 下一条:找id大于当前的,按id升序取第一条 $db->where("id", $card_id, ">" ) ->orderBy("id", "ASC"); $flaschcard = $db->getOne('cards') ; } if(isset($_POST["prev"])){ // 上一条:找id小于当前的,按id降序取第一条(也就是最大的那个符合条件的id) $db->where("id", $card_id, "<" ) ->orderBy("id", "DESC"); $flaschcard = $db->getOne('cards') ; } if(isset($flaschcard)) { echo json_encode($flaschcard); } }
为什么这样修改?
- 对于「下一条」:我们需要比当前id大的最小id,所以按
id ASC排序后取第一条,逻辑正确。 - 对于「上一条」:我们需要比当前id小的最大id,所以按
id DESC排序后取第一条,这样就能拿到真正的前一条数据,而不是跳到最开头。
前端小优化(可选)
你可以把前端的alert(card_id)换成console.log(card_id),这样调试信息会输出在浏览器控制台,不会影响用户体验:
// 替换success里的alert console.log('当前card_id:', card_id);
这样修改后,点击上一页按钮就会正确返回上一条数据啦!
内容的提问来源于stack exchange,提问作者Marcos T. Gobriel
相关产品推荐
相关产品推荐

