You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:15:00