Ankündigung

Einklappen
Keine Ankündigung bisher.

DB Migration nach PHP 8 - Maschineller code Lektor bekannt?

Einklappen

Neue Werbung 2019

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

  • #16
    Zwischenbescheid:

    Euch habe ich zu verdanken dass:
    - nach 5 Jahren XAMPP inzwischen auf port 80 läuft,
    . die DB lokal geladen ist
    und ich folgende error Meldung bekommen konnte:

    Fatal error: Uncaught Error:
    Call to undefined function each() in C:\xampp\htdocs\maculele\php\class.FastTemplate.ph p:503 Stack trace: #0 C:\xampp\htdocs\maculele\php\modules.php(61):
    FastTemplate->define(Array) #1 C:\xampp\htdocs\maculele\php\volksnav.php(99):
    printTemplate(Array, 'result.tpl') #2 {main} thrown in C:\xampp\htdocs\maculele\php\class.FastTemplate.ph p on line 503

    Damit kann ich den Fehler eingrenzen aber Tipps könnten die Angelegenheit beschleunigen. Was wird aus each(?)

    Kommentar


    • #17
      Zitat von VolksNav Beitrag anzeigen
      Damit kann ich den Fehler eingrenzen aber Tipps könnten die Angelegenheit beschleunigen. Was wird aus each(?)
      idR lässt sich das durch foreach ersetzen - das wird allerdings nicht das einzige Problem in der Klasse bleiben …

      Kommentar


      • #18
        Mal ChatGPT gefragt:

        In PHP, die each() Funktion wurde in Version 7.2 als veraltet markiert und in Version 8.0 entfernt. Anstelle von each() sollten Sie jetzt die foreach() Schleife verwenden, um durch Arrays zu iterieren.

        Hier ist ein Beispiel, wie man von each() zu foreach() wechselt:

        Mit each() (veraltet):
        PHP-Code:
        $array = array('a''b''c');

        reset($array);
        while (list(
        $key$value) = each($array)) {
            echo 
        "{$key} => {$value}\n";

        Mit foreach() (empfohlen):
        PHP-Code:
        $array = array('a''b''c');

        foreach (
        $array as $key => $value) {
            echo 
        "{$key} => {$value}\n";

        foreach() ist eine einfachere und klarere Methode zum Durchlaufen von Arrays in PHP und wird von modernen PHP-Versionen unterstützt.

        Kommentar


        • #19
          Konnte inzwischen bei fastTemplate alle 12 each() durch foreach() ersetzen.
          Habe probeweise die neue fastTemplate online gestellt: wieder leere 2. Seite.

          Sowohl für debug= 0 als für 1 lautet nun die error message über XAMPP:

          can't open template: root not valid.

          Any suggestions?

          Kommentar


          • #20
            Zitat von VolksNav Beitrag anzeigen
            can't open template: root not valid.
            Logisch, die Klasse hat keinen gültigen Konstruktor - und in diesem wurde die Klassenkonstante ROOT gesetzt.

            Any suggestions?
            Wie schon mehrfach geschrieben: verschiebe das Ding nach /dev/null. Selbst wenn du den Konstruktor richtig benennst kommt dann sicher das nächste Problem um die Ecke …

            Kommentar


            • #21
              Probleme sind da um gelöst zu werden, sagen Viele.

              Ich habe das mit der /dev/null Verschiebung und den Konstruktor nicht verstanden (limit of imagination), schon alleine weil ich vorher nur online erproben konnte.

              Nochmals: die Suchmaschine volksnav und die Testmaschine watchrose laufen online mit PHP7.4 wie gewünscht. Schalte ich watchrose um auf PHP8, erscheint die 2. Seite nicht.


              Nun habe ich endlich XAMPP und die fastTemplate wurde upgraded. switch() kann bleiben.

              Ich bitte um Beschreibung für Doofe bezüglich Verschiebung und Konstruktor-Änderung, Dann kann die unprofessionelle aber demofähige Lösung nicht weit sein.

              Kommentar


              • #22
                Zitat von VolksNav Beitrag anzeigen
                Ich bitte um Beschreibung für Doofe bezüglich Verschiebung und Konstruktor-Änderung,
                Etwas nach /dev/null zu verschieben heißt es zu löschen. Zum Konstruktor habe ich das Handbuch bereits verlinkt, lies hier besonders den Abschnitt "Konstruktoren alten Stils" (unter dem zweiten Beispiel, lässt sich leider nicht direkt verlinken).

                Kommentar


                • #23
                  Danke für den Hinweis auf Beispiel 3 . Bei Beispiel 2 schliefe ich immer ein.
                  Ich muss auch Visual Basic Express 2010, iphone, Android. etc. "programmieren", da kommen viele Begriffe zusammen.

                  Aber wenn ich es richtig verstanden habe, kann bei PHP 8 der construct code vereinfacht werden WENN bei PHP 7 vorhanden. Ich habe nirgendwo den ominösen constructor gefunden.
                  Wo sehe ich was falsch?

                  Kommentar


                  • #24
                    Zitat von VolksNav Beitrag anzeigen
                    Danke für den Hinweis auf Beispiel 3 . Bei Beispiel 2 schliefe ich immer ein.
                    Bahnhof. Der Abschnitt auf den ich verwiesen habe steht nach dem Beispiel 2, von Beispiel 3 schreib ich nichts.

                    Aber wenn ich es richtig verstanden habe, kann bei PHP 8 der construct code vereinfacht werden WENN bei PHP 7 vorhanden. Ich habe nirgendwo den ominösen constructor gefunden.
                    Wo sehe ich was falsch?
                    Du hast den von mir in #22 genanten Absatz überhaupt nicht gelesen, sonst wüsstest du nämlich dass du eine Methode suchen musst die genauso heißt wie die Klasse selbst. Übrigens hat das nichts mit der Umstellung von PHP 7 auf 8 zu tun: __construct() gibt es bereits seit PHP 5, also seit bald 20(!) Jahren - die alte Konstruktorvariante ist noch ein Überbleibsel aus PHP 4!

                    Kommentar


                    • #25
                      Gelesen ja, verstanden nein.

                      Aber #24 enthält eine wichtige Spur. Mit "Methode" könnte "function" gemeint sein.

                      Bingo, es gibt 2 functions die den gleichen Namen haben wie die Klasse.

                      Frage: müsste ich dann z. B. innerhalb der class FastTemplate nur Folgendes ändern?

                      // alt:

                      function FastTemplate ($pathToTemplates = "") {

                      global $php_errormsg;

                      if(!empty($pathToTemplates)){ $this->set_root($pathToTemplates); }

                      } // function

                      ----------------------------

                      // neu:

                      public function __construct( public float $pathToTemplates = 0.0,) // mit Komma ?
                      {
                      global $php_errormsg; // hier richtig?
                      }

                      Kommentar


                      • #26
                        Zitat von VolksNav Beitrag anzeigen
                        Aber #24 enthält eine wichtige Spur. Mit "Methode" könnte "function" gemeint sein.
                        Ich war jetzt eigentlich davon ausgegangen dass die Grundlagen bekannt sind und du damit weißt dass Funktionen in Klassen Methoden genannt werden …

                        Bingo, es gibt 2 functions die den gleichen Namen haben wie die Klasse.
                        Nein, nur eine - eine Klasse kann nicht zwei Methoden mit dem gleichen Namen haben.

                        Frage: müsste ich dann z. B. innerhalb der class FastTemplate nur Folgendes ändern?
                        PHP-Code:
                        // neu:
                        public function __construct( public float $pathToTemplates 0.0,) // mit Komma ?
                        {
                            global 
                        $php_errormsg// hier richtig?

                        Ein klares Jein. Vom Prinzip her mit __construct als Name der Methode und dem "public" ganz vorne für die Sichtbarkeit der Methode ist es richtig, beim Rest sind aber noch einige Fehler:
                        • $pathToTemplates soll keine Klasseneigenschaft werden, somit gehört das public da nicht hin
                        • so dürfte der an __construct übergebene Parameter nur vom Typ float sein was für einen Pfad natürlich nur wenig sinnvoll ist. Warum behältst du den alten Standardwert (einen leeren String) nicht bei (als Typ gehört von die Eigenschaft dann ein »string«, das kannst du aber auch ganz weglassen)? Wobei ich eher mit null als Standardwert arbeiten würde …
                        • das Komma hinter dem Parameter ist nicht notwendig, aber auch nicht falsch
                        • das »global $php_errormsg;« ist in zweierlei Hinsicht falsch: zum einen ist global immer böse[tm] und sollte nicht verwendet werden und zum anderen gibt es $php_errormsg seit PHP 8 nicht mehr (die dafür nötige Einstellung track_errors wurde entfernt) - die Zeile kann also ersatzlos entfallen (es kann sein dass das Nebenwirkungen hat, weiter unten wird die Variable in einem Fehlerfall nochmal verwendet, im Handbuch steht was man stattdessen verwenden muss)
                        • wo ist die Zeile mit dem if und dem Aufruf von set_root()? Das ist die wichtige Zeile damit in der Klasse $this->ROOT gefüllt wird und die Fehlermeldung aus #19 verschwindet

                        Kommentar


                        • #27
                          Correction: es gibt 3 Klassen die namensgleiche functions enthalten, auch die classe.Validator.
                          Habe bei der funktionierenden Suchmaschine gezielt getestet: nur die class.FastTemplate is massgebend.

                          Habe dort geändert auf: function __construct( set_root($pathToTemplates = 0.0,) { }

                          Es entstehen keine neuen errors aber sowohl local als auch online ändert sich noch nix, egal ob ich
                          DEBUG = 0 oder 1
                          und
                          error_reporting(0) oder error_reporting(1)
                          setze.

                          Was könnte ich noch ausprobieren?
                          ( Kontextwechsel lesen habe ich morgen in der Agenda )

                          Kommentar


                          • #28
                            Error-Log lesen

                            Kommentar


                            • #29
                              Zitat von VolksNav Beitrag anzeigen
                              Habe dort geändert auf: function __construct( set_root($pathToTemplates = 0.0,) { }
                              Das ist kein gültiges PHP, das wirf nur einen Syntaxfehler.

                              Kommentar


                              • #30
                                Mit den errorLogs komme ich durcheinander: es gibt apache logs, mySQL logs, browser logs. etc. Habe auch Dateien search/log/ error.log und counter.log, aber dort wird seit 2014 nie was geschrieben, offensichtlich mache ich nicht das Richtige.

                                Neuanfang: eine Suchmaschine funktioniert online mit 7. 4., mit 8 nicht.

                                Lokal mit XAMPP kommt im Browser genau die root not valid-Fehlemeldung aus der class FastTemplate:
                                function get_template ($template) { if(empty($this->ROOT)) { $this->error("Cannot open template. Root not valid.",1); return false; } $filename = "$this->ROOT"."$template"; $contents = implode("",(@file($filename))); if( (!$contents) or (empty($contents)) ) { $this->error("get_template() failure: [$filename] $php_errormsg",1); } return $contents; } // end get_template
                                Kann mir jemand einen Tipp geben was ich versuchen könnte um diese kleine Hürde zu überwinden? Womöglich wäre sogar der Fall gelöst.

                                Kommentar

                                Lädt...
                                X