Ar trebui să verificăm vreodată manual erorile mysqli_connect()? (Programare, Php, Mysqli, Gestionarea Erorilor)

Dharman a intrebat.

Manualul PHP pentru mysqli_connect() sugerează verificarea valorii de returnare și afișarea mesajelor de eroare pe ecran.

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

În mod similar, pentru constructorul de tip OOP se sugerează acest lucru:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

Unii utilizatori de pe Stack Overflow au folosit chiar și cod cu mysqli_error($conn) cum ar fi acesta:

$conn = mysqli_connect('localhost', 'a', 'a');
if (!$con) {
    die('Could not connect: ' . mysqli_error($conn));
}

Cu toate acestea, în ultimele săptămâni mi-am pus o întrebare: De ce ar trebui să fac asta? Ieșirea primului exemplu este:

Warning: mysqli_connect(): (HY000/1045): Acces refuzat pentru utilizatorul ‘my_user’@’localhost’ (folosind parola: YES) în C:xampp…mysqli.php on line 4

Eroare: Nu se poate conecta la MySQL. Eroare de depanare errno: 1045 Eroare de depanare: Acces refuzat pentru utilizatorul ‘my_user’@’localhost’ (folosind parola: YES)

După cum puteți vedea, mesajul de eroare este afișat de două ori! Manualul „debugging” oferă de fapt mai puține informații.

Ar trebui să verificăm vreodată manual dacă există erori de conexiune? Am obține vreodată mai multe informații în acest mod decât din avertizarea automată? Este aceasta practica recomandată?

Comentarii

  • FWIW Chiar am căutat aceste informații pe internet și nu am găsit nimic de încredere. Dacă cineva are ceva de adăugat sau de contrazis în răspunsul meu, aș accepta cu plăcere critici constructive. –  > Por Dharman.
  • Întrebarea dvs. se referă la verificarea erorilor de conectare. Răspunsul dvs. se referă la afișarea lor. După cum bine menționați în răspunsul dumneavoastră, codul PHP nu se va opri în cazul unui avertisment, așa că, dacă doriți să opriți execuția codului în momentul în care apare o eroare de conexiune, trebuie să le verificați. –  > Por miken32.
  • @miken32 Nu sunt sigur că am înțeles. Dacă se întâmplă o excepție, codul oprește execuția imediat, corect? Dacă nu activați excepțiile, înseamnă că nu doriți ca codul să se oprească în caz de eroare. În orice caz, nu este nevoie să verificați dacă există erori, PHP o poate face pentru dvs. –  > Por Dharman.
  • Prin „activați raportarea erorilor” vă referiți la configurarea lui mysqli pentru a arunca excepții? Absolut; nu folosesc niciodată mysqli personal, dar voi ține cont de acest lucru atunci când răspund la întrebări legate de mysqli. –  > Por miken32.
  • Legat de acest subiect: stackoverflow.com/questions/22662488/… –  > Por Paul Spiegel.
1 răspunsuri
Dharman

Nu afișați niciodată manual erorile de conectare!

MySQLi va genera un avertisment dacă nu poate deschide conexiunea la MySQL. Acest avertisment vă spune tot ce trebuie să știți, inclusiv codul de eroare, mesajul de eroare și locul din cod unde s-a întâmplat. Verificarea manuală a erorii nu vă va oferi mai multe informații.

Dacă nu puteți vedea avertismentul și conexiunea nu poate fi creată, s-ar putea să însemne că PHP-ul dvs. nu este configurat să le afișeze. În acest caz, trebuie să verificați fișierul jurnal de erori de pe serverul dumneavoastră. Dacă nu știți unde se află acesta, utilizați phpinfo() pentru a obține aceste informații și căutați error_log. Acesta vă va spune unde se află fișierul jurnal de erori.

Dacă nu există niciun avertisment în jurnalele de erori, ar putea însemna că PHP-ul dvs. a redus la tăcere raportarea erorilor (fie complet, fie doar avertismentele). Verificați configurația PHP.
În fișierul producție mediu de producție, aceste setări ar trebui să fie menținute:

  • error_reporting trebuie să fie E_ALL
  • log_errors trebuie să fie On
  • display_errors trebuie să fie Off

În dezvoltare aceste setări ar trebui să fie menținute:

  • error_reporting trebuie să fie E_ALL
  • log_errors trebuie să fie On
  • display_errors trebuie să fie On

După cum puteți vedea în mesajul de eroare, numele de utilizator și parola bazei de date au fost dezvăluite utilizatorului final. Acestea sunt informații sensibile pe care nu doriți să le arătați nimănui. De fapt, un utilizator normal nu ar înțelege acest mesaj criptic. Din acest motiv display_errors trebuie să fie întotdeauna dezactivat în mediul de producție. Înregistrarea erorilor pe server este sigură.

Avertismente vs. excepții

Avertizările nu opresc scriptul. În cazul în care este emis un avertisment, scriptul va continua să se execute până când întâlnește o eroare fatală. În cele mai multe cazuri, veți dori să aruncați o excepție pentru a opri scriptul. Nu utilizați die/exit! Dacă nu se poate realiza o conexiune mysqli, ar trebui să se lanseze o excepție, iar dacă aceasta nu este gestionată, va apărea și va opri scriptul cu o eroare fatală. Puteți configura mysqli pentru a arunca excepții în mod automat. Acest lucru este de neprețuit, deoarece toate funcțiile mysqli pot eșua din mai multe motive și nu vă vor informa despre probleme decât dacă verificați manual fiecare dintre ele pentru erori. Utilizați următoarea linie înainte de a deschide conexiunea:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

Nu prindeți excepțiile decât dacă știți cu adevărat ce să faceți cu ele! Un caz de utilizare posibil este descris în Cum să vă conectați corect folosind mysqli

Poate mysqli_error() să apară probleme legate de conexiune?

Nu. mysqli_error($conn) se așteaptă ca conexiunea mysqli să se realizeze cu succes. $conn trebuie să fie o conexiune mysqli validă, altfel ați primi acest mesaj de eroare:

Avertizare: mysqli_error(): Nu a putut prelua mysqli în C:…

Nici $conn->error nici mysqli_error($conn) poate afișa nicio eroare legată de conexiune!

Înrudite: Ar trebui să verific manual dacă există erori la apelarea „mysqli_stmt_prepare”?