Testing... error)); // BUG #3: isset *never* true (see AOK case below) // any other $mysqli access generates warning // BUG #4: instance limbo (minor) assert(NULL===@$mysqli->error); // drastic workaround, @ supresses the warning // Bogus Host - procedural $mysqli = @mysqli_connect('bogushost.com'); assert( 0==mysqli_connect_errno()); // BUG #1 assert(''==mysqli_connect_error()); assert(FALSE===$mysqli); // gentle workaround (but not for object oriented) assert(NULL===@mysqli_error($mysqli)); // Bogus User/Password - object oriented $mysqli = @new mysqli('visibone.com', 'bogususer', 'boguspassword'); assert( 0 != mysqli_connect_errno()); // gentle workaround (but not for host error) assert(1045==mysqli_connect_errno()); assert('' != mysqli_connect_error()); assert(preg_match('/Access denied/', mysqli_connect_error())); assert(FALSE != $mysqli); // BUG #2 assert('object'==gettype($mysqli)); assert('mysqli'==get_class($mysqli)); assert(!isset($mysqli->error)); assert(NULL===@$mysqli->error); // Bogus User/Password - procedural $mysqli = @mysqli_connect('visibone.com', 'bogususer', 'boguspassword'); assert(1045===mysqli_connect_errno()); assert(preg_match('/Access denied/', mysqli_connect_error())); assert(FALSE===$mysqli); assert(NULL===@mysqli_error($mysqli)); // To see the non-error conditions, fill in the *** blanks. $HOST = '***'; $USER = '***'; $PASS = '***'; $DATABASE = '***'; @include('secure/passwords.php'); // AOK Connection - object oriented $mysqli = new mysqli($HOST, $USER, $PASS, $DATABASE); assert( 0===mysqli_connect_errno()); assert(''===mysqli_connect_error()); assert('object'==gettype($mysqli)); assert('mysqli'==get_class($mysqli)); assert(!isset($mysqli->error)); // BUG #3: $mysqli->error is a ghost property (minor) assert(!property_exists($mysqli, 'error')); assert(!property_exists('mysqli', 'error')); // So how can you detect a failed connect? assert(''===$mysqli->error); assert(NULL!==@$mysqli->error); // This is the only way I found. $result = $mysqli->query("SHOW TABLES"); // a good query assert($result != FALSE); assert('mysqli_result'==get_class($result)); assert(''===$mysqli->error); assert( 0===$mysqli->errno); assert(!isset($mysqli->error)); // BUG #3 even after a good query assert(!property_exists($mysqli, 'error')); assert(!property_exists('mysqli', 'error')); assert('integer'==gettype($result->num_rows)); assert($result->num_rows > 0); echo "$result->num_rows tables\n"; assert(!isset($result->num_rows)); // BUG #3: num_rows also a ghost property (maybe they all are?) assert(!property_exists($result, 'num_rows')); assert(!property_exists('mysqli_result', 'num_rows')); $result->close(); $result = $mysqli->query("SNOW FABLES"); // a bogus query assert($result === FALSE); assert('' != $mysqli->error); assert( 0 != $mysqli->errno); assert(1064 == $mysqli->errno); assert(!isset($mysqli->error)); // BUG #3 even after a BAD query assert(!isset($mysqli->errno)); assert(!property_exists($mysqli, 'error')); assert(!property_exists('mysqli', 'error')); $mysqli->close(); // AOK Connection - procedural $mysqli = mysqli_connect($HOST, $USER, $PASS, $DATABASE); assert( 0===mysqli_connect_errno()); assert(''===mysqli_connect_error()); assert('object'==gettype($mysqli)); assert('mysqli'==get_class($mysqli)); assert(''===mysqli_error($mysqli)); assert(NULL!==@$mysqli->error); mysqli_close($mysqli); ///////////////////// a review of the classic mysql functions ///////////////////////////// // Bogus Host - classic mysql $mysql = @mysql_connect('bogushost.com'); assert(FALSE===$mysql); assert('' != mysql_error()); // no bug 1 in classic mysql assert( 0 != mysql_errno()); assert(preg_match('/Unknown MySQL server host/', mysql_error())); assert(2005 == mysql_errno()); // Bogus User/Password - classic mysql $mysql = @mysql_connect('visibone.com', 'bogususer', 'boguspassword'); assert(FALSE===$mysql); assert('' != mysql_error()); assert( 0 != mysql_errno()); assert(preg_match('/Access denied/', mysql_error())); assert(1045 == mysql_errno()); // AOK - classic mysql $mysql = mysql_connect($HOST, $USER, $PASS, $DATABASE); assert(FALSE!==$mysql); assert('' === mysql_error()); assert( 0 == mysql_errno()); mysql_close($mysql); ?> ...Done.