PDO try-catch在函数中的用法

我正在考虑在以后的所有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。

以上是 PDO try-catch在函数中的用法 的全部内容, 来源链接: utcz.com/qa/407865.html

回到顶部