使用PHP+MySQL为数据表添加按日期搜索功能的实现问题
按日期搜索功能实现方案
现有代码核心问题
- 后端未读取前端传入的日期参数:前端日期输入的
name="search",后端当前只处理searchPhrase字段的模糊搜索,完全没有对该日期参数做处理 - SQL语法错误:原始查询语句已经自带
WHERE子句,后续拼接搜索条件时又新增了WHERE关键字,会导致SQL语法报错无法执行 - 默认查询逻辑固定:默认写死只查昨天的数据,没有留自定义日期查询的逻辑入口
- 存在SQL注入风险:直接将用户传入的参数拼接到SQL语句中,未做参数转义或预处理
调整后的代码
前端代码(可选优化,避免参数命名混淆)
<form action="" method="GET"> <input type="date" name="search_date" class="form-control" placeholder="选择查询日期"> <button type="submit" class="btn btn-primary">Search</button> </form>
后端PHP代码
function getRecords($params) { $rp = isset($params['rowCount']) ? $params['rowCount'] : 10; $page = isset($params['current']) ? $params['current'] : 1; $start_from = ($page - 1) * $rp; $sql = $sqlRec = $sqlTot = $where = ''; $conditions = []; // 原有模糊搜索逻辑 if (!empty($params['searchPhrase'])) { // 参数转义避免注入,生产环境推荐改用PDO预处理 $searchPhrase = addslashes($params['searchPhrase']); $conditions[] = "( fullname LIKE '{$searchPhrase}%' OR email LIKE '{$searchPhrase}%' OR phone LIKE '{$searchPhrase}%' )"; } // 新增日期搜索逻辑 if (!empty($params['search_date'])) { $searchDate = addslashes($params['search_date']); $conditions[] = "DATE_FORMAT(created_at, '%Y-%m-%d') = '{$searchDate}'"; } // 无传入日期时默认查昨天数据 if (empty($params['search_date'])) { $conditions[] = "DATE_FORMAT(created_at, '%Y-%m-%d') = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)"; } // 拼接WHERE条件 if (!empty($conditions)) { $where = " WHERE " . implode(' AND ', $conditions); } // 拼接排序逻辑 if (!empty($params['sort'])) { $sortField = addslashes(key($params['sort'])); $sortType = addslashes(current($params['sort'])); $where .= " ORDER By {$sortField} {$sortType} "; } // 基础查询去掉原写死的WHERE条件 $sql = "SELECT * FROM `api`"; $sqlTot .= $sql; $sqlRec .= $sql; // 拼接所有条件 if (!empty($where)) { $sqlTot .= $where; $sqlRec .= $where; } if ($rp != -1) $sqlRec .= " LIMIT " . $start_from . "," . $rp; // 此处可补充查询执行和结果返回逻辑 // $total = mysqli_num_rows(mysqli_query($conn, $sqlTot)); // $records = mysqli_fetch_all(mysqli_query($conn, $sqlRec), MYSQLI_ASSOC); // return ['total' => $total, 'rows' => $records]; }
注意事项
- 生产环境建议完全替换
addslashes转义方案,改用PDO预处理语句执行查询,彻底避免SQL注入风险 - 若后续需要支持日期范围搜索,可新增结束日期输入框,后端调整日期条件为
created_at BETWEEN '开始日期 00:00:00' AND '结束日期 23:59:59',查询性能优于DATE_FORMAT函数处理
内容的提问来源于stack exchange,提问作者ouchchane
相关产品推荐
相关产品推荐

