PHP开发动物领养网站:修复查询动物时status=0也展示的问题
问题原因
get_animals函数的SQL查询逻辑存在条件覆盖问题:初始定义的WHERE status=1过滤规则,在传入$cat_id或者$animal_id参数时会被后续新赋值的查询语句完全覆盖,新查询没有携带status=1的限制,因此会查出所有状态的动物。- 代码同时存在SQL注入风险:直接将参数拼接进SQL语句的写法存在安全隐患。
修复方案
直接调整get_animals函数的查询拼接逻辑,保证status=1的基础过滤条件始终生效,不要被后续参数覆盖,修改后的代码如下:
function get_animals($cat_id='', $animal_id='') { global $con; // 基础查询始终保留status=1的过滤 $query = "SELECT * FROM animals WHERE status= 1"; // 追加分类过滤条件,而非覆盖原有查询 if($cat_id!='') { $cat_id = mysqli_real_escape_string($con, $cat_id); $query .= " AND category_name='$cat_id'"; } // 追加ID过滤条件,而非覆盖原有查询 if ($animal_id!='') { $animal_id = intval($animal_id); $query .= " AND id=$animal_id"; } return mysqli_query($con,$query); }
补充优化建议
如果要进一步提升安全性,建议使用mysqli预处理语句替代直接拼接SQL的写法,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Naive Gold
相关产品推荐
相关产品推荐

