Php 无法处理“getaddrinfo失败”

Php 无法处理“getaddrinfo失败”,php,mysqli,Php,Mysqli,我有一个连接到数据库的PHP应用程序 连接详细信息主机名、用户名、密码等由用户提供。问题是,当用户输入一个不存在的主机名时,我会收到以下警告: 警告:mysqli::mysqli:php\u network\u getaddress:getaddrinfo 失败 如何处理此错误?我已经在使用try-catch了,它可以处理其他异常——用户名或密码完全错误,但不是这个 这是我的密码: backend.php <?php // Library setup require_once "instl

我有一个连接到数据库的PHP应用程序

连接详细信息主机名、用户名、密码等由用户提供。问题是,当用户输入一个不存在的主机名时,我会收到以下警告:

警告:mysqli::mysqli:php\u network\u getaddress:getaddrinfo 失败

如何处理此错误?我已经在使用try-catch了,它可以处理其他异常——用户名或密码完全错误,但不是这个

这是我的密码:

backend.php

<?php
// Library setup
require_once "instlib.php";
$lib = new installer;

// Header
header('Content-Type: application/json; Charset=UTF-8');

try {
    $lib->create_mysqli(array(
        "host" => "a",
        "user" => "b",
        "pass" => "c",
        "database" => "",
        "port" => "3306"
    ));
    echo $lib->build_response("AWESOME!", true);
} catch (Exception $e) {
    echo $lib->build_response($e->getMessage(), false);
}
?>
instlib.php

<?php
require_once 'library.php';
class installer extends nncms
{   
    public function build_response($response = "", $success, $extra = array())
    {
        return json_encode(array_merge(array('success' => $success, 'response' => $response),$extra));
    }
}
?>
library.php

<?php
class nncms
{   
    var $mysqli;

    public function create_mysqli($config)
    {
        // Set MySQLi to throw expection instead of warning
        mysqli_report(MYSQLI_REPORT_STRICT);

        // Connection setup
        $mysqli = new mysqli(
            $config["host"],
            $config["user"],
            $config["pass"],
            $config["database"],
            $config["port"]
        );
        $mysqli->set_charset('utf8mb4');

        // In case of an error that somehow didn't throw an exception
        if ($mysqli->connect_errno)
            throw new Exception("Connection error: ".$mysqli->connect_error);

        // Set MySQLi object of class
        $this->mysqli = $mysqli;
    }
}
?>

要在出现警告时更改PHP的行为,有几个选项

第一个选项,使用。你不想这么做。它是有效的,但当你找不到一个bug的原因时,它会给你带来问题

if ($db = @mysqli_connect("a", "a", "a", "a")) {
    // connected
}
更好的选择是在遇到警告时使用抛出ErrorException。这将使您能够将错误作为例外情况优雅地处理:


这难道不是MYSQLI_REPORT_STRICT的目的吗?”根据,针对错误而不是警告抛出mysqli\u sql\u异常。为什么它可以处理一个错误的用户名,而不是一个无效的主机名?是的,您的代码应该能够正确地捕获它,但无论如何都会显示一个警告。这就是为什么您需要使用set\u error\u handler您的代码可以正常工作,但我仍然不明白为什么MYSQLI\u REPORT\u STRICT不能使用主机名。它们是不同类型的错误。如果PHP无法连接到主机名,它将显示该警告,因为该调用级别较低,与mysqli无关。OTOH,当用户名错误时,PHP已经连接,但拒绝凭据的是MySQL,因此您可以正确地获得mysqli\U sql\U异常。可以这样想:PHP首先尝试转到http://wrong.hostname. 如果它有效,它将继续使用MySQL流。如果没有,则显示警告。
function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("errorHandler");
try {
    if ($db = mysqli_connect("a", "a", "a", "a")) {
        // connected
    }
}
catch(ErrorException $e) {
    echo "Exception: ".$e->getMessage();
}