Soma Zambelly
Soma Zambelly

Reputation: 197

Unable to handle 'getaddrinfo failed'

I have a PHP application which connects to a database.

The connection details (hostname,username,password,etc.) are supplied by the user. The problem is that when the user enters a non-exsisting hostname, I get the following warning:

Warning: mysqli::mysqli(): php_network_getaddresses: getaddrinfo failed

How do I handle this error? I am already using try-catch and it handles other exceptions perfectly (wrong username or password), but not this one.

Here is my code:

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;
    }
}
?>

Upvotes: 0

Views: 640

Answers (1)

ishegg
ishegg

Reputation: 9927

To change the behavior of PHP when there's a Warning, there's several options.

First option, use the error suppressor operator @. You don't want to do this. It "works", but it will bring you problems down the road when you can't find the reason for a bug you're having.

if ($db = @mysqli_connect("a", "a", "a", "a")) {
    // connected
}

The better option is to use set_error_handler() to throw an ErrorException whenever you run into a Warning. This will let you handle errors gracefully as Exceptions:

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

Upvotes: 1

Related Questions