PHP SQL搜索功能如何正确新增城市筛选条件不破坏原有功能
问题原因
你之前添加的$data_sql .= " AND city='newyork' ";不生效,核心是两个错误:
- 只改了取列表数据的SQL,前面统计总结果数的
$count_sql没加城市筛选,会导致分页总数和实际返回的列表数据对不上;要是拼接位置不对(比如拼在LIMIT子句后面)还会直接报SQL语法错误 - 直接把字段值拼到SQL语句里,不仅有SQL注入风险,也没同步更新预处理的参数绑定,执行时占位符和传入参数对不上,自然拿不到正确结果
正确改法
直接改公共的基础SQL模板就行,这样统计总数、取列表两个查询都会自动带上城市筛选,完全不会破坏原来的标签匹配、分页功能,还能保留预处理的安全性:
$name=str_replace(' ', '%', $_POST['query']); $newsearch = "%$name%"; // 要筛选的城市值,后续要做动态城市筛选直接替换这个变量即可 $target_city = 'newyork'; // 基础SQL新增city字段的匹配占位符 $base_sql = "SELECT %s FROM posts WHERE tags LIKE ? AND city = ?"; $count_sql = sprintf($base_sql, "count(*)"); $stmt = $connect->prepare($count_sql); // 按占位符顺序传入参数:标签匹配值、城市值 $stmt->execute([$newsearch, $target_city]); $total_data = $stmt->fetchColumn(); $data_sql = sprintf($base_sql, "*")." LIMIT ?,?"; $stmt = $connect->prepare($data_sql); // 列表查询按占位符顺序传参:标签匹配值、城市值、分页起始位置、每页条数 $stmt->execute([$newsearch, $target_city, $start, $limit]); $result = $stmt->fetchAll();
关键注意事项
- 不要单独给
$data_sql或者$count_sql拼接条件,只要修改公共的$base_sql,两个查询会自动同步条件,不会漏加规则 - 所有传入SQL的动态值都要用
?做占位符,通过execute数组传参,不要直接拼到SQL字符串里 - 传入execute的参数顺序,必须和SQL里占位符的出现顺序完全一致,否则会出现字段匹配错误
内容的提问来源于stack exchange,提问作者AbleInfosoft Gmail
相关产品推荐
相关产品推荐

