Reputation: 197
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
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 Exception
s:
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