PHP:现代化的错误处理方式——“or die();”

14

当我开始学习PHP时,我会写类似这里的查询语句:

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

如今最好的方法是什么,来达到与上述相同的效果?

据我理解,在当今的世界里,使用类、函数和面向对象编程,以这种方式运行一堆查询是非常低效的。我们应该怎样不同的做呢?


你想要的是“or die”之外的东西还是完全使用OOP?如果是前者,请更改标题!如果是后者,你可以从像mysqli这样的“低级”东西开始,或者通过PDO经过Doctrine和Propel到达完整的ORM。 - Damien Pirsy
6
每当我看到“或者死亡(or die())”这种“错误处理”方法在在线PHP教程中仍然如此普遍时,我都会流泪。 - Michael Berkowski
1
@Alex - 异常 (http://www.php.net/manual/zh/language.exceptions.php) - Mark Baker
@MarkBaker 我知道它们是什么,我只是在向 OP 建议! - Alex Coplan
1
@Alex,抱歉,我以为这是对Michael评论的回答问题。 - Mark Baker
显示剩余2条评论
1个回答

19

你应该使用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();

2
@Cyclone PDO本身并不更安全。如果您没有使用预处理语句,那么切换到PDO是没有任何好处的。PDO并不等于安全。它仍然取决于您如何编写查询语句。 - Gordon
@Gordon,虽然你可以用任一种方式损害应用程序,但我认为你可以提出这样的观点:通过不使用PDO来伤害自己的方法更多,而且更容易伤害自己。 - Xeoncross
1
不确定我是否不想说那个。虽然如果需要数据库抽象层,PDO很有用,但并不争论这一点。只是说仍然取决于开发人员创建安全的代码。 - Gordon
3
我建议你从 PHP PDO 手册 开始学起。你已经知道什么是数据库了 - 现在你只需要使用例子来开始替换你的 mysql 调用。确保也阅读用户评论! - Xeoncross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,