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
相关产品推荐
相关产品推荐

