我们应该始终跟踪查询和数据库错误吗?

时间:2013-05-12 15:03:58

标签: php mysql sql mysqli

我想知道每次我们连接数据库时, 或者查询,我们必须跟踪错误,如:

if (!$mysqli = new mysqli('localhost', 'root', ''))
    echo 'Error: (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error;
} else { ... }


if (!$mysqli->query('CREATE DATABASE mywebsite'))
    echo 'Error: (' . $mysqli->errno . ') ' . $mysqli->error;
} else { ... }

我正在做一堆查询和一些数据库连接,所以我应该像这样继续进行吗?虽然它有点累人:/

欢迎那些具有处理大量查询和数据库连接经验的人提出建议。您是否每次都会为每个这样做追踪可能的错误?

如果你跳过一些并跟踪最重要的内容怎么办?

2 个答案:

答案 0 :(得分:5)

  

我们是否应始终跟踪查询和数据库错误?

是,是和是!

跟踪错误消息是编程的基石。一个程序员是一个无助的婴儿在树林里没有错误信息。

但是,您选择跟踪的方式非常糟糕。

错误消息有两个目的地:

  • 在开发服务器上,在屏幕上显示它们非常方便
  • 但在实时服务器上,应该记录

因此,您必须使跟踪代码能够同时执行这两项操作。因此,

永远不会直接回复错误消息。

使用内置的PHP机制 - 引发错误或异常。

if (!$mysqli = new mysqli('localhost', 'root', ''))
    throw new Exception( $mysqli->connect_errno . $mysqli->connect_error);
}

if (!$mysqli->query('CREATE DATABASE mywebsite'))
    throw new Exception( $mysqli->error );
}

通过这种方式,您将拥有可靠,便捷的报告系统,可通过单个PHP配置选项进行控制。

因此,在本地开发服务器上以这种方式配置PHP:

error_reporting(E_ALL);
ini_set('display_errors',1);

您将能够在屏幕上看到所有错误消息 在实时服务器上,您也必须全部跟踪它们,而是记录它们:

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

尽管有一个常见的错觉,但实时服务器错误消息的比开发错误更重要。因此,“{1}}和error_reporting(0)都不应该以”不向用户显示错误消息“为借口。不想显示?关闭显示,但不关闭错误消息。

为了方便@的日常使用,必须将此功能封装到一些用户定义的函数或方法中 - 因此,您只需

即可调用它。
mysqli_query()

在内部完成所有错误处理工作 - 这是避免手动错误处理的唯一正确方法,但总是值班。

而且,关于$db->query('CREATE DATABASE mywebsite'); - 整个应用程序中应该只有一个(具有相同的凭据)。将连接代码放入您在所有页面中包含的某个引导程序文件中。

答案 1 :(得分:2)

假设您正在询问,因为您不想使用错误处理来混淆代码,我想在上面给出的答案中添加以下内容。

即使我没有使用完整的MVC框架,我总是在PHP中使用本机数据库函数的包装器库。他们为我做了所有的错误处理,帮助我避免sql注入等等。

所以我建议您查看以下组件之一:

  • Zend DB(可以在没有Zend Framework的情况下使用,blog post解释了如何
  • Doctrine DBAL - 这是Doctrine ORM的一部分,例如用于微框架中 Silex,当然还有像symfony2这样的完整框架 - 请参阅this blog post for an introduction

在任何一种情况下,学习使用其中一个库都不会浪费时间 - 你很可能会在其他PHP项目中再次看到它们。