tags:

views:

69

answers:

2

I am looking for a way to test just the connection portion of a php / mysqli connection. I am migrating from a LAMP server build on Vista to the same on Ubuntu and am having fits getting mysqli to work. I know that all of the proper modules are installed, and PhpMyAdmin works flawlessly. I have migrated a site over and none of the mysqli connections are working. The error that I am getting is the "call to member function xxx() on non-object" that usually pops up when either the query itself is bad or the query is prepared from a bad connection. I know that the query itself is good because it works fine on the other server with the exact same database structure and data. That leaves me with the connection. I tried to write a very simple test connection and put it in a loop such as ..

if(***connection here ***)
{ echo "connected"; }
else
{ echo "not connected"; }

It echoes "connected", which is great. But just to check I changed the password in the connection so that I knew it would not be able to connect and it still echoed "connected". So, the if / else test is clearly not the way to go....

A: 

mysqli_connect() always returns a MySQLi object. To check for connection errors, use:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db');
if($mysqli_connection->connect_error){
   echo "Not connected, error: ".$mysqli_connection->connect_error;
}
else{
   echo "Connected."
}
Lekensteyn
This worked. Thank you, Lek. Of course, it only deepened the mystery. I now know that the database is actually connecting which means that my script is actually spitting the bit at the query itself. This makes even less sense as the query itself works on other servers. I have even written a simple test query that, sadly, still returns the non-object error.
Blind Fish
A: 

You need more error handling on the various database calls, then. Quick/dirty method is to simply do

 $whatever = mysqli_somefunction(...) or die("MySQL error: ". mysqli_error());

All of the functions return boolean FALSE if an error occured, or an appropriate mysqli object with the results. Without the error checking, you'd be doing:

 $result = $mysqli->query("blah blah will cause a syntax error");
 $data = $result->fetchRow();  // $result is "FALSE", not a mysqli_object, hence the "call to member on non-object"
Marc B
Using `mysql_error()` with MySQLi is stupid ;)
Lekensteyn
Yeah, typo. Fixed now.
Marc B
dying i s always bad. At least send 503 status and **never** reveal any sensitive information like mysql error message. use trigger_error() instead. Although it quite useless here, as PHP error message is already quite informative, if any
Col. Shrapnel
Actually I have tried using something similar, only with mysqli_connect_error() It doesn't throw an error.
Blind Fish
and mysqli_error require a connection handler, AFAIK
Col. Shrapnel