可以在用户定义的php函数中编写try-and-catch语句


Can try and catch statements be written inside user defined php function

我有以下带有基本检查条件的代码,用于使用mysql和php过滤数据。

我有两个名为proc_reportproc_report_filtered的过程,一个获取所有数据,另一个显示基于表单中设置的from和to筛选器的数据

以前,当try-and-catch语句代替display_default_data()编写时,用于工作和显示所有数据的代码;在其他部分。但是为了缩短代码,我使用了函数display_default_data()来避免一次又一次地重写同一段代码。但令人惊讶的是,当我运行此代码时,我没有看到任何结果。

<?php
    function display_default_data()
    {
        try {
            $records = $db->query("call proc_report");
            $records->setFetchMode(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            die("Some problem getting data from database !!!" . $e->getMessage());
        }
    }
    if (isset($_POST['submit_filter'])) {
        if (isset($_POST['from'], $_POST['to'])) {
            if (!empty($_POST['from']) && !empty($_POST['to'])) {
                try {
                    $from = $_POST['from'];
                    $to = $_POST['to'];
                    $records = $db->prepare("CALL proc_report_filtered(?,?)");
                    $records->execute(array($from, $to));
                } catch (PDOException $e) {
                    die("Some problem getting data from database !!!" . $e->getMessage());
                }
            } else {
                echo "Enter some values before pressing Filter button !";
                display_default_data();
            }
        } else {
            echo "Please set values ";
            display_default_data();
        }
    } else {
        display_default_data();
    }
?>

这是在php中使用函数和try,catch语句的正确方式吗?如果哪里出了问题,请建议我。

我还觉得代码很长吗?有什么更好的缩短建议吗?

可以在用户定义的php函数中编写try-and-catch语句吗?

是的。

这是在php中使用函数和try,catch语句的编写方法吗?

没有。您永远不应该捕获错误异常来报告它。只需保留PDOExceptions即可。

我还觉得代码很长吗?

太长了。你所需要的所有代码只是

<?php
if (!empty($_POST['from']) && !empty($_POST['to'])) {
    $records = $db->prepare("CALL proc_report_filtered(?,?)");
    $records->execute(array($_POST['from'], $_POST['to']));
} else {
    $records = $db->query("call proc_report");
}
// here you can start displaying your records.

这与try/catch无关。相反,问题是您在函数的作用域之外访问$records

由于您只是在写它,所以您可以返回值,并将其分配给调用方站点上的变量:

function display_default_data()
{
    try {
        $records = $db->query("call proc_report");
        $records->setFetchMode(PDO::FETCH_ASSOC);
        return $records;
    } catch (PDOException $e) {
        die("Some problem getting data from database !!!" . $e->getMessage());
    }
}
/* ... */
$records = display_default_data(); // instead of just display_default_data();

注意,display_default_data的内部的$records外部的$records是两个不同的变量,恰好具有相同的(局部)名称。