php - 函数内部的PHP函数,变量可变
问题描述
有没有可能做这样的事情?
结果我需要一个函数,我可以在其中插入更多带有日期更新的sql选择......
function my_try($SQL_SELECTION){
global $conn, $date1, $date2;
$now = gmdate('Y-m-t');
$loop = 0;
$result = array();
while ($date2 <= $now) {
// $orders_completed = $conn->query(sql_selection_1($date1, $date2)); // Original.
$orders_completed = $conn->query($SQL_SELECTION($date1, $date2)); // Here I need to update sql with new date selection.
$result[] = $orders_completed;
$date2 = gmdate('Y-m-t', strtotime($date2 . '+30 days'));
$loop++;
}
return $result;
}
function sql_selection_1($date_from, $date_till) {
$sql = "SELECT '$date_till'..";
return $sql;
}
function sql_selection_2($date_from, $date_till) {
$sql = "SELECT '$date_till'...";
return $sql;
}
my_try( sql_selection_1() );
my_try( sql_selection_2() );
解决方案
据我了解,您知道所有日期和所有日期。为什么不使用数组?让我们看看,我们如何解决您的问题。
$data = [
[
'date_from' => '2019-10-29',
'date_till' => '2020-10-28',
],
[
'date_from' => '2020-10-29',
'date_till' => '2021-10-28',
],
];
只需将所有日期间隔收集到一个数组中,然后编写一个迭代该数组的函数。
function intervalIteration(PDO $database, array $data): array
{
$sql = "SELECT row.id FROM table row WHERE row.date BETWEEN :date1 AND :date2";
$stmt = $database->prepare($sql);
$rowsets = [];
foreach ($data as $interval) {
$result = $stmt->execute([
'date1' => $interval['date_from'],
'date2' => $interval['date_until'],
]);
if ($result === false) {
// some fancy code to deal with execution errors
}
$rowset = $stmt->fetch();
if ($rowset === false) {
// some fancy code to deal with fetch errors
}
// at this point you could update the found rowset with another sql statement
$rowsets[] = $rowset;
}
return $rowsets;
}
上面的函数接受$data
我们定义的数组。该数组包含我们的日期间隔。该函数还需要一个$database
PDO 对象,因为global
应该避免使用。这不是如今的编码方式。该函数遍历$data
数组并从数据库中获取单个行集,其中间隔在两个提到的日期之间。
您可以通过创建一个更复杂的 sql 查询来做得更好,该查询一次匹配具有给定日期间隔的所有行集。使用此 sql 查询,您可以使用该PDOStatement::fetchAll()
方法并迭代结果。
请记住,上面显示的代码不是与您的问题完全匹配的有效解决方案。它展示了如何使用数组和迭代来解决您的问题。
推荐阅读
- html - 无法在 React Styled Component 输入中定位最后一个类型
- azure-active-directory - 无法从 ROPC 访问 power bi api
- google-chrome - 如何在基于 Chromium 的浏览器中查看下载错误日志?
- reactjs - 如何配置 React 以将登录表单包与主代码分开?
- r - 为什么 str_replace_all 没有替换 R 中的字符串?
- node.js - Sveltekit - 500 进程未定义或导出未定义
- c# - 当今天更改为第二天时,如何在asp.net中触发事件?
- performance - Selenium webdriver 需要 25 分钟来识别并单击一个元素
- r - 在 gt 中的行组行上重复列标签
- redis - 如何在 ubuntu 服务器 18.04 上将 redis 作为服务激活