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


109

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.


Possiamo vedere dove stai iniziando la $mysqlivariabile?
Rikesh

Potrebbe essere che il tuo utente MySQL non abbia i privilegi per fare una SELECTquery. Hai controllato?
Amal Murali

Quello che mi viene in mente è che non è disponibile alcun mysqli o che hai fornito credenziali errate per la connessione a MySQL.
NB

@YourCommonSense - Con il vecchio titolo era più semplice trovare questa domanda per un riferimento duplicato.
Paul Spiegel

@Paul, sì, anche questa è la mia preoccupazione più profonda. Ho cambiato il titolo per motivi di ricerca su Google e riconoscimento generale, poiché per l'utente PHP medio la connessione tra il loro codice e diversi ambienti non è chiara. Ma da allora ho anche difficoltà a trovarlo. Finisci per averlo nei segnalibri. Se puoi proporre un titolo riconoscibile ma pertinente, sarebbe fantastico
Il tuo buon senso,

Risposte:


122

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:

  • 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ò 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 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.


@AdamWinter che usa @ è sempre sbagliato, e in questo caso particolare è dieci volte più grande. I messaggi di errore al tuo programma sono come un dolore per il tuo corpo. Ti dice che qualcosa non va, come se ti fosse rotta una gamba. E devi aggiustare la gamba non solo prendere un antidolorifico e andare avanti. ANCH'IO. PHP ti dice che non ci sono variabili che ti aspetti. Quindi devi correggere il modulo o qualsiasi altra cosa, per rendere disponibile questa variabile. Non basta scrivere un codice per aggirare un errore.
Il tuo buon senso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.