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_errormysqli::$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

因为为每个可能的错误编写专用的错误处理程序毫无意义。