Wednesday, 27 July 2016

mysqli - Fatal error: Call to a member function query() on a non-object in




Fatal error: Call to a member function query() on a non-object on line:
$result = $conn->query($sql) or die(mysqli_error());




Who knows whats wrong and how to fix it?



function dbConnect($usertype, $connectionType = 'mysqli') {
$host = 'localhost';
$db = 'phpsols';
if ($usertype == 'read') {
$user = 'psread';
$pwd = '123';
} elseif ($usertype == 'write') {

$user = 'pswrite';
$pwd = '123';
} else {
exit('Unrecognized connection type');
}
if ($connectionType == 'mysqli') {
return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');
} else {
try {
return new PDO("mysql:host=$host;dbname=$db", $user, $pwd);

} catch (PDOException $e) {
echo 'Cannot connect to database';
exit;
}
}
}

// connect to MySQL
$conn = dbConnect('read');
// prepare the SQL query

$sql = 'SELECT * FROM images';
// submit the query and capture the result
**$result = $conn->query($sql) or die(mysqli_error());**
// find out how many records were retrieved
$numRows = $result->num_rows;
?>





Connecting with MySQLi



A total of records were found.





Answer



The culprit is most likely this line:




return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');


The do xyz or die() construct leads to funny behaviour in conjuction with the return statement (i.e. the whole thing is interpreted as an OR expression and because new mysqli will never be false, the "die" is never processed.). See a similar case here.



Do this instead:



$result = new mysqli($host, $user, $pwd, $db) ;
if (!$result) die (....);

return $result;


Also, slightly related, I think you will never catch a PDO connection error because this:



return new PDO("mysql:host=$host;dbname=$db", $user, $pwd);


will always exit the function, and never reach the catch block. As with your actual problem, the solution is to pass the object to a $result variable first.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...