PHP:“or die();”的现代版本用于错误处理

Posted

技术标签:

【中文标题】PHP:“or die();”的现代版本用于错误处理【英文标题】:PHP: Modern version of "or die();" for error handling 【发布时间】:2012-01-30 01:48:50 【问题描述】:

当我第一次开始学习 php 时,我会编写类似于这里的查询语句:

mysql_query("SELECT * FROM `table`") or die(mysql_error());

目前最好的方法是什么,可以达到与上述相同的效果?

据我了解,在当今具有类、函数和通用 OOP 的世界中,以这种方式运行一堆查询是非常低效的。我们应该做些什么不同的事情?

【问题讨论】:

嗯,你想要一些不同于“或死”的东西还是完全使用 OOP?如果是前者,请更改标题!如果是后者,你可以从 mysqli 这样“低”的东西开始,或者通过 PDO 进入像 Doctrine 和 Propel 这样的完整 ORM 研究使用 PDO。它是面向对象的,并且可以配置为抛出异常以进行错误处理(实际上它是默认的) 每次看到or die() 的“错误处理”方法,我都会泪流满面,在PHP 在线教程中仍然如此流行。 @Alex - 异常(php.net/manual/en/language.exceptions.php) @Alex,抱歉,我以为这是对迈克尔评论的回应 【参考方案1】:

你应该使用 PDO,它会抛出可以被捕获的异常——或者如果没有被捕获,它们会像 die() 一样杀死脚本。

$db = new \PDO(
    'mysql:dbname=database;host=localhost',
    'root',
    '',
    array(
        \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION
    )
);

$db->query('SELECT INVALID FOO'); // Exception!!!

this_never_gets_run();

【讨论】:

@Cyclone PDO 本身并不安全。如果您不使用准备好的语句,则切换到 PDO 将一无所获。这不是 PDO === 安全的。这仍然取决于您如何制作查询。 @Gordon,虽然你可以用任何一种方式伤害你的应用程序 - 我认为你可以指出有更多的方式伤害自己,而且不使用 PDO 更容易伤害自己。跨度> 不确定我是否不想这么说。如果您需要数据库抽象,请不要争论 PDO 是否有用。只是说它仍然取决于开发人员来创建安全代码。 @Aaron,我建议您从 PHP PDO manual 开始。您已经知道数据库是什么——所以您现在需要的只是使用示例来开始替换您的 mysql 调用。 请务必阅读用户 cmets!

以上是关于PHP:“or die();”的现代版本用于错误处理的主要内容,如果未能解决你的问题,请参考以下文章

and die() 和 or die() 的关系

mysqli or die,它必须死吗?

CF55C Pie or die

CF-55 C.Pie or die

现代 PHP 新特性 —— 内置的 HTTP 服务器 (转)

HTML / PHP - 错误的结束标记顺序