[PHP][MySQL] Fehler unbekannter Ursache bei einer Abfrage

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

  • [PHP][MySQL] Fehler unbekannter Ursache bei einer Abfrage

    Guten Abend liebe Community :love: ,

    aus Zufall erfuhr ich heute, dass eine Abfrage von mir nicht mehr funktioniert. Vor ~2 Monaten funktionierte alles und ohne etwas zu ändern, scheint es nun irgendwo einen Fehler zu geben. (Gab es ein Update, das bestimmte Funktionen außer Betrieb setzte?)

    Ich wäre euch äußerst dankbar, wenn Ihr mir bei der Fehlersuche, sowie Behebung, behilflich sein könntet.

    Was ist der Sinn der Abfrage:
    Durch die Eingabe eines eindeutigen Codes werden die passenden Daten (URLs) aus einer Datenbank ausgelesen und als Button wiedergegeben.

    Erklärung der Attribute:

    Quellcode

    1. custom_url = eindeutiger Code
    2. url_1 = URL Nr. 1 (z.B.: [url]https://www.google.de/maps/place/Berlin/[/url] )
    3. url_1_call = Covername des Links für den Button (z.B.: "Google Maps - Berlin")
    4. url_2 = usw....



    Die eigentliche Abfrage ist folgende:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. $search = $_POST['search'];
    3. echo "search = $search // "; //DEBUG
    4. $con = new MySQLi("***","***","***", "***");
    5. if ($con->connect_error) { //DEBUG
    6. echo "Failed to connect to MySQL: " . mysqli_connect_error();
    7. exit();
    8. } else {
    9. echo "Verbunden; ";
    10. }
    11. $sql = "SELECT * FROM fakten WHERE custom_url LIKE '$search'";
    12. if(mysqli_num_rows($sql)==0) { //DEBUG
    13. echo "Keine Einträge gefunden; ";
    14. } else {
    15. echo "Einträge gefunden";
    16. }
    17. if(mysqli_query($con, $sql)===TRUE) { //DEBUG
    18. echo "Funktioniert; ";
    19. } else {
    20. echo "Funktioniert nicht; ";
    21. }
    22. $db_content = mysqli_query( $con, $sql);
    23. echo "<h2>Suchergebnis</h2>";
    24. echo "<p>Folgende Quellen konnten unter dem Suchbegriff '<b>"; echo $search; echo "</b>' gefunden werden:</p>";
    25. while ($zeile = mysqli_fetch_array( $db_content, MYSQL_ASSOC)) {
    26. if ($zeile['url_1']!='') {
    27. echo "<p> - - - - - - - - - - - - - - </p>";
    28. echo "@@558709d9a68f26fc972ac5e92dc9c922e21edc44@@</br>";
    29. }
    30. if ($zeile['url_2']!='') {
    31. echo "@@1c3a5c6cb8ee4a36280a0ba710c41551a221d425@@</br>";
    32. }
    33. if ($zeile['url_3']!='') {
    34. echo "@@f9f2999a974e863ccc831718859636d862fb423b@@</br>";
    35. }
    36. if ($zeile['url_4']!='') {
    37. echo "@@7ba62d3a97f55d07637207cca7cc533326a705b1@@</br>";
    38. }
    39. if ($zeile['url_4']!='') {
    40. echo "@@8f0da71be997d40b66176a4eed671db192676431@@";
    41. }
    42. } ?>
    43. <input type="button" onclick="location.href='./index.html';" value="Neue Suche" />
    44. <?php mysqli_close($con); ?>
    Alles anzeigen


    Bild vom Code, da Formatierungfehler:



    Durch DEBUG-Codes und Proben konnte ich folgendes feststellen:

    Quellcode

    1. * $search wird erfolgreich eingelesen
    2. * Verbindung zur Datenbank wird erfolgreich hergestellt.
    3. * Datenbank enthält sicher Einträge
    4. * $sql "findet" keine Einträge (es wurde sicher nach einem vorhandenen custom_url gesucht)
    5. * $dp_content gibt dementsprechend einen Fehler aus


    Meine Schlussfolgerung: Der Fehler liegt irgendwo in dieser Zeile $sql = "SELECT * FROM fakten WHERE custom_url LIKE '$search'";.
    Gebe ich diese Zeile ($search durch einen vorhandenen custom_url ersetzt) in phpMyAdmin ein, so funktioniert es.
    Sprich, es liegt an der Zeile, jedoch irgendwie auch nicht? ?( - Ich weiß nicht mehr weiter.

    P.S. Es wurde auch versucht das $search im Code direkt durch einen custom_url zu ersetzten. Selbiges Ergebnis...

    VG und Danke im Voraus!!! <3
    Daniel
  • DerCooper schrieb:

    Vor ~2 Monaten funktionierte alles und ohne etwas zu ändern, scheint es nun irgendwo einen Fehler zu geben.
    Hast du dir in dieser Zeit irgendwelche PHP oder MySQL Updates heruntergeladen?
    Mit freundlichen Grüßen
    FineTime

    JacLos schrieb:

    INFO: Bei mysql_format steht %d immer für dämlich. Deshalb nehmen wir %s für schlau oder %e für elegant.
    [...]
    Wichtig: Diese abfrage muss IMMER bei stocks stehen, ansonsten kann es sein, dass dein computer gelöscht wird.

    Weitere, mehr oder weniger lustige, Zitate findet ihr auf meinem Profil.
  • FineTime schrieb:

    DerCooper schrieb:

    Vor ~2 Monaten funktionierte alles und ohne etwas zu ändern, scheint es nun irgendwo einen Fehler zu geben.
    Hast du dir in dieser Zeit irgendwelche PHP oder MySQL Updates heruntergeladen?
    Nein, habe ich nicht. Sollte das nicht irgendwie automatisch passiert sein, wurde kein Update installiert. Aktuell wird die PHP-Version 7.3.8 verwendet.
  • Du rufst mysqli_num_rows statt mit dem Query Ergebnis einfach nur mit deinem SQL String auf. Deswegen gibt er dir auch immer zurück dass du keine Ergebnisse hast.

    Und ich kenne mich zwar mit PHP nicht aus, aber könnte es sein dass die zwei einzelnen PHP Codeblöcke gleichzeitig ausgeführt werden? Dadurch würde dann die Verbindung zum MySQL Server getrennt werden und dann nichtmehr funktionieren. Warum schreibst du das in einen seperaten Block und nicht einfach nach dem while?
    Ich helfe zu allen Fragen bezüglich PAWN Scripting gerne weiter.
    Auch im Bereich JavaScript und dort der RageMP API helfe ich gern.

    Konversation: Konversation starten
    Discord: LeonMrBonnie#2251

  • LeonMrBonnie schrieb:

    Du rufst mysqli_num_rows statt mit dem Query Ergebnis einfach nur mit deinem SQL String auf. Deswegen gibt er dir auch immer zurück dass du keine Ergebnisse hast.

    Und ich kenne mich zwar mit PHP nicht aus, aber könnte es sein dass die zwei einzelnen PHP Codeblöcke gleichzeitig ausgeführt werden? Dadurch würde dann die Verbindung zum MySQL Server getrennt werden und dann nichtmehr funktionieren. Warum schreibst du das in einen seperaten Block und nicht einfach nach dem while?
    Super, vielen Dank für den Tipp! Ich habe die Debug-Abfrage folgendermaßen überarbeitet:

    PHP-Quellcode

    1. $sql = "SELECT * FROM fakten WHERE custom_url LIKE '$search'";
    2. if(!$sql) { //DEBUG
    3. echo "Keine Einträge gefunden; ";
    4. } else {
    5. echo "Einträge gefunden";
    6. }

    Somit erscheint nun die Nachricht, dass der Eintrag gefunden wurde. Somit kann der Fehler in diesem Bereich auch ausgeschlossen werden (?).

    Ich habe zusätzlich den Teil mit der Trennung der Verbindung in den oberen Block verschoben. Das macht meines Wissens keinen Unterschied, denn alles PHP-haltige ist oben schon abgearbeitet worden.

    ----

    Nevertheless... Bei der letzten Debug-Schleife kommt immer noch die Meldung "Funktioniert nicht". Habe ich etwa bei mysqli_query einen Fehler gemacht bzw. hat sich dort update-technisch etwas geändert? Es lief ja eigentlich alles :huh:
  • Moin,
    bin jetzt ein paar mal dein Script durch gegangen und konnte auch keinen Fehler (Bis auf mysqli_num_rows Aufruf) finden..
    Füge mal die Error Ausgabe nach "Funktioniert nicht" ein und poste was raus kommt.

    Quellcode

    1. printf("Error message: %s\n", mysqli_error($link));
    Falls das was öffentliches wird empfehle ich dir zudem Infos zur SQL Injection.

    Liebe Grüße
    Phil

    (Mein erster Beitrag seit 4 Jahren :thumbup: )
    Momentan im Ruhestand

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GrumpyCat ()

  • Alter Beitrag:
    Spoiler anzeigen

    GrumpyCat schrieb:

    Moin,
    bin jetzt ein paar mal dein Script durch gegangen und konnte auch keinen Fehler (Bis auf mysqli_num_rows Aufruf) finden..
    Füge mal die Error Ausgabe nach "Funktioniert nicht" ein und poste was raus kommt.

    Quellcode

    1. printf("Error message: %s\n", mysqli_error($link));

    Falls das was öffentliches wird empfehle ich dir zudem Infos zur SQL Injection.

    Liebe Grüße
    Phil

    (Mein erster Beitrag seit 4 Jahren :thumbup: )


    Was für eine Ehre! :P Herzlichen Glückwunsch zum ersten Beitrag nach langer Zeit. :D

    Ich habe deine Zeile eingefügt und getestet. Es wurde kein Error preisgegeben... X/

    Vielen Dank für den Hinweis zur SQL Injection, werde ich auf jeden Fall mal anschauen und sicherlich einarbeiten.

    ---

    Eine ziemlich gute Frage woran das liegen kann.. Vllt an einem Wert, der in der Datenbank gespeichert ist und durch irgendeine mysteriöse Kombination von Zeichen die ganze Datenbank lahm legt? Macht das Sinn, gibt es so etwas? :/ :D


    Edit:

    Status: Es funktioniert nun! Für die Zukunft:

    1. Bei der if-Abfrage mit mysqli_query($con, $sql)===TRUE war ein "=" zu viel. Nach der Ausbesserung wurde "Funktioniert" ausgegeben. Sprich es lag auch nicht daran.

    2. Der Fehler lag in der while-Schleife beim MYSQL_ASSOC. Es muss nämlich MYSQLI_ASSOC heißen. X/

    Nun wird alles einwandfrei wiedergegeben, wie es sein soll. Wäre jz wunderbar wenn mit vllt jemand erklären könnte, wieso das wegen dem fehlendem i nicht mehr funktioniert hat ?(


    PS: Vielen Dank für die gebotene Hilfe! :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DerCooper () aus folgendem Grund: if-Schleife -> if-Abfrage

  • DerCooper schrieb:

    Wäre jz wunderbar wenn mit vllt jemand erklären könnte, wieso das wegen dem fehlendem i nicht mehr funktioniert hat
    Die neueren PHP Versionen verwenden für die Datenbank-Verbindung mysqli und nicht mehr nur noch mysql.
    Mit freundlichen Grüßen
    FineTime

    JacLos schrieb:

    INFO: Bei mysql_format steht %d immer für dämlich. Deshalb nehmen wir %s für schlau oder %e für elegant.
    [...]
    Wichtig: Diese abfrage muss IMMER bei stocks stehen, ansonsten kann es sein, dass dein computer gelöscht wird.

    Weitere, mehr oder weniger lustige, Zitate findet ihr auf meinem Profil.