mysqli_connect()
recommends checking the return value and displaying an error message on the screen.
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); if (!$link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; }
Similarly, for OOP-style constructors, this is recommended:
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); }
Some users on Stack Overflow have even used code with mysqli_error($conn)
like this:
$conn = mysqli_connect('localhost', 'a', 'a'); if (!$con) { die('Could not connect: ' . mysqli_error($conn)); }
But, over the past few weeks, I've been asking myself the question, why do I need to do this? The output of the first example is:
Warning: mysqli_connect(): (HY000/1045): User access denied 'my_user'@'localhost' (use password: YES) C:xampp...mysqli.php line 4
Error: Unable to connect to MySQL. Debugging error number: 1045 Debugging Error: Access denied for user "my_user"@"localhost" (using password: Yes)
As you can see, the error message is displayed twice! Manual "debugging" actually provides less information.
Should we manually check for connection errors? Can we get more information than automated warnings this way? Is this recommended practice?
Never display connection errors manually!
MySQLi will generate a warning if it cannot open a connection to MySQL. This warning tells you everything you need to know, including the error code, error message, and where in the code the error occurred. Manually checking for errors won't give you any more information.
If you don't see warnings and can't create a connection, it probably means your PHP is not configured to display them. In this case, you must check the error log file on the server. If you don't know where it is, use
phpinfo() code>
to get the information and search forerror_log
. It will tell you where the error log files are located.If there are no warnings in the error log, it probably means that your PHP error reporting has been silenced (completely or just warnings). Check your PHP configuration.
In a production environment these settings should be preserved:
error_reporting
must beE_ALL
log_errors
Mustenable
display_errors
MustClose
In a development environment, these settings should be preserved:
error_reporting
must beE_ALL
log_errors
Mustenable
display_errors
Mustenable
As you can see in the error message, your database username and password have been leaked to the end user. This is sensitive information that you don't want to show to anyone. In fact, ordinary users will not understand this mysterious message. This is why
display_errors
must always be turned off in a production environment. It is safe to log errors on the server.Warnings and exceptions
Warnings do not stop the script. If a warning is issued, the script will continue execution until a fatal error is encountered. In most cases, you need to throw an exception to stop the script. Don’t use
die/exit
! If the mysqli connection cannot be established, an exception should be thrown, which if unhandled will bubble up and stop the script with a fatal error. You can configure mysqli to automatically throw exceptions. This is invaluable because all mysqli functions can fail for a variety of reasons, and they won't notify you of any problems unless you manually check for each error in them. Use the following lines before opening the connection:Don't catch exceptions unless you really know how to handle them! How to use mysqli to connect correctly
A possible use case is described inmysqli_error()
Can you show any connection related issues?No.
Neithermysqli_error($conn)
The mysqli connection is expected to be successful.$conn
must be a valid mysqli connection, otherwise you will receive this error message:$conn->error
normysqli_error($conn)
can display any connection-related errors!Related: Should I manually check for errors when calling "mysqli_stmt_prepare"? p>