gpt4 book ai didi

php - PDO try-catch 在函数中的使用

转载 作者:IT王子 更新时间:2023-10-29 01:12:16 26 4
gpt4 key购买 nike

我正在考虑在我 future 的所有 web 应用中使用 PDO。目前(使用到目前为止我从 SO 中学到的知识),我在我的站点中处理数据库连接的是一个像这样的 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 block 中,事实上在大多数情况下您实际上并不想这样做。这样做的原因是,如果查询生成异常,这是语法错误或数据库问题等致命问题的结果,而这些不是您应该在执行的每个查询中考虑的问题。

例如:

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有关如何执行此操作的信息。

关于php - PDO try-catch 在函数中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/272203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com