mysqli_fetch_assoc () prevede errori di parametro / chiamata a una funzione membro bind_param (). Come ottenere l'effettivo errore di mysql e risolverlo?

Mar 26 2014

Nel mio ambiente locale / di sviluppo, la query MySQLi funziona correttamente. Tuttavia, quando lo carico sul mio ambiente host web, ottengo questo errore:

Errore irreversibile: chiamata a una funzione membro bind_param () su un non oggetto in ...

Ecco il codice:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

Per controllare la mia query, ho provato ad eseguire la query tramite il pannello di controllo phpMyAdmin e il risultato è OK.

Risposte

131 YourCommonSense Mar 26 2014 at 20:32

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 ha un messaggio di errore che 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:

  • Su un server di sviluppo

    • error_reportingdovrebbe essere impostato su E_ALLvalore;
    • log_errors dovrebbe essere impostato su 1 (è conveniente avere i log anche su un PC di sviluppo)
    • display_errors dovrebbe essere impostato su 1
  • Su un server di produzione

    • error_reportingdovrebbe essere impostato su E_ALLvalore;
    • log_errors dovrebbe essere impostato su 1
    • display_errors dovrebbe essere impostato su 0

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ò che serve è 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 esplori 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, attenersi 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 riguardo alla 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 echoqualsiasi 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..catchoperatore 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.