【问题标题】:Can try and catch statements be written inside user defined php function可以在用户定义的 php 函数中编写 try 和 catch 语句
【发布时间】:2016-05-19 12:38:07
【问题描述】:

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

我有两个名为 proc_reportproc_report_filtered 的过程,一个用于获取所有数据,另一个用于根据表单中设置的 from 和 to 过滤器显示数据。 (submit_filter 是提交按钮的名称,fromto 是表单中的两个输入字段。)

以前,当 try 和 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 mysql pdo try-catch


    【解决方案1】:

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

    是的。

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

    没有。 You should never catch an error exception to report it。只需不要理会 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.
    

    【讨论】:

    • 它看起来很紧凑,但我们并没有错过检查变量是否 isset 和提交按钮是否被按下(在我的例子中是 isset submit_filter)
    • 不,我们不是。说出我们需要这些检查的一个原因
    • 我使用 isset 和 submit_filter 来检查按钮是否被点击。因为我们只需要在单击按钮时执行代码。还 isset 检查是否设置了 from 和 to 的值。您完美建议的代码,但我想知道为什么不使用 isset。在教程中,我看到人们使用它并说同时使用 isset 和 not empty 的好习惯。你能解释一下 isset 的重要性吗?还有最后一个问题。您还跳过( $records->setFetchMode(PDO::FETCH_ASSOC); )不需要每次都提及 fetchmode ?
    • 任何说你必须同时使用 isset 和 empty 的教程你应该扔掉,因为它的作者从未阅读过 says 的 PHP 手册“一个变量被认为是空的 如果它不存在,或者如果它的值等于 FALSE。"表示如果变量不为空,则它总是设置。
    • 对于 fetchmode,只需在 PDO 连接器中将其设置为默认模式一次,如 here 所示,您所有的 fetches 都将相同
    【解决方案2】:

    这与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 inside$records outside 是两个不同的变量,它们恰好具有相同的(本地)名称。

    【讨论】:

    • 我已尝试在 display_default_data() 中返回 $records 并按照您的建议将其收集到外部 $records 中。但是代码仍然不起作用。
    • 究竟是什么不起作用?尝试将die 与一些消息放在不同的位置,可能在调试代码之前使用某个变量的var_dump,并查看代码在何处采用了意外路径。
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2012-11-19
    相关资源
    最近更新 更多