我有以下情况:
我有一个连接到远程数据库的脚本,除非远程数据库脱机或服务器脱机,否则一切正常。
如果数据库/服务器脱机,脚本使用很长时间执行,在执行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';}
答案 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