当前位置: 首页 > 面试题库 >

PDO try-catch在函数中的用法

曾飞雨
2023-03-14
问题内容

我正在考虑在以后的所有Web应用程序中使用PDO。当前(使用到目前为止我从中学到的知识),我站点中用于处理数据库连接的内容是一个Singleton类,如下所示:

class DB {

    private static $instance = NULL;
    private static $dsn      = "mysql:host=localhost;dbname=mydatabase;";
    private static $db_user  = 'root';
    private static $db_pass  = '0O0ooIl1';

    private function __construct() 
    {

    }
    private function __clone()
    {

    }   
    public static function getInstance() {

        if (!self::$instance)
        {           
            self::$instance = new PDO(self::$dsn, self::$db_user, self::$db_pass);
            self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$instance;
    }
}

另一个文件(functions.php)具有特定于内容的功能,看起来像这样:

function get_recent_activities ()
{    
    try
    {    
        $db = DB::getInstance();
        // --prepare and execute query here, fetch the result--
        return $my_list_of_recent_activities;
    }
    catch (PDOException $e)
    {
        return "some fail-messages";
    }
}
...

这意味着我必须重复try .. catch所有功能。

我的问题是:

  1. 我应该如何提高效率?(例如,不必try..catch在所有功能中都重复执行,但仍然能够在每个功能上返回不同的“失败消息”)
  2. 这已经是一个好习惯了吗?我仍然是PDO和OOP的新手(还有很多东西要学习),所以(到目前为止),我真的看不到任何缺点或可以改进的地方。

很抱歉,如果不清楚或时间太长。提前致谢。


问题答案:

您的实现很好,并且可以在大多数情况下完美运行。

不必将每个查询都放在try /
catch块中,实际上,在大多数情况下,您实际上并不想这样做。这样做的原因是,如果查询生成异常,则是致命问题(例如语法错误或数据库问题)的结果,而这些并不是您每次执行查询时都要考虑的问题。

例如:

try {
    $rs = $db->prepare('SELECT * FROM foo');
    $rs->execute();
    $foo = $rs->fetchAll();
} catch (Exception $e) {
    die("Oh noes! There's an error in the query!");
}

这里的查询将正常工作或根本不工作。根本不起作用的情况永远不会在生产系统上发生任何规律性,因此它们不是您应在此处检查的条件。这样做实际上适得其反,因为您的用户会遇到一个永远不会改变的错误,并且您不会收到任何异常消息来提醒您该问题。

相反,只需编写以下代码:

$rs = $db->prepare('SELECT * FROM foo');
$rs->execute();
$foo = $rs->fetchAll();

通常,只有在查询失败时您才想执行其他操作时才想捕获并处理查询异常。例如:

// We're handling a file upload here.
try {
    $rs = $db->prepare('INSERT INTO files (fileID, filename) VALUES (?, ?)');
    $rs->execute(array(1234, '/var/tmp/file1234.txt'));
} catch (Exception $e) {
    unlink('/var/tmp/file1234.txt');
    throw $e;
}

您将要编写一个简单的异常处理程序,该异常处理程序记录或通知您在生产环境中发生的数据库错误,并向用户显示友好的错误消息,而不是异常跟踪。有关如何执行此操作的信息,请参见http://www.php.net/set-
exception-handler



 类似资料:
  • 是否有可能将函数包装在一个try捕获块中?它似乎对第一个函数不起作用,但是它会对这样声明的原型函数起作用吗? 例子:

  • 我正在尝试构造这段代码,这样我就可以从多个地方调用getStudent。我正在尝试编写一些JSON例程。我正在尝试错误的第一回调模式。我不是因为这个错误而感到不安,而是因为这个错误被getstudent中的一个捕获器捕获了。 顺便说一句,我发现错误是做状态(200)而不是状态(0)。 我应该如何重新构造这些捕获,使它们不影响主代码?还是我完全误用了回调的概念?似乎“then/catch”是使用MS

  • 我知道如果我们有这样的try-catch设置: 如果中存在错误,捕获错误将触发。 根据我的理解,如果我们尝试像这样的catch设置: 如果中存在错误,则不会触发捕获错误,因为该函数将在以后运行。 我不明白的是,当我们使用wait时,为什么catch错误不会触发: 如果这次异步函数中出现错误,并且由于javascript引擎正在等待它完成运行,为什么在出现错误时它不能捕获错误呢。 编辑1: 第二个功

  • 这是我的 RemoteDataSource 类,我将在其中编写许多 api 调用,如下所示: 现在,您可以看到,为了每一个乐趣,我需要将代码包装在try/catch块中。一切都很好,我也能捕捉到异常,但为什么要为每个函数编写这么多try/catch?相反,我需要在一个公共类中执行,这样我就可以像这样简单地调用我的函数。 如果您想更改任何内容,您可以写一个答案并建议我,for ex in getRe

  • 问题内容: 我有一些代码,其结构类似于此 问题是它向我吐了一个错误。 解析错误:语法错误,意外的T_LNUMBER,预期的T_VARIABLE或’$’ 有关于如何在bbcode函数的preg_replace内调用embed_video的想法吗? 谢谢! 问题答案: 您可以在上使用“ e”修饰符(请参见模式修饰符) 告诉将第二个参数视为PHP代码。

  • 问题内容: 在PHP 5中使用try-catch语句时,要考虑什么样的性能影响? 以前,我已经在网上阅读了一些有关该主题的古老的,看似矛盾的信息。我目前必须使用的许多框架都是在php 4上创建的,并且缺少php 5的许多优点。因此,我在使用try-catchs与php方面经验不足。 问题答案: 要考虑的一件事是,没有引发异常的try块的开销与实际引发和捕获异常的开销是一个不同的问题。 如果仅在失败