A volte il codice MySQLi produce un errore come mysqli_fetch_assoc() expects parameter...
, Call to a member function bind_param()...
o simili. O anche senza errori, ma la query non funziona lo stesso. Significa che la tua query non è stata eseguita.
Ogni volta che una query fallisce, MySQL visualizza un messaggio di errore che ne spiega il motivo . Sfortunatamente, per impostazione predefinita, tali errori non vengono trasferiti a PHP e tutto ciò che hai è un messaggio di errore criptico menzionato sopra. Quindi è molto importante configurare PHP e MySQLi per segnalare gli errori di MySQL. E una volta ricevuto il messaggio di errore, risolverlo sarà un gioco da ragazzi.
Come ottenere il messaggio di errore in MySQLi?
Prima di tutto, tieni sempre questa riga prima che MySQLi si connetta in tutti i tuoi ambienti:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Dopodiché tutti gli errori di MySQL verranno trasferiti in eccezioni PHP. L'eccezione non rilevata, a sua volta, fa un errore fatale PHP. Pertanto, in caso di errore MySQL, otterrai un errore PHP convenzionale. Ciò ti renderà immediatamente consapevole della causa dell'errore. E una traccia dello stack ti porterà al punto esatto in cui si è verificato l'errore.
Come configurare PHP in diversi ambienti
Ecco una sintesi del mio articolo sulla segnalazione degli errori PHP : La
segnalazione degli errori su uno sviluppo e sui server live deve essere diversa. Su un server di sviluppo è conveniente visualizzare gli errori sullo schermo, ma su un server live è invece necessario registrare i messaggi di errore, in modo da poterli trovare nel registro degli errori in un secondo momento.
Pertanto, è necessario impostare le opzioni di configurazione corrispondenti sui seguenti valori:
Come usarlo effettivamente?
Basta rimuovere qualsiasi codice che i controlli per l'errore manualmente , tutti coloro or die()
, if ($result)
e così via. Scrivi subito il codice di interazione del database:
$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();
di nuovo, senza condizioni intorno . Se si verifica un errore, verrà considerato come qualsiasi altro errore nel codice. Ad esempio, su un PC di sviluppo apparirà solo sullo schermo, mentre su un sito live verrà registrato per un programmatore, mentre per comodità dell'utente potresti utilizzare un gestore degli errori (ma questa è una storia diversa che è fuori tema per MySQLi, ma potresti leggerlo nell'articolo collegato sopra).
Cosa fare con il messaggio di errore che ricevi?
Prima di tutto devi individuare la query del problema. Il messaggio di errore contiene il nome del file e il numero di riga del punto esatto in cui si è verificato l'errore. Per il codice semplice è sufficiente, ma se il codice utilizza funzioni o classi potrebbe essere necessario seguire la traccia dello stack per individuare la query del problema.
Dopo aver ricevuto il messaggio di errore, devi leggerlo e comprenderlo. Sembra troppo ovvio se non condiscendente, ma gli studenti spesso trascurano il fatto che il messaggio di errore non è solo un segnale di allarme, ma in realtà contiene una spiegazione dettagliata del problema . E tutto ciò di cui hai bisogno è leggere il messaggio di errore e risolvere il problema.
- Ad esempio, se dice che una determinata tabella non esiste, devi controllare l'ortografia, gli errori di battitura, le maiuscole. Inoltre devi assicurarti che il tuo script PHP si connetta a un database corretto
- Oppure, se dice che c'è un errore nella sintassi SQL, allora devi esaminare il tuo SQL. E il punto del problema si trova subito prima della parte della query citata nel messaggio di errore.
Se non capisci il messaggio di errore, prova a cercarlo su Google. E quando sfogli i risultati, attenersi alle risposte che spiegano l'errore piuttosto che fornire bruscamente la soluzione. Una soluzione potrebbe non funzionare nel tuo caso particolare, ma la spiegazione ti aiuterà a comprendere il problema e ti consentirà di risolverlo da solo.
Devi anche fidarti del messaggio di errore. Se dice che il numero di token non corrisponde al numero di variabili legate, allora è così. Lo stesso vale per le tabelle o le colonne assenti. Data la scelta, sia che si tratti di un tuo errore o del messaggio di errore sbagliato, attieniti sempre al primo. Anche in questo caso suona condiscendente, ma centinaia di domande su questo stesso sito dimostrano che questo consiglio è estremamente utile.
Un elenco di cose che non dovresti mai fare per quanto riguarda la segnalazione degli errori
- Non utilizzare mai un operatore di soppressione degli errori (
@
)! Rende un programmatore incapace di leggere il messaggio di errore e quindi incapace di correggere l'errore
- Non utilizzare
die()
oo echo
qualsiasi altra funzione per stampare incondizionatamente il messaggio di errore sullo schermo. PHP può segnalare errori da solo e farlo nel modo giusto dipende dall'ambiente, quindi lascialo per PHP.
- Non aggiungere una condizione per testare manualmente il risultato della query (come
if($result)
). Con le eccezioni di errore abilitate, tale condizione sarà semplicemente inutile.
- Non utilizzare l'
try..catch
operatore per riprodurre il messaggio di errore. Questo operatore dovrebbe essere utilizzato per eseguire una gestione degli errori, come un rollback delle transazioni. Ma non usarlo mai solo per segnalare errori: come abbiamo imparato sopra, PHP può già farlo, nel modo giusto.
PS
A volte non ci sono errori ma neanche risultati. Quindi significa che non ci sono dati nel database che corrispondono ai tuoi criteri . In questo caso devi ammettere questo fatto, anche se puoi giurare che dati e criteri sono a posto. Non sono. Devi controllarli di nuovo. Ho un articolo che può aiutare in questa materia, Come eseguire il debug delle interazioni del database . Anche se è scritto per DOP, ma il principio è lo stesso. Segui queste istruzioni passo dopo passo e hai risolto il tuo problema o hai una domanda a cui rispondere per Stack Overflow.
$mysqli
variabile?