Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem beim Umstieg von PHP 7.x auf 8.0

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem beim Umstieg von PHP 7.x auf 8.0

    Hallo, ich nutze hinter meiner iOS App eine Datenbank. Mit PHP7.3 und 7.4 funktioniert mein Code auch bisher immer einwandfrei. Jetzt sollte ich allerdings demnächst auf 8.0 umstellen. Wenn ich dies tue macht anscheinend "mysqli_fetch_array" Probleme.

    Hier ist der komplette Code:
    PHP-Code:
    <?php
        
    // Create connection
        
    $con=mysqli_connect("xxx","xxx","xxx","xxx");

        
    // Check connection
        
    if (mysqli_connect_errno()) {
            echo 
    "Failed to connect to MySQL: " mysqli_connect_error();
        }

        
    // Read request parameters
        
    $UUID $_REQUEST["UUID"];

        
    // Read Status
        
    $sqlSettings "SELECT * FROM tbl_settings WHERE UUID='".$UUID."'";
        
    $dbergSettings mysqli_query($con$sqlSettings);

        if (!
    $dbergSettings) die('Ungültige Abfrage: '.mysqli_error());

        if (
    count(mysqli_fetch_array($dbergSettingsMYSQL_ASSOC)) == 0) {
            
    $ErrorMsg "NotFound";
        } else {
            
    $ErrorMsg "Found";
       }

        
    mysqli_close($con);
       
    $returnValue = array("ErrorCode"=>$ErrorMsg);
        echo 
    json_encode($returnValue);

    ?>
    Bestimmt kann mir hier jemand helfen wo da der Fehler liegt

  • #2
    "Probleme", gehts etwas genauer, oder soll man jetzt drauf los raten?

    Davon abgesehen hat der Code eine riesen Sicherheitslücke, weil Request-Werte direkt in SQL-Code eingefügt werden. Ich hoffe der Code ist so nirgendwo produktiv im Einsatz, ansonsten würde ich dazu raten ihn sofort offline zu nehmen, bis das behoben ist.

    Kommentar


    • #3
      Vielen Dank erstmal für den Sicherheitshinweis. Die Request-Werte werde ich dann nochmal besonders überprüfen.

      Aber unabhängig davon funktioniert der Code unter PHP 7.3 und 7.4 (Anbieter: strato) einwandfrei und gibt bei in der Tabelle gefundener UUID "Found" bzw "NotFound" zurück. Wenn ich auf PHP 8.0 wechsele tritt wohl ein Fehler auf.

      Die Anweisung
      PHP-Code:
      $row mysqli_fetch_array($dbergSettingsMYSQL_ASSOC); 
      erzeugt wohl einen Fehler. Gibt es mysqli_fetch_array unter PHP8 nicht mehr?


      Kommentar


      • #4
        Warum verrätst du nicht, welcher Fehler erzeugt wird?

        Kommentar


        • #5
          Zitat von Dirk86 Beitrag anzeigen
          Vielen Dank erstmal für den Sicherheitshinweis. Die Request-Werte werde ich dann nochmal besonders überprüfen.
          Beschäftige dich dafür mit dem Thema Kontextwechsel.

          Aber unabhängig davon funktioniert der Code unter PHP 7.3 und 7.4 (Anbieter: strato) einwandfrei und gibt bei in der Tabelle gefundener UUID "Found" bzw "NotFound" zurück. Wenn ich auf PHP 8.0 wechsele tritt wohl ein Fehler auf.
          Und welcher? Woraus schließt du dass das unter PHP 8 nicht mehr funktioniert?

          Gibt es mysqli_fetch_array unter PHP8 nicht mehr?
          Doch, allerdings ist die Verwendung der Funktion bei dir auch schon unter PHP 7 falsch: die Rückgabe der Funktion ist ein Array mit einem Datensatz bzw. NULL wenn es keinen Datensatz (mehr) gibt - ein count() auf die Rückgabe angewandt gibt also niemals die Anzahl der Datensätze sondern die Anzahl der Felder einer Ergebniszeile.
          Was sich allerdings mit PHP 8 geändert hat ist das Verhalten bei count(NULL) (also wenn nichts gefunden wurde): das führt jetzt zu einem Fatal Error, vorher (PHP 7.2-7.4) war das "nur" eine Warnung - du musst also die Funktion count() durch is_null() ersetzen, dann sollte es wieder funktionieren.

          Übrigens: dein mysqli_error() ist auch falsch: die Funktion erwartet die Verbindungskennung als Parameter. Und: verwende niemals SELECT *, gib immer an welche Spalten du brauchst.

          Kommentar


          • #6
            Und welcher? Woraus schließt du dass das unter PHP 8 nicht mehr funktioniert?
            Gute Frage. Ich habe leider keine Ahnung welcher Fehler auftritt. Ich schreibe den Code mit Xcode, lade ihn hoch und führe ihn aus. mit php7.x kommt es ja auch zu der gewünschten Ausgabe aber unter 8 passiert nichts. Keine Ausgabe. Wie kann ich den die Fehlermeldung sehen?

            Ok, aber auch wenn ich die Abfrage mit "if(count(..." entferne und nur einfach mal
            PHP-Code:
            $row mysqli_fetch_array($dbergSettingsMYSQL_ASSOC); 
            einbaue passiert nichts mehr.

            Kommentar


            • #7
              Zitat von Dirk86 Beitrag anzeigen
              Wie kann ich den die Fehlermeldung sehen?
              Die steht im PHP Error Log.

              Kommentar


              • #8
                Ok, damit hab ich mich noch gar nicht befasst Wo finde ich die log?

                Kommentar


                • #9
                  Zitat von Dirk86 Beitrag anzeigen
                  Ok, damit hab ich mich noch gar nicht befasst Wo finde ich die log?
                  Das sollte dir der Serverbetreiber sagen können. Üblicherweise wird der Log-Pfad auch mit phpinfo() ausgegeben, aber das kann je nach Server auch anders gehandhabt sein.

                  Kommentar


                  • #10
                    Ok. Ich erkundige mich. Trotzdem nochmal:

                    PHP-Code:
                    <?php

                        
                    // Create connection
                        
                    $con=mysqli_connect("xxx","xxx","xxx","xxx");

                        
                    // Read Status
                        
                    $sqlSettings "SELECT * FROM tbl_settings";
                        
                    $dbergSettings mysqli_query($con$sqlSettings);

                        
                    // Hier geht wohl etwas schief
                        
                    $row mysqli_fetch_array($dbergSettingsMYSQL_ASSOC);

                        
                    mysqli_close($con);

                        echo 
                    "Hallo";
                    ?>
                    Mit der Zeile $row = ... geht es unter php8 schief. Sorry, dass ich gerade keine Fehlerbeschreibung geben kann....

                    Kommentar


                    • #11
                      Das kann viele Gründe haben. Der Grund steht im Error Log.

                      Aber ich tippe mal darauf, dass PHP einen Fehler wirft, weil es die Konstante MYSQL_ASSOC gar nicht gibt. Die gibt es übrigens schon seit PHP 5.5 nicht mehr.

                      Kommentar


                      • #12
                        Ich habs... glaube ich.

                        Aber ich tippe mal darauf, dass PHP einen Fehler wirft, weil es die Konstante MYSQL_ASSOC gar nicht gibt. Die gibt es übrigens schon seit PHP 5.5 nicht mehr.
                        Also erstmal ich bin wohl blind. Ja, mit der Konstanten MYSQLI_ASSOC funktioniert es. Und wenn ich Dann mit

                        PHP-Code:
                        if (is_null($row['Device'])==1) {... 
                        prüfe, läuft es. Jetzt muss ich halt ca 50 Dateien umschreiben. Naja...

                        Vielen Dank an euch alle

                        Kommentar


                        • #13
                          Eine einigermassen brauchbare IDE kann Search&Replace über ein ganzes Projekt ausführen.

                          Kommentar


                          • #14
                            Am Umändern wirst Du nicht vorbeikommen. Ich helfe mir bei solchen Geschichten bspw. mit
                            Code:
                            define("PHP_OLDKONST" ,PHP_NEWKONST); (mit den entspr. Bezeichnern)
                            Dann läuft der Kram und ich kann die Dateien in Ruhe ändern.

                            Kommentar


                            • #15
                              Zitat von Dirk86 Beitrag anzeigen
                              Also erstmal ich bin wohl blind.
                              Du hast wohl eher error_reporting quasi abgedreht bzw. nicht ins Errorlog geschaut: sonst wäre dir die Warnung aufgefallen die PHP seit einiger Zeit wegen der nicht definierten Konstante wirft. Mit PHP 8 wurde das Level der Fehlermeldung aber eben auf Fatal Error angehoben und da ist nichts mehr mit ignorieren …

                              Und wenn ich Dann mit
                              PHP-Code:
                              if (is_null($row['Device'])==1) {... 
                              prüfe, läuft es.
                              , ist aber immer noch Käse. is_null liefert immer true oder false, die Prüfung auf ==1 ist also Unsinn².

                              Kommentar

                              Lädt...
                              X