如果数据库脱机,如何防止MySQLi崩溃PHP脚本

时间:2016-10-03 10:58:10

标签: php mysqli

我有以下情况:

我有一个连接到远程数据库的脚本,除非远程数据库脱机或服务器脱机,否则一切正常。

如果数据库/服务器脱机,脚本使用很长时间执行,在执行SQL之前检查数据库连接是否成功的最佳方法是什么?

class remote_db{

    public $db;

    public function __construct(){

        $this->db = new mysqli("127.0.0.1","usr","pw","database");
        $this->db->set_charset("utf8");
    }
}


$remote_db = new remote_db();
if($remote_db){ echo 'hello world';}

2 个答案:

答案 0 :(得分:0)

我想我终于在“崩溃”中得到了你的意思。

看起来你的代码结构是spaghetti,其中HTML与数据库的东西混合在一起,所以在错误时它显示了一个不完整的,被撕掉的设计。

为了防止这种情况,您必须正确构建PHP应用程序。

首先,如果没有完成所有数据库操作,则永远不输出单个字节。为此,将PHP页面拆分为两部分:一部分用于数据库交互,它将收集显示所需的所有数据;另一部分主要由HTML组成,用于显示数据。

执行此操作后,如果在数据库阶段发生错误,您将能够显示专用错误页面。

请记住,捕获每一个可能的错误都是非常低效的任务,同时也是不可能的:你根本无法预见和处理可能发生的每一个错误。

相反,只需创建一个简单的代码,以便在出现任何错误时显示通用错误页面。为此,请设置这样的错误处理程序(代码来自我的文章The (im)proper use of try..catch):

set_error_handler("myErrorHandler");
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    error_log("$errstr in $errfile:$errline");
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500);
    echo "Server error. Please try again later");
    exit;
}

答案 1 :(得分:-1)

在运行查询之前没有理由检查它是否在线,因为在您检查的时间和运行查询的时间之间,它可能已脱机。因此,只需运行查询,然后像往常一样检查错误:

$r = $db->query('...');
if ($r === false) throw new Exception('error running query');

创建连接时也要检查错误:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

您还可以更改超时属性以减少等待时间:

$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); // Wait for 5 seconds max