Sollten wir jemals manuell nach mysqli_connect()-Fehlern suchen?

Lesezeit: 5 Minuten

Das PHP-Handbuch für mysqli_connect() schlägt vor, den Rückgabewert zu überprüfen und die Fehlermeldungen auf dem Bildschirm anzuzeigen.

$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;
}

In ähnlicher Weise wird für den Konstruktor im OOP-Stil Folgendes vorgeschlagen:

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

Einige Benutzer von Stack Overflow haben sogar Code mit verwendet mysqli_error($conn) etwa so:

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

Allerdings habe ich mir in den letzten Wochen eine Frage gestellt, warum sollte ich das tun müssen? Die Ausgabe des ersten Beispiels ist:

Warnung: mysqli_connect(): (HY000/1045): Zugriff verweigert für Benutzer ‘my_user’@’localhost’ (mit Passwort: YES) in C:\xampp\…\mysqli.php in Zeile 4

Fehler: Es kann keine Verbindung zu MySQL hergestellt werden. Debugging-Fehlernummer: 1045 Debugging-Fehler: Zugriff für Benutzer „my_user“@„localhost“ verweigert (mit Passwort: YES)

Wie Sie sehen können, wird die Fehlermeldung zweimal angezeigt! Das manuelle „Debuggen“ liefert eigentlich weniger Informationen.

Sollten wir jemals manuell nach Verbindungsfehlern suchen? Würden wir auf diese Weise jemals mehr Informationen erhalten als durch die automatische Warnung? Ist dies die empfohlene Vorgehensweise?

  • FWIW Ich habe wirklich im Internet nach diesen Informationen gesucht und nichts Zuverlässiges gefunden. Wenn jemand meiner Antwort etwas hinzufügen oder widersprechen möchte, nehme ich gerne konstruktive Kritik entgegen.

    – Dharman

    11. November 2019 um 20:33 Uhr

  • Ihre Frage bezieht sich auf die Überprüfung auf Verbindungsfehler. Bei Ihrer Antwort geht es darum, sie anzuzeigen. Wie Sie in Ihrer Antwort zu Recht erwähnen, wird der PHP-Code im Falle einer Warnung nicht angehalten. Wenn Sie also die Codeausführung an der Stelle eines Verbindungsfehlers anhalten möchten, müssen Sie nach diesen suchen.

    – Mike32

    18. Dezember 2019 um 17:32 Uhr


  • @ miken32 Ich bin mir nicht sicher, ob ich das verstehe. Wenn eine Ausnahme auftritt, stoppt der Code sofort die Ausführung, richtig? Wenn Sie keine Ausnahmen aktivieren, bedeutet dies, dass Sie nicht möchten, dass der Code im Fehlerfall angehalten wird. In beiden Fällen müssen Sie nicht nach Fehlern suchen, PHP kann dies für Sie erledigen.

    – Dharman

    18. Dezember 2019 um 17:34 Uhr

  • Mit “Fehlerberichterstattung aktivieren” meinen Sie mysqli konfigurieren, um Ausnahmen auszulösen? Absolut; Ich benutze mysqli nie persönlich, aber ich werde es bei der Beantwortung von mysqli-Fragen im Hinterkopf behalten.

    – Mike32

    18. Dezember 2019 um 17:39 Uhr

  • Siehe auch: stackoverflow.com/questions/22662488/…

    – Paul Spiegel

    26. Dezember 2019 um 13:24 Uhr

Sollten wir jemals manuell nach mysqli connect Fehlern suchen
Dharman

Verbindungsfehler niemals manuell anzeigen!

MySQLi generiert eine Warnung, wenn die Verbindung zu MySQL nicht hergestellt werden kann. Diese Warnung sagt Ihnen alles, was Sie wissen müssen, einschließlich des Fehlercodes, der Fehlermeldung und der Stelle im Code, an der es passiert ist. Eine manuelle Suche nach dem Fehler gibt Ihnen keine weiteren Informationen.

Wenn Sie die Warnung nicht sehen können und Ihre Verbindung nicht hergestellt werden kann, kann dies bedeuten, dass Ihr PHP nicht dafür konfiguriert ist, sie anzuzeigen. In diesem Fall müssen Sie die Fehlerprotokolldatei auf Ihrem Server überprüfen. Wenn Sie nicht wissen, wo das ist, verwenden Sie phpinfo() um diese Informationen zu erhalten und zu suchen error_log. Dort erfahren Sie, wo sich die Fehlerprotokolldatei befindet.

Wenn in den Fehlerprotokollen keine Warnung vorhanden ist, kann dies bedeuten, dass Ihr PHP die Fehlerberichterstattung stummgeschaltet hat (entweder vollständig oder nur Warnungen). Überprüfen Sie Ihre PHP-Konfiguration.
In dem Produktion Umgebung sollten diese Einstellungen beibehalten werden:

  • error_reporting muss sein E_ALL
  • log_errors muss sein On
  • display_errors muss sein Off

In dem Entwicklung Umgebung sollten diese Einstellungen beibehalten werden:

  • error_reporting muss sein E_ALL
  • log_errors muss sein On
  • display_errors muss sein On

Wie Sie in der Fehlermeldung sehen können, wurden Ihr Datenbank-Benutzername und Ihr Passwort dem Endbenutzer bekannt gegeben. Dies sind sensible Informationen, die Sie niemandem zeigen möchten. Tatsächlich würde ein normaler Benutzer diese kryptische Nachricht nicht verstehen. Deshalb display_errors muss in der Produktionsumgebung immer ausgeschaltet sein. Das Protokollieren der Fehler auf dem Server ist sicher.

Warnungen vs. Ausnahmen

Warnungen stoppen das Skript nicht. Wenn eine Warnung ausgegeben wird, wird das Skript weiter ausgeführt, bis es auf einen schwerwiegenden Fehler stößt. In den meisten Fällen möchten Sie eine Ausnahme auslösen, um das Skript zu stoppen. Verwende nicht die/exit! Wenn keine mysqli-Verbindung hergestellt werden kann, sollte eine Ausnahme ausgelöst werden, und wenn sie nicht behandelt wird, sprudelt sie auf und stoppt das Skript mit einem schwerwiegenden Fehler. Sie können mysqli so konfigurieren, dass Ausnahmen automatisch ausgelöst werden. Dies ist von unschätzbarem Wert, da alle mysqli-Funktionen aus vielen Gründen fehlschlagen können und sie Sie nicht über Probleme informieren, es sei denn, Sie überprüfen jede einzelne von ihnen manuell auf Fehler. Verwenden Sie die folgende Zeile, bevor Sie die Verbindung öffnen:

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

Fangen Sie die Ausnahmen nicht ab, es sei denn, Sie wissen wirklich, was mit ihnen zu tun ist! Ein möglicher Anwendungsfall ist in beschrieben So verbinden Sie sich richtig mit mysqli

dürfen mysqli_error() irgendwelche Verbindungsprobleme zeigen?

Nein. mysqli_error($conn) erwartet, dass die MySQL-Verbindung erfolgreich war. $conn muss eine gültige MySQL-Verbindung sein, sonst erhalten Sie diese Fehlermeldung:

Warnung: mysqli_error(): mysqli konnte nicht in C:\… abgerufen werden

Weder $conn->error Noch mysqli_error($conn) kann verbindungsbezogene Fehler anzeigen!

Verwandt: Soll ich manuell nach Fehlern suchen, wenn ich „mysqli_stmt_prepare“ aufrufe?

993000cookie-checkSollten wir jemals manuell nach mysqli_connect()-Fehlern suchen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy