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