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

PHP如何实现支持传入多SQL生成逻辑、自带日期迭代更新的通用查询函数

实现方案

你的需求完全可以实现,现有代码的问题仅在于传参方式错误:你当前调用my_try( sql_selection_1() )是先执行了SQL生成函数,把返回的SQL字符串传入了通用函数,并没有传入「SQL生成逻辑」本身。


修复方法

方法1:传入函数名作为回调(适配你现有代码结构)

PHP支持直接把函数名作为字符串传入,函数内部可以直接通过该字符串调用对应函数,仅需修改调用部分的代码即可:

// 错误写法:提前执行了SQL生成函数,仅传入了拼接好的固定SQL字符串
my_try( sql_selection_1() );
my_try( sql_selection_2() );

// 正确写法:传入函数名,把SQL生成逻辑作为回调传入通用函数
my_try( 'sql_selection_1' );
my_try( 'sql_selection_2' );

方法2:传入匿名函数(适合临时查询逻辑,无需单独定义命名函数)

如果是一次性使用的查询逻辑,可以直接传入匿名函数,不用单独定义sql_selection_x函数:

my_try(function($date_from, $date_till) {
    return "SELECT * FROM order_table WHERE pay_time BETWEEN '{$date_from}' AND '{$date_till}'";
});

优化建议(可选)

原有代码依赖全局变量$conn、$date1、$date2,容易出现变量污染问题,建议调整为参数传入,让函数更通用可控,优化后完整代码如下:

function my_try(mixed $SQL_SELECTION, mysqli $conn, string $start_date, string $end_date): array
{
    $now  = gmdate('Y-m-t');
    $result = [];
    $current_end = $end_date;

    while ($current_end <= $now) {
        $sql = $SQL_SELECTION($start_date, $current_end);
        $orders_completed = $conn->query($sql);
        $result[] = $orders_completed;

        $current_end = gmdate('Y-m-t', strtotime($current_end . '+30 days'));
    }

    return $result;
}

// 调用示例
$conn = new mysqli('host', 'user', 'pwd', 'dbname');
$res1 = my_try('sql_selection_1', $conn, '2023-01-01', '2023-01-31');
$res2 = my_try('sql_selection_2', $conn, '2023-01-01', '2023-01-31');

注意事项

  • 直接拼接日期变量到SQL语句存在SQL注入风险,生产环境建议改用PDO/MySQLi预处理语句传参,不要直接拼接变量到SQL字符串中。
  • 复杂日期计算建议使用DateTime类实现,比strtotime处理闰年、月末等边界场景更稳定。

内容的提问来源于stack exchange,提问作者rado1189

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:45:04