2016-10-18 35 views
0

当检测拒绝访问或坏的参数我有以下代码:PHP的mysqli:如何连接到数据库

// 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)引发警告。那么失败的是第一个查询或任何其他尝试操作(失败)连接。

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

+1

你应该可以使用mysqli :: $ connect_error和mysqli :: $ connect_errno来获取有关连接错误的详细信息:http://php.net/manual/en/mysqli.connect-error.php –

+0

你是什么意思?这个连接失败了吗? –

+0

@YourCommonSense在我的CLI脚本中回显错误消息并退出。如果它是一个Web应用程序,我会将客户端重定向到一个带有适当消息的页面。 – Paolo

回答

0

最好报告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 

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

-1

我们这样做是这样的:

<?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和catch。 或者你的情况:

try{ 
    $mysqli = new mysqli($host, $user, $password, $database); 
} 
catch(PDOException $e) { 
    echo "Error in database-connection: {$e->getMessage()} "; 
} 
+0

虽然我更喜欢不同的方法,但感谢您的回答。而且......你得到的那个低估并不是从我这里来的。 – Paolo

0

由于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); 
} 

当然应该在账户采取@抑制误差太大。