PHP mysqli:连接数据库时如何检测拒绝访问或错误参数

PHP mysqli:连接数据库时如何检测拒绝访问或错误参数,php,mysql,mysqli,database-connection,Php,Mysql,Mysqli,Database Connection,我有以下代码: // Connect to DB $mysqli = new mysqli( $host, $user, $password, $database ); if( ! $mysqli ) { echo "Unable to connect to database\n"; exit(1); } 如果提供的密码或主机名/地址无效,mysqli对象仍将实例化$mysqli的计算结果为false,因此未检测到连接故障 如果我选中$mysqli->error,则不会得到任

我有以下代码:

// Connect to DB

$mysqli = new mysqli( $host, $user, $password, $database );
if( ! $mysqli )
{
    echo "Unable to connect to database\n";
    exit(1);
}
如果提供的密码或主机名/地址无效,mysqli对象仍将实例化<代码>$mysqli的计算结果为
false
,因此未检测到连接故障

如果我选中
$mysqli->error
,则不会得到任何错误

发生的情况是PHP(我在命令行中使用PHP5.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()} "; 
    }
}
?>
根据建议,在尝试连接后可以检查
mysqli::$connect\u error
mysqli::$connect\u 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);
--它将完全执行您想要的操作:输出错误消息并停止脚本执行

对于web版本,它应该保持不变,而在web服务器的配置中,您必须设置一个500错误页面,以便在PHP导致错误时自动显示。例如,对于Apache

ErrorDocument 500 /error.html

因为为每个可能的错误编写一个专用的错误处理程序是没有意义的。

您应该能够使用mysqli::$connect\u error和mysqli::$connect\u errno来获取有关连接错误的详细信息:对于捕获到的连接失败,您将如何处理?@YourCommonSense在我的CLI脚本中回显错误消息并退出。如果它是一个web应用程序,我会将客户端重定向到一个带有适当消息的页面。因此,实际上,您只需要在您已有的警告中添加一个死亡调用?@YourCommonSense是的,我想立即停止执行。这有意义吗?尽管我更喜欢另一种方法,谢谢你的回答。和你的反对票不是我投的。
ErrorDocument 500 /error.html