mysqli oder sterben, muss es sterben?

Lesezeit: 5 Minuten

Wenn ich ein bisschen Code wie diesen verwende:

$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));

Muss es sterben oder kann man danach eine andere Abfrage stellen? Wie eine vorgegebene Funktion, die ein Protokoll des Fehlers in eine andere Tabelle schreibt? Wie zum Beispiel:

$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);

Was sind die anderen Optionen nach ‘oder’? Ich habe es nicht in der Dokumentation gefunden, alle Hinweise sind willkommen.

  • Wenn Sie die Funktion am ausführen möchten Erfolg der vorherigen Abfrage verwenden and anstatt or.

    – mario

    10. März 2013 um 3:00 Uhr

  • Sicher können Sie eine Funktion nach dem aufrufen or (es ist ein Operator, wie Blender unten sagt). Eines zu definieren, wie Sie es anscheinend tun, ist jedoch nicht wirklich möglich oder sinnvoll.

    – Ry-

    10. März 2013 um 3:02 Uhr

mysqli oder sterben muss es sterben
Ihr gesunder Menschenverstand

Muss es sterben

Ganz im Gegenteil, es sollte nicht or die() je.

PHP ist eine Sprache mit schlechter Vererbung. Sehr schlechte Vererbung. Und or die() wobei eine Fehlermeldung eine der schlimmsten Rudimente ist:

  • die wirft eine Fehlermeldung aus, die einem potenziellen Angreifer einige Systeminterna offenbart
  • Es verwirrt unschuldige Benutzer mit seltsamen Nachrichten und lässt ihnen keine Schnittstelle, mit der sie arbeiten können, sodass sie wahrscheinlich einfach abbrechen würden.
  • Es beendet das Skript in der Mitte, sodass möglicherweise ein zerrissenes Design (oder überhaupt kein Design) angezeigt wird (dh eine unvollständige Darstellung der vom Benutzer angeforderten Seite).
  • das Skript unwiederbringlich beenden. Während eine ausgelöste Ausnahme abgefangen und ordnungsgemäß behandelt werden kann
  • die() gibt Ihnen keinen Hinweis auf die Ort, an dem der Fehler aufgetreten ist. Und in einer relativ großen Anwendung wird es ziemlich schwierig sein, sie zu finden.

Also niemals verwenden die() mit MySQL-Fehlern, auch für das temporäre Debuggen: Es gibt bessere Wege.

Anstatt manuell nach dem Fehler zu suchen, konfigurieren Sie einfach mysqli so, dass es bei Fehlern Ausnahmen auslöst, indem Sie die folgende Zeile zu Ihrem Verbindungscode hinzufügen

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

und schreiben Sie danach einfach jeden mysqli-Befehl so, wie er ist, ohne irgendwelche or die oder sonst was:

$result = mysqli_query($link, $sql);

Dieser Code löst im Fehlerfall eine Ausnahme aus und Sie werden somit immer ohne eine einzige Zeile zusätzlichen Codes über jedes Problem informiert.

Eine ausführlichere Erklärung, wie Sie Ihre Fehlerberichterstattungsproduktion fertig, einheitlich und insgesamt sinnvoll machen und gleichzeitig Ihren Code viel sauberer machen, finden Sie in meinem Artikel über PHP-Fehlerberichterstattung.

  • Tolle Erklärung, möchte nur eine kleine Korrektur vornehmen, der Vorrang von OR in PHP ist tatsächlich niedriger als =, weshalb der Zuweisung auch der Rückgabewert des ersten Ausdrucks (der nicht bool sein darf) und nicht der aus der or-Operation resultierende boolesche Wert zugewiesen wird. Beachten Sie, dass dies der einzige (?) Unterschied zwischen ist OR und || Operator. Versuchen $result = mysql_query(...) || die('error') und du wirst sehen, dass es nicht funktioniert.

    – totes Fleisch

    12. Dezember 2015 um 17:59 Uhr

  • @deadbeef danke für den Hinweis. Es ist eine Schande, Präzedenzfälle zu verwechseln, nachdem man in genau diesem Thema geschimpft hat. Jetzt ist es korrigiert, können Sie es bitte überprüfen?

    – Ihr gesunder Menschenverstand

    13. Dezember 2015 um 15:23 Uhr

  • Ich habe gerade diese Antwort gesehen, als ich nach etwas anderem gesucht habe. die; ist großartig und sollte immer dann verwendet werden, wenn es einen Hack gibt, oder einfach nur so etwas tun header('LOCATION:https://www.ic3.gov'); die;. Es ist auch in Ordnung die; wenn es zu einem Verbindungsfehler kommt. Das ist eine schreckliche Antwort.

    – StackSlave

    25. Juli 2017 um 6:20 Uhr


  • @StackSlave verwechseln Sie hier nicht die Verwendung von die(), exit(). Ihr gesunder Menschenverstand erklärt das hier or die() Wird in diesem Fall verwendet, werden Systeminformationen angezeigt. Ihre Nutzung header('LOCATION:https://www.ic3.gov'); die; ist in der Tat keine Offenlegung von Systeminformationen, auch eine Tatsache, dass der Würfel oder der Ausgang dort aus Sicherheitsgründen benötigt wird, da Sie dem http-Client nicht vertrauen sollten, dass er die Umleitung respektiert und ihr folgt.

    – Raymond Nijland

    29. Juni 2019 um 16:50 Uhr


  • Ich schlage nicht vor, dass Informationen an ic3 gehen. Ich habe das nur als Weiterleitung verwendet, nachdem Sie auf einen Hack getestet haben, z. B. wenn jemand versucht, Informationen mit offensichtlichen Verstößen an Ihre Webseite zu senden, wie Sie einen oder mehrere reguläre Ausdrücke erwarten würden. Der Hacker versucht also zu sehen, ob er Schwachstellen aufdecken kann (auch wenn du es verhinderst). Das ist also nur ein Umleitungsbeispiel die;. Natürlich leitet es sie zu ic3 um. Was ic3 und Ihr Browser-Anbieter tun, ist mir schleierhaft. Das hätte ich deutlicher machen sollen. Verwenden die; die ganze Zeit nach einer Umleitung.

    – StackSlave

    30. Juni 2019 um 8:30 Uhr


mysqli oder sterben muss es sterben
Mixer

or ist nur ein Operator (sehr ähnlich zu ||).

Die or die() Syntax funktioniert, weil or Kurzschlüsse, was bedeutet, dass, wenn die erste Aussage wahr ist, True or X wird immer wahr sein, also X wird nicht ausgewertet und Ihr Skript nicht die.

Ja, Sie können nach dem (oder) eine andere Funktion angeben. Folgendes habe ich getestet:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}

Es muss nicht sein die() speziell, aber es muss etwas sein, das das Skript beim Aufrufen anhält exit() oder die(), oder etwas, das eine Ausnahme auslöst. Andernfalls fährt das Skript mit dem Rückgabewert dieser Funktion fort (der wahrscheinlich entweder null oder eine Art Junk ist). $update_resultwas mit ziemlicher Sicherheit zu Problemen führen wird.

993530cookie-checkmysqli oder sterben, muss es sterben?

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

Privacy policy