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 <?phptag 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/login 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'è foocolonna 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.