PHP mysqli:连接数据库时如何检测访问被拒绝或参数错误
PHP mysqli: how to detect access denied or bad parameters when connecting to database
我有以下代码:
// Connect to DB
$mysqli = new mysqli( $host, $user, $password, $database );
if( ! $mysqli )
{
echo "Unable to connect to database\n";
exit(1);
}
如果提供的密码或主机 name/address 无效,则无论如何都会实例化 mysqli 对象。 ! $mysqli
被评估 false
因此未检测到连接失败。
如果我检查 $mysqli->error
我没有收到任何错误。
发生的事情是 PHP(我在命令行中使用 PHP 5.6)发出警告。那么失败的是第一个查询或任何其他使用(失败的)连接进行操作的尝试。
抑制警告并将连接失败捕获到代码中的最佳方法是什么?
我们这样做:
<?php
function connect($DB_HOST,$DB_NAME,$DB_USER,$DB_PWD){
try {
$host=$DB_HOST;
$dbname= $DB_NAME;
$OPTIONEN = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $DB_USER, $DB_PWD,$OPTIONEN);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$DBH->exec("set names utf8");
$DBH->exec("SET CHARACTER SET 'utf8'");
return $DBH;
}
catch(PDOException $e) {
echo "Error in database-connection: {$e->getMessage()} ";
}
}
?>
只是一个标准的尝试捕捉。
或者在你的情况下:
try{
$mysqli = new mysqli( $host, $user, $password, $database );
}
catch(PDOException $e) {
echo "Error in database-connection: {$e->getMessage()} ";
}
正如 Roger Pennink 所建议的那样 mysqli::$connect_error
和 mysqli::$connect_errno
可以在连接尝试后进行检查。
由于可以使用 @
运算符抑制警告,因此代码可以重写如下:
// Connect to DB
@$mysqli = new mysqli( $host, $user, $password, $database );
if( ! $mysqli )
{
echo "Unable to connect to database.\n";
exit(1);
}
if( $mysqli->connect_errno )
{
echo "Unable to connect to database: " . $mysqli->connect_error . "\n";
exit(1);
}
当然要考虑到 @
也会抑制错误。
报告mysqli错误的最好方法是将mysqli报告模式设置为异常。在这种情况下,您的所有代码将只有两行:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli( $host, $user, $password, $database);
-- 它会做你想做的事:输出错误信息并停止脚本执行。
对于网络版本,它应该保持不变,而在您的网络服务器配置中,您必须设置一个 500 错误页面,以便在 PHP 导致错误时自动显示。例如。对于阿帕奇,
ErrorDocument 500 /error.html
因为为每个可能的错误编写专用的错误处理程序毫无意义。
我有以下代码:
// Connect to DB
$mysqli = new mysqli( $host, $user, $password, $database );
if( ! $mysqli )
{
echo "Unable to connect to database\n";
exit(1);
}
如果提供的密码或主机 name/address 无效,则无论如何都会实例化 mysqli 对象。 ! $mysqli
被评估 false
因此未检测到连接失败。
如果我检查 $mysqli->error
我没有收到任何错误。
发生的事情是 PHP(我在命令行中使用 PHP 5.6)发出警告。那么失败的是第一个查询或任何其他使用(失败的)连接进行操作的尝试。
抑制警告并将连接失败捕获到代码中的最佳方法是什么?
我们这样做:
<?php
function connect($DB_HOST,$DB_NAME,$DB_USER,$DB_PWD){
try {
$host=$DB_HOST;
$dbname= $DB_NAME;
$OPTIONEN = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $DB_USER, $DB_PWD,$OPTIONEN);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$DBH->exec("set names utf8");
$DBH->exec("SET CHARACTER SET 'utf8'");
return $DBH;
}
catch(PDOException $e) {
echo "Error in database-connection: {$e->getMessage()} ";
}
}
?>
只是一个标准的尝试捕捉。 或者在你的情况下:
try{
$mysqli = new mysqli( $host, $user, $password, $database );
}
catch(PDOException $e) {
echo "Error in database-connection: {$e->getMessage()} ";
}
正如 Roger Pennink 所建议的那样 mysqli::$connect_error
和 mysqli::$connect_errno
可以在连接尝试后进行检查。
由于可以使用 @
运算符抑制警告,因此代码可以重写如下:
// Connect to DB
@$mysqli = new mysqli( $host, $user, $password, $database );
if( ! $mysqli )
{
echo "Unable to connect to database.\n";
exit(1);
}
if( $mysqli->connect_errno )
{
echo "Unable to connect to database: " . $mysqli->connect_error . "\n";
exit(1);
}
当然要考虑到 @
也会抑制错误。
报告mysqli错误的最好方法是将mysqli报告模式设置为异常。在这种情况下,您的所有代码将只有两行:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli( $host, $user, $password, $database);
-- 它会做你想做的事:输出错误信息并停止脚本执行。
对于网络版本,它应该保持不变,而在您的网络服务器配置中,您必须设置一个 500 错误页面,以便在 PHP 导致错误时自动显示。例如。对于阿帕奇,
ErrorDocument 500 /error.html
因为为每个可能的错误编写专用的错误处理程序毫无意义。