【问题标题】:PHP mysqli: how to detect access denied or bad parameters when connecting to databasePHP mysqli:连接数据库时如何检测拒绝访问或错误参数
【发布时间】:2017-02-27 13:51:33
【问题描述】:

我有以下代码:

// 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(我在命令行中使用 PHP 5.6)正在发出警告。然后失败的是第一次查询或任何其他使用(失败的)连接进行操作的尝试。

抑制警告并将连接失败捕获到代码中的最佳方法是什么?

【问题讨论】:

  • 您应该能够使用 mysqli::$connect_error 和 mysqli::$connect_errno 来获取有关连接错误的详细信息:php.net/manual/en/mysqli.connect-error.php
  • 你将如何处理这个捕获的连接失败?
  • @YourCommonSense 在我的 CLI 脚本的情况下,会回显一条错误消息并退出。如果它是一个 Web 应用程序,我会将客户端重定向到带有适当消息的页面。
  • 那么,实际上你想要的只是在你已经拥有的警告中添加一个 die 调用?
  • @YourCommonSense 是的,我想在那里停止执行。这没有意义吗?

标签: php mysql mysqli database-connection


【解决方案1】:

报告mysqli错误的最佳方法是将mysqli报告模式设置为异常。在这种情况下,您的所有代码将只有两行:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli( $host, $user, $password, $database);

-- 它会做你想做的事:输出错误信息并停止脚本执行。

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

ErrorDocument 500 /error.html

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

【讨论】:

    【解决方案2】:

    正如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);
    }
    

    当然应该考虑到@ 也会抑制错误。

    【讨论】:

      【解决方案3】:

      我们这样做:

      <?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()} "; 
      }
      

      【讨论】:

      • 虽然我更喜欢不同的方法,但谢谢您的回答。而且......你得到的反对票不是来自我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2020-07-07
      相关资源
      最近更新 更多