2

我想知道每次我们连接到数据库或查询时,我们是否必须跟踪以下错误:

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 { ... }

我正在做一堆查询和一些数据库连接,所以我应该总是这样吗?虽然有点累:/

欢迎有处理大量查询和数据库连接经验的人提供任何建议。您是否总是每次都这样做以跟踪可能的错误?

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

4

2 回答 2

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);

尽管存在一种常见的错觉,但对于实时服务器来说,错误消息比对于开发者来说更​​重要。因此,既不error_reporting(0)也不@应该以“不向用户显示错误消息”为借口。不想显示?关闭显示,但不关闭错误消息本身。

为了简化 的日常使用mysqli_query(),这个函数必须被封装到一些用户定义的函数或方法中——所以,你可以用它来调用它

$db->query('CREATE DATABASE mywebsite');

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

而且,关于-在整个应用程序"some db connections"中应该只有一个(具有相同的凭据)。将连接代码放入所有页面中包含的引导文件中。

于 2013-05-12T15:15:09.503 回答
2

假设您之所以问是因为您不想通过错误处理使代码混乱,我想在上面给出的答案中添加以下内容。

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

因此,我建议您查看以下组件之一:

  • Zend DB(可以在没有 Zend 框架的情况下使用,这篇博文解释了如何
  • Doctrine DBAL - 这是 Doctrine ORM 的一部分,例如用于像 Silex 这样的微框架,当然还有像 symfony2 这样的成熟框架 - 请参阅这篇博文了解介绍

无论哪种情况,学习使用其中一个库都不会浪费时间——您很可能会在其他 PHP 项目中再次看到它们。

于 2013-05-12T15:38:23.540 回答