/ / Come ottenere informazioni sugli errori di MySQL in diversi ambienti: php, mysqli, istruzioni preparate, ambiente, segnalazione degli errori

Come ottenere le informazioni sugli errori di MySQL in diversi ambienti: php, mysqli, istruzioni preparate, ambiente, segnalazione degli errori

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

Errore irreversibile: chiamata a una funzione membro bind_param () su un oggetto non 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 verificare la mia query, ho provato a eseguire la query tramite il pannello di controllo phpMyAdmin e il risultato è OK.

risposte:

63 per risposta № 1

Prima di tutto, avere sempre questa linea prima che MySQLi si connetta tutti i tuoi ambienti:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Successivamente verranno trasferiti tutti gli errori MySQLin eccezioni PHP. L'eccezione non rilevata, a sua volta, causa un errore fatale di PHP. Quindi, in caso di errore MySQL, otterrai un errore PHP convenzionale, che ti renderà immediatamente conto della causa dell'errore: una traccia dello stack ti condurrà nel punto esatto in cui si è verificato l'errore.

Nota che devi essere in grado di vedere Errori PHP in generale. E qui va davvero la questione di ambienti diversi:

  • Su un sito live devi dare un'occhiata ai log degli errori, quindi le impostazioni devono essere

    error_reporting(E_ALL);
    ini_set("display_errors", 0);
    ini_set("log_errors", 1);
    
  • Mentre si trova su un server di sviluppo locale, è possibile effettuare errori sullo schermo:

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

E una piccola lista di quello che tu non dovrebbe:

  • Utilizzare l'operatore di soppressione degli errori (@)
  • Uso die() o echo o qualsiasi altra funzione per stampare incondizionatamente il messaggio di errore sullo schermo. PHP può già ripetere l'operazione, non è necessaria alcuna assistenza.
  • Test del risultato della query manualmente (come if($result)) non ha alcun senso. O la tua query non è riuscita e otterrai già l'eccezione di errore, oppure è andato tutto bene e non c'è nulla da testare.
  • Utilizzare try..catch per echeggiare il messaggio di errore. Ancora una volta PHP può farlo meglio, molto meglio.