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();”的现代版本用于错误处理的主要内容,如果未能解决你的问题,请参考以下文章