Eu também tive esse problema e estava ficando louco tentando depurá-lo. Acontece que, às vezes, por qualquer motivo, o objeto mysqli não é preenchido, mas acessar diretamente suas propriedades ainda executa o código nativo por trás dele. Portanto, mesmo que um var_dump de todo o objeto mysqli mostre propriedades nulas, elas estão lá se você as acessar individualmente. Se errorno for falso, você pode ter executado uma consulta válida com um conjunto de resultados vazio que não esperava. Espero que isto ajude.
$mysqli = mysqli_connect('localhost', 'root', '', 'test', 3306);
var_dump($mysqli);
var_dump($mysqli->client_info);
var_dump($mysqli->client_version);
var_dump($mysqli->info);
e a saída:
object(mysqli)[1]
public 'affected_rows' => null
public 'client_info' => null
public 'client_version' => null
public 'connect_errno' => null
public 'connect_error' => null
public 'errno' => null
public 'error' => null
public 'field_count' => null
public 'host_info' => null
public 'info' => null
public 'insert_id' => null
public 'server_info' => null
public 'server_version' => null
public 'stat' => null
public 'sqlstate' => null
public 'protocol_version' => null
public 'thread_id' => null
public 'warning_count' => null
string 'mysqlnd 5.0.8-dev - 20102224 - $Revision: 321634 $' (length=50)
int 50008
null
int 0
string 'localhost via TCP/IP' (length=20)
string '5.5.20-log' (length=10)
int 50520