Ogni volta che ottieni ...
"Avviso: mysqli_fetch_object () prevede che il parametro 1 sia mysqli_result, dato booleano"
... è probabile che ci sia un problema con la tua query. Il prepare()
o query()
potrebbe restituire FALSE
(un booleano), ma questo messaggio di errore generico non ti lascia molto in termini di indizi. Come scopri cosa non va nella tua query? Tu chiedi !
Prima di tutto, assicurati che la segnalazione degli errori sia attiva e visibile: aggiungi queste due righe nella parte superiore dei tuoi file subito dopo il <?php
tag di apertura :
error_reporting(E_ALL);
ini_set('display_errors', 1);
Se la segnalazione degli errori è stata impostata in php.ini, non dovrai preoccuparti di questo. Assicurati solo di gestire gli errori con garbo e di non rivelare mai la vera causa di eventuali problemi ai tuoi utenti. Rivelare la vera causa al pubblico può essere un invito inciso in oro per coloro che vogliono danneggiare i tuoi siti e server. Se non si desidera inviare errori al browser, è sempre possibile monitorare i log degli errori del server Web. Le posizioni dei registri variano da server a server, ad es. Su Ubuntu il registro degli errori si trova in genere /var/log/apache2/error.log
. Se stai esaminando i log degli errori in un ambiente Linux, puoi usarli tail -f /path/to/log
in una finestra della console per vedere gli errori che si verificano in tempo reale .... o mentre li fai.
Una volta che sei al quadrato sulla segnalazione degli errori standard, l'aggiunta del controllo degli errori sulla connessione al database e le query ti forniranno molti più dettagli sui problemi che si verificano. Dai un'occhiata a questo esempio in cui il nome della colonna non è corretto. Innanzitutto, il codice che restituisce il messaggio di errore irreversibile generico:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
L'errore è generico e non molto utile per risolvere ciò che sta succedendo.
Con un paio di più righe di codice è possibile ottenere informazioni molto dettagliate che è possibile utilizzare per risolvere immediatamente il problema . Controlla l' prepare()
affermazione per la verità e se è buona puoi procedere con l'associazione e l'esecuzione.
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
// handle error
}
Se qualcosa non va, puoi emettere un messaggio di errore che ti porta direttamente al problema. In questo caso, non c'è foo
colonna nella tabella, la soluzione del problema è banale.
Se si sceglie, è possibile includere questo controllo in una funzione o in una classe ed estenderlo gestendo gli errori con garbo, come menzionato in precedenza.