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数组。这个数组包含我们的日期间隔。该函数也接受一个$databasePDO对象,因为应该避免使用global。这可不是现在的编程方式。该函数在$data数组上迭代,并从数据库中获取单个行集,其中的间隔位于上述两个日期之间。

您可以通过创建一个更复杂的sql查询来做得更好,它将所有行集与给定的日期间隔一次匹配。使用这个sql查询,您可以使用PDOStatement::fetchAll()方法并遍历结果。

请记住,上面显示的代码并不是一个与您的问题完全匹配的工作解决方案。它展示了如何使用数组和迭代来解决问题。

最新更新