【问题标题】:Build database if mysqli return error constant 'ER_BAD_DB_ERROR'如果 mysqli 返回错误常量 'ER_BAD_DB_ERROR' 则构建数据库
【发布时间】:2017-03-08 06:27:02
【问题描述】:

大家好,如果 mysqli 返回错误常量“ER_BAD_DB_ERROR”/1049,我希望能够运行查询来构建我的数据库。这是我的代码。如果发现错误,我不希望 mysqli 显示错误,而只是构建数据库。

显示未知数据库错误,在if()语句中捕获错误并构建数据库时会发生什么。

如果因此显示错误,我意识到mysqli:

$connection = mysqli_connect($db_server, $db_user, $db_pwd, $dbname);

如果捕获到我想要的确切错误,我该如何构建数据库而不是显示错误。

$db_server = "localhost";
$db_user = "user";
$db_pwd = "";
$dbname = "name";

#connect to database
$connection = mysqli_connect($db_server, $db_user, $db_pwd, $dbname);

#try to catch database not exist error
if ('ER_BAD_DB_ERROR') {
    # if true build database and connect again
    build_db();
    $connection = mysqli_connect($db_server, $db_user, $db_pwd, $dbname);
} else {
    #close connection with other errors encounter
    die("database connection failed". mysqli_connect_error());
}

我不确定我是否在此处遵循最佳做法。所以,我全心全意地接受建议和反馈。谢谢各位。

【问题讨论】:

标签: php database mysqli


【解决方案1】:

你正在寻找

例子:

$link = mysqli_connect('localhost', 'user', 'password', 'my_db');

// check if the connect call returned a database object
if (!$link) {
    // check the particular error number why the connect failed
    if (mysqli_connect_errno() === ER_BAD_DB_ERROR) {
        // the database does not exist, so build it now
        build_db();
    } else {
        // something else caused the connect to fail
    }
}

这假设常量ER_BAD_DB_ERROR 存在。我还没有检查是否有。如果不存在,则需要使用与mysqli_connect_errno 返回的正确错误代码对应的值来定义它。

您还可以使用mysqli_connect_error() 获取错误的文本表示形式并进行比较,而不仅仅是错误代码。

在哪里可以找到错误代码引用 PHP 手册:

客户端错误消息编号列在 MySQL errmsg.h 头文件中,服务器错误消息编号列在 mysqld_error.h 中。在 MySQL 源代码分发中,您可以在文件 Docs/mysqld_error.txt 中找到错误消息和错误编号的完整列表。

请注意,这仍会显示有关丢失数据库的消息。您可以为此特定错误引入custom error handler,也可以在mysqli_connect 调用之前放置一个错误抑制运算符,例如将其更改为@mysqli_connect

【讨论】:

  • 谢谢。我通过使用错误抑制运算符让它工作,但意识到它抑制了所有其他错误的显示。在我错过用户和密码的情况下,如果它不存在,它就会继续构建数据库。有没有办法只显示这个错误(ER_BAD_DB_ERROR)?
  • @NathanSiafa 上面的代码应该已经只在发生此特定错误ER_BAD_DB_ERROR 时调用build_db()。任何其他错误都会转到 else 块。您还可以使用mysqli_connect_error() 获取错误的文本表示并进行比较,而不仅仅是错误代码。
  • 我很抱歉。我意识到我在 build_db() 中有另一个连接,它覆盖了我拥有的连接,我已经修复它,它现在可以正常工作了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2015-06-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
相关资源
最近更新 更多