首页 > 解决方案 > 函数内部的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() );

标签: phpmysql

解决方案


据我了解,您知道所有日期和所有日期。为什么不使用数组?让我们看看,我们如何解决您的问题。

$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()方法并迭代结果。

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


推荐阅读