首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP mysqli:如何在连接到数据库时检测访问拒绝或错误参数

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

Stack Overflow用户
提问于 2016-10-18 18:23:52
回答 3查看 16.1K关注 0票数 0

我有以下代码:

代码语言:javascript
复制
// 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)发出警告。则失败的是第一次查询或任何其它尝试操作该(失败的)连接。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-18 19:09:24

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

代码语言:javascript
复制
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli( $host, $user, $password, $database);

--它将执行您想要的操作:输出错误消息并停止脚本执行。

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

代码语言:javascript
复制
ErrorDocument 500 /error.html

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

票数 0
EN

Stack Overflow用户

发布于 2016-10-18 18:42:58

按照Roger Pennink的建议,可以在尝试连接之后检查mysqli::$connect_error和mysqli::$connect_errno。

由于可以使用@操作符抑制警告,因此可以按如下方式重写代码:

代码语言:javascript
复制
// 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);
}

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

票数 0
EN

Stack Overflow用户

发布于 2016-10-18 18:27:47

我们这样做:

代码语言:javascript
复制
<?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()} "; 
    }
}
?>

只是一个标准的尝试和捕捉。或者在你的例子中:

代码语言:javascript
复制
try{
   $mysqli = new mysqli( $host, $user, $password, $database );
}
catch(PDOException $e) { 
   echo "Error in database-connection: {$e->getMessage()} "; 
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40105703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档