MySQL分页查询异常:PHPMyAdmin正常但脚本返回全量结果
问题解决:COUNT查询结果与预期不符的原因及修复
嘿,一眼就瞅到问题所在了——当$crawlId存在时,你的统计查询漏掉了domain_available='Y'这个关键过滤条件!
看你这段代码:
if (isset($crawlId)) { $total_results = DB::getInstance()->selectValue("SELECT count(*) FROM `domains` WHERE`domain_crawler_id`='{$crawlId}'"); } else { $total_results = DB::getInstance()->selectValue("SELECT count(*) FROM `domains` WHERE `domain_available`='Y' AND `domain_category`!='N/A' AND `domain_crawler_id`='0'"); }
当URL里带了urlId参数时,你统计的是该crawlId下的所有域名,完全没过滤“可用(Y)”的条件,这就导致返回的是全量数据(1300+),而不是你想要的符合domain_available='Y'的57条。
快速修复
把$crawlId分支的统计查询补上缺失的条件,和数据查询的条件保持一致:
if (isset($crawlId)) { // 补上domain_available='Y'条件 $total_results = DB::getInstance()->selectValue("SELECT count(*) FROM `domains` WHERE `domain_available`='Y' AND `domain_crawler_id`='{$crawlId}'"); } else { $total_results = DB::getInstance()->selectValue("SELECT count(*) FROM `domains` WHERE `domain_available`='Y' AND `domain_category`!='N/A' AND `domain_crawler_id`='0'"); }
额外的安全&可维护性建议
- 赶紧修复SQL注入风险:你现在直接把
$crawlId(来自$_GET['urlId'])拼进SQL里,这是典型的注入漏洞!建议用你查询数据时的参数绑定方式来处理:
if (isset($crawlId)) { $total_results = DB::getInstance()->selectValue( "SELECT count(*) FROM `domains` WHERE `domain_available`='Y' AND `domain_crawler_id`=:crawlId", [ 'crawlId' => [ 'type' => PDO::PARAM_STR, 'value' => $crawlId ] ] ); }
这样能彻底避免恶意参数带来的注入攻击。
- 复用查询条件,避免重复犯错:可以把查询条件抽成变量,让数据查询和统计查询共用一套条件,以后修改条件时只改一处就行:
// 定义共用的查询条件和参数 $whereClause = ''; $queryParams = []; if (isset($crawlId)) { $whereClause = "WHERE `domain_available`='Y' AND `domain_crawler_id`=:crawlId"; $queryParams['crawlId'] = ['type' => PDO::PARAM_STR, 'value' => $crawlId]; } else { $whereClause = "WHERE `domain_available`='Y' AND `domain_category`!='N/A' AND `domain_crawler_id`='0'"; } // 数据查询 $rows = DB::getInstance()->select( "SELECT * FROM `domains` {$whereClause} ORDER BY `{$sort}` DESC LIMIT :from, :max_results", array_merge($queryParams, [ 'from' => ['type' => PDO::PARAM_INT, 'value' => $from], 'max_results' => ['type' => PDO::PARAM_INT, 'value' => $max_results] ]) ); // 统计查询 $total_results = DB::getInstance()->selectValue( "SELECT count(*) FROM `domains` {$whereClause}", $queryParams );
这样就再也不会出现“数据查询和统计查询条件不一致”的问题了,代码维护起来也轻松很多。
内容的提问来源于stack exchange,提问作者colinreedy674
相关产品推荐
相关产品推荐

