Wednesday, 29 March 2017

php - Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, array given




in this case my queries work fine i have tested them on mysql.



First I have a custom query function that looks like this in the MySQLDatabase class



public function query($query) {
$this->last_query = $query;
$resultado = mysqli_query($this->connection, $query);
$this->confirm_query($resultado);
return $resultado;
}


private function confirm_query($result) {
if ($result === FALSE) {
print_r(mysqli_fetch_assoc($result));
$output = "Error on query". mysqli_error($this->connection)."
";
$output .= "Last query : ".$this->last_query;
die($output);
}
}


public function fetch_array($result_set){

return mysqli_fetch_array($result_set);

}


Then i have a class called User which use the MYSQL class



    public static function find_by_id($id=0){

global $database;
$result_set = $database -> query("SELECT * FROM users WHERE id={$id}");
$found = $database ->fetch_array($result_set);
return $found;
}


And finally i call the methods in my index.php in this way



$result_set = User::find_by_id(1);

$found_user = $database ->fetch_array($result_set);


Here are some facts :
1.- This warning happens when I insert an id value that exists in my database




Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result,
array given





2.- This warning happens when I insert an id value that doesn´t exists in my database.




Warning: mysqli_fetch_array() expects parameter 1 to be
mysqli_result, null given




The conclusion is that mysqli_query is not returning results but an result object like this in the case it finds a row in the database with certain id .





mysqli_result Object ( [current_field] => 0 [field_count] => 5
[lengths] => [num_rows] => 1 [type] => 0 )




How do I get rid of this error?


Answer



The found_by_id method is already calling mysqli::fetch_array here:



$found = $database ->fetch_array($result_set);



It returns the fetched array, if you then write:



$result_set = User::find_by_id(1);
$found_user = $database ->fetch_array($result_set);//fetch_array again


you're passing the fetched array back to fetch_array, which doesn't work




It's exactly the same as writing this:



$result_set = $database -> query("SELECT * FROM users WHERE id=1");
$found = $database ->fetch_array($result_set);
$found_user = $database->fetch_array($found);//<-- second call...

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...