I want to write a program with database connectivity and exception handling in PHP. If I insert an incorrect username then it should display its corresponding error message, and if I insert the incorrect database it should display its corresponding error message.
But in the following program whether I insert incorrect database or incorrect username it only displays the message "Could not connect to database".
<?php $hostname = "localhost"; $username = "root1"; $password = ""; $database = "php_thenewboston"; $conn = mysqli_connect($hostname,$username,$password); $conn_db = mysqli_select_db($conn,$database); class ServerException extends Exception{} class DatabaseException extends Exception{} try{ if(!$conn){ throw new ServerException('Could not connect to server.'); }elseif(!$conn_db){ throw new DatabaseException('Could not connect to database.'); }else{ echo "Connected."; } }catch(ServerException $ex){ echo "Error :".$ex->getMessage(); }catch(DatabaseException $ex){ echo "Error :".$ex->getMessage(); } ?>
I am a beginner in PHP. Please comment below for any query.
EDIT
As asked by @Hatef Below is the var_dump
of $conn
when username is incorrect, password is correct and database name is correct
object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(1044) ["error"]=> string(68) "Access denied for user ''@'localhost' to database 'php_thenewboston'" ["error_list"]=> array(1) { [0]=> array(3) { ["errno"]=> int(1044) ["sqlstate"]=> string(5) "42000" ["error"]=> string(68) "Access denied for user ''@'localhost' to database 'php_thenewboston'" } } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(21) "5.5.5-10.1.16-MariaDB" ["server_version"]=> int(50505) ["stat"]=> string(132) "Uptime: 1072 Threads: 1 Questions: 16 Slow queries: 0 Opens: 18 Flush tables: 1 Open tables: 11 Queries per second avg: 0.014" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(9) ["warning_count"]=> int(0) }
Below is the var_dump of $conn
when the username is correct, password is correct and database name is incorrect.
object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(1049) ["error"]=> string(36) "Unknown database 'php_thenewboston1'" ["error_list"]=> array(1) { [0]=> array(3) { ["errno"]=> int(1049) ["sqlstate"]=> string(5) "42000" ["error"]=> string(36) "Unknown database 'php_thenewboston1'" } } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(21) "5.5.5-10.1.16-MariaDB" ["server_version"]=> int(50505) ["stat"]=> string(132) "Uptime: 1417 Threads: 1 Questions: 18 Slow queries: 0 Opens: 18 Flush tables: 1 Open tables: 11 Queries per second avg: 0.012" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(10) ["warning_count"]=> int(0) }
9 Answers
Answers 1
By Default, mysql automatically throws the exception. To throw the exception manually, you need to write the below line at top of file This will throw exception even on mysqli_connect. So you need to add the connect method in try block. mysqli_report(MYSQLI_REPORT_STRICT);
UPDATE: In your case, don't write the above line, change the hostname & you will get the server error in your catch block.
Answers 2
As per your code, you sounds a good oops programmer. Well every programming language has its own set of rules & standards.
Lets go through your code
$conn = mysqli_connect($hostname,$username,$password); $conn_db = mysqli_select_db($conn,$database); class ServerException extends Exception{} class DatabaseException extends Exception{}
Here you are trying to initiate a connection. Then in your try catch block you are checking the connectivity.
Put you connection also in your try catch block & catch the exception.
For example :
try { if ($db = mysqli_connect($hostname_db, $username_db, $password_db)) { //do something } else { throw new Exception('Unable to connect'); } } catch(Exception $e) { echo $e->getMessage(); }
Answers 3
Using mysqli_connect, you will be able to pass database name within that same function so for connection purpose you don't need to wait for mysqli_select_db()
There are many error code which you will get after connection attempt and based on that you will be able to specify proper message.
I have updated your code and conditions so you will get idea
<?php $hostname = "localhost"; $username = "root1"; $password = ""; $database = "php_thenewboston"; $conn = mysqli_connect($hostname,$username,$password,$database); $error = mysqli_connect_errno(); //$conn_db = mysqli_select_db($conn,$database); class ServerException extends Exception{} class DatabaseException extends Exception{} try{ if($error == 1044){ throw new ServerException('Could not connect to server. Check Username'); }elseif($error == 1045){ throw new DatabaseException('Could not connect to server. Check Password'); }elseif($error == 1049){ throw new DatabaseException('Could not connect to database. Check Database Name'); }else{ echo "Connected."; } }catch(ServerException $ex){ echo "Error :".$ex->getMessage(); }catch(DatabaseException $ex){ echo "Error :".$ex->getMessage(); } ?>
Hope it will help you.
Answers 4
Try using the following for connection..
<?php $mysqli = new mysqli("localhost", "root", "", "php_thenewboston"); try{ if(!$mysqli){ throw new ServerException('Could not connect to server.'); }else{ echo "Connected."; } }catch(ServerException $ex){ echo "Error :".$ex->getMessage(); }catch(DatabaseException $ex){ echo "Error :".$ex->getMessage(); } ?>
Answers 5
Just add "@" to your. This trick suppress error and allow you to manage them.
$conn = @mysqli_connect($hostname,$username,$password); $conn_db = @mysqli_select_db($conn,$database);
If you run your code with this modification. It will show the error you expect.
<?php $hostname = "localhost"; $username = "root1"; $password = ""; $database = "php_thenewboston"; $conn = @mysqli_connect($hostname,$username,$password); $conn_db = @mysqli_select_db($conn,$database); class ServerException extends Exception{} class DatabaseException extends Exception{} try{ if(!$conn){ throw new ServerException('Could not connect to server.'); }elseif(!$conn_db){ throw new DatabaseException('Could not connect to database.'); }else{ echo "Connected."; } }catch(ServerException $ex){ echo "Error :".$ex->getMessage(); }catch(DatabaseException $ex){ echo "Error :".$ex->getMessage(); } ?>
Answers 6
As I'm really not so found of mysqli_
, I'll put the PDO snippet connexion code that do the same as yours.
<?php // DB connect try { $db = new PDO('mysql:host=localhost;dbname=DB_name;charset=utf8', 'username', 'password'); // output as object $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); // error SQL as object $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { echo '<strong>'.$e->getMessage().'</strong><br />'."\n"; }
And you can work your way with $e->getCode()
and the MySql error code / message list
Answers 7
Make use of the PDO statements. The underneath example will tell you what error occurs when you use the try/catch setup.
Connect PDO with underneath code:
$mysqli_pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS, array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ));
Then wrap your SQL in the try/catch setup like shown below:
try { //$mysqli_pdo->beginTransaction(); If you need transaction $sql = $mysqli_pdo->prepare("[YOUR SQL]"); $sql->bindValue(1, $INT_VAL, PDO::PARAM_INT); $sql->bindValue(2, $STR_VAL, PDO::PARAM_STR); $sql->execute(); //$mysqli_pdo->commit(); Don't forget if you use transaction } catch(Exception $e) { echo $e->getMessage(); //$mysqli_pdo->rollBack(); Don't forget if you use transaction exit(); }
Answers 8
The MySQLi extension provides error information.
If $conn == false
, call mysqli_connect_error()
after to get your error message.
If you want to use your own message, mysqli_connect_errno()
will return the error code, which you can use to handle it how you want.
From the PHP docs: http://php.net/manual/en/mysqli.errno.php
<?php $link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } if (!mysqli_query($link, "SET a=1")) { printf("Errorcode: %d\n", mysqli_errno($link)); } /* close connection */ mysqli_close($link); ?>
Answers 9
You need to use a database account with a password to connect.
nice information.thank you
ReplyDeletelearn php7