Bastian: header Location in while Schleife?

0 85

header Location in while Schleife?

Bastian
  • php
  1. 0
    Auge
    1. 0
      Bastian
      1. 0
        Robert B.
      2. 0
        Auge
  2. 0
    Robert B.
    1. 0
      Auge
  3. 0
    Felix Riesterer
  4. 1
    Rolf B
    1. 0
      Bastian
      1. 0
        Raketenwilli
        1. 0
          Bastian
  5. 0
    Raketenwilli
    1. 0
      Bastian
      1. 0
        Raketenwilli
        1. 0
          Bastian
          1. 0
            Raketenwilli
            1. 0
              Bastian
              1. 0
                Raketenwilli
                1. 0
                  Bastian
                  1. 0
                    Bastian
                  2. 0
                    Rolf B
                    1. 0
                      Bastian
                      1. 0
                        Rolf B
                        1. 0
                          Bastian
                          1. 0
                            Rolf B
                            1. 0
                              Bastian
                              1. 0
                                Rolf B
                                1. 0
                                  Bastian
                                  1. 0
                                    Raketenwilli
                                    1. 0
                                      Bastian
                                      1. 0
                                        Raketenwilli
                                    2. 0
                                      Gunnar Bittersmann
                                      1. 0
                                        Raketenwilli
                                      2. 0
                                        Robert B.
                                        • menschelei
                                    3. 0
                                      Robert B.
                                  2. 0
                                    Rolf B
                                    1. 0
                                      Raketenwilli
                                      1. 0
                                        Bastian
                                        1. 0
                                          Rolf B
                                        2. 0

                                          Potentieller Lieblingskunde ...

                                          Raketenwilli
                                          1. 0
                                            Bastian
                                            1. 0
                                              Mitleser 2.0
                                              1. 0
                                                Bastian
                                    2. 0
                                      Bastian
                                      1. 0
                                        Raketenwilli
                                        1. 0

                                          Schleife läuft durch, wenn ich etwas Code heraus nehme

                                          Bastian
                                          1. 0
                                            Tabellenkalk
                                            1. 0
                                              Bastian
                                              1. 0
                                                Rolf B
                                                1. 0
                                                  Bastian
                                                  1. 0

                                                    Linux: Dateien mit gleichen Namen in zwei Verzeichnissen finden und vergleichen

                                                    Raketenwilli
                                                    • linux
                                                    • shell
                                                    1. 0
                                                      Bastian
                                          2. 0
                                            Rolf B
                                        2. 0

                                          Variable aus Klasse im Restscript nutzen

                                          Bastian
                                          1. 0
                                            Rolf B
                                            1. 0
                                              Bastian
                                              1. 0
                                                Rolf B
                                                1. 0
                                                  Tabellenkalk
                                                  1. 0
                                                    Rolf B
                                                    1. 0
                                                      MudGuard
                                                2. 0
                                                  Bastian
                                                  1. 0
                                                    Der Martin
                                                    1. 0
                                                      Bastian
                                                      1. 0
                                                        Bastian
                                                        1. 0
                                                          Rolf B
                                                          1. 0
                                                            Bastian
                                                            1. 0
                                                              Rolf B
                                                              1. 0
                                                                Der Martin
                                  3. 0
                                    Robert B.
                                    • oop
                                    • php
                                    1. 0
                                      Bastian
            2. 0

              Einfache Lösung...

              Raketenwilli
              1. 0
                Bastian
                1. 0
                  Raketenwilli
                  1. 0
                    Bastian
                  2. 0
                    Gunnar Bittersmann
                    • menschelei
                    1. 0
                      Raketenwilli
                      1. 0
                        Der Martin
                    2. 0
                      Rolf B
                      1. 0
                        Der Martin
                        1. 0
                          Robert B.
  6. 0

    PHP-Syntax: Anführungszeichen

    Gunnar Bittersmann
    1. 0
      Bastian
      1. 0
        Gunnar Bittersmann
      2. 0
        Raketenwilli

Hallo,

ist es möglich, in einer while-Schleife fortwährend ein anderes Script aufzurufen?

$i=0;
while($i < 5) {
header(Location:"test.php?param=".$i."");
$i++;
}

test.php verursacht hierbei keine Bildschirmausgabe.

Bei mir bricht das aufrufende Script nach dem ersten Aufruf leider ab.

Bastian

  1. Hallo

    ist es möglich, in einer while-Schleife fortwährend ein anderes Script aufzurufen?

    Nein.

    $i=0;
    while($i < 5) {
    header(Location:"test.php?param=".$i."");
    $i++;
    }
    

    test.php verursacht hierbei keine Bildschirmausgabe.

    Wie auch? Du lässt es den Browser auf eine andere Seite weiterleiten.

    Bei mir bricht das aufrufende Script nach dem ersten Aufruf leider ab.

    Nein, es bricht nicht (im Sinne eines Fehlers) ab. Durch die Weiterleitung wird es einfach nicht mehr weiter ausgeführt. Es ist quasi fertig.

    Tschö, Auge

    --
    200 ist das neue 35.
    1. Hallo,

      Nein, es bricht nicht (im Sinne eines Fehlers) ab. Durch die Weiterleitung wird es einfach nicht mehr weiter ausgeführt. Es ist quasi fertig.

      Über ein entsprechendes include() funktioniert es aber auch nicht.

      Ich kann aber das komplette Empfängerscript nicht in eine Funktion auslagern.

      Was tun?

      Bastian

      1. Moin Bastian,

        was hast du denn eigentlich vor?

        Viele Grüße
        Robert

      2. Hallo

        Nein, es bricht nicht (im Sinne eines Fehlers) ab. Durch die Weiterleitung wird es einfach nicht mehr weiter ausgeführt. Es ist quasi fertig.

        Über ein entsprechendes include() funktioniert es aber auch nicht.

        Was funktioniert nicht?

        Das Skript leitet im ersten Durchlauf der Schleife auf ein anderes Skript (test.php) weiter, das vom Browser aufgerufen und dabei ausgeführt wird. Das Skript, das die Weiterleitung auslöst, kommt daher nicht zu den restlichen vier definierten Schleifenläufen. Von denen bekommst du nie etwas zu sehen.

        Ich kann aber das komplette Empfängerscript nicht in eine Funktion auslagern.

        Was tun?

        Dein Konzept überdenken. Vielleicht auch mit unserer Hilfe, aber dazu brauchen wie erheblich mehr Kontext. Was willst du erreichen? Wie sieht der Code insgesamt aus? Ist das Skript mit der Schleife eventuell ebenfalls die aufzurufende test.php?

        Tschö, Auge

        --
        200 ist das neue 35.
  2. Moin Bastian,

    ist es möglich, in einer while-Schleife fortwährend ein anderes Script aufzurufen?

    Soll das PHP-Skript als Kindprozess des aufrufenden oder separat aufgerufen werden? Und was soll der Browser damit anfangen?

    $i=0;
    while($i < 5) {
    header(Location:"test.php?param=".$i."");
    $i++;
    }
    

    test.php verursacht hierbei keine Bildschirmausgabe.

    Bei mir bricht das aufrufende Script nach dem ersten Aufruf leider ab.

    Logisch, denn du sendest den Redirect, der Browser hält sich brav daran und folgt der URL (die hier zudem unvollständig ist).

    Viele Grüße
    Robert

    1. Hallo

      header(Location:"test.php?param=".$i."");
      

      Logisch, denn du sendest den Redirect, der Browser hält sich brav daran und folgt der URL (die hier zudem unvollständig ist).

      Die Zeiten, in denen ein Redirect per Header eine absolute URL brauchte, sind vorbei. Wenn test.php im gleichen Verzeichnis liegt, in dem das hiesige Skript ausgeführt wird, passt das.

      Tschö, Auge

      --
      200 ist das neue 35.
  3. Lieber Bastian,

    in einer while-Schleife fortwährend ein anderes Script aufzurufen?

    ein anderes Script aufrufen bedeutet in diesem Fall genau was? Und wie Robert B schon fragte: Was hast Du denn eigentlich vor?

    Liebe Grüße

    Felix Riesterer

  4. Hallo Bastian,

    mach Dir klar, wie der Ablauf ist.

    Mal angenommen, dass deine while-Schleife in einem run_test.php steckt.

    Dann würde dies passieren:

    • Der Browser ruft run_test.php ab
    • run_test.php wird ausgeführt und der Browser erwartet eine HTML Seite als Antwort (die wirst Du sicherlich erzeugen, aber zeigst es nicht, weil es nicht zum Problem gehört; alles gut)
    • Diese Antwort ist eine HTTP Nachricht. Sie besteht aus
      • einer Kopfzeile (z.B. HTTP/1.1 200 OK)
      • einigen Header-Zeilen (von denen Location eine ist)
      • einer Leerzeile
      • dem Dokument, das der Browser anzeigen soll (zumeist also das HTML)

    D.h. run_test wird einmal aufgerufen schickt eine Antwort und der Browser muss dann damit etwas anfangen. Wenn Du einen Location-Header sendest, tut PHP automatisch noch etwas mehr: Es setzt den HTTP Statuscode auf 302 (sofern nicht ein anderer Statuscode gesetzt wurde), und DER führt dazu, dass der Browser nach einem Location Header sucht, um zu wissen, wohin er weiterleiten soll.

    Deine While-Schleife erzeugt fünf solcher Header. Allerdings rufst Du die header-Funktion ohne zweiten Parameter auf, und deshalb ersetzt PHP einen vorhandenen Location Header durch den neuen. Es bleibt also nur

    Location: test.php?param=5

    übrig, und dies ruft der Browser nun ab. Wenn test.php keine Ausgaben macht, führt das zu einem leeren Bildschirm.

    Es bleibt also die Frage nach den Alternativen. Dazu müsste man wissen, was test.php tun soll. Es macht keine Ausgaben, sagst Du. Sondern? Was tut es? Und wozu verwendet es den Parameter?

    Meine erste Annahme wäre, dass man den Code in test.php in eine Funktion packen sollte. In deiner while-Schleife kannst Du dann einfach die Funktion fünf mal aufrufen. Wie man das genau tun muss, hängt von diversen Dingen ab und lässt sich nicht ohne weitere Informationen sagen. Das Grundgerüst sähe so aus:

    $i=0;
    while($i < 5) {
       test($i);
       $i++;
    }
    
    function test($param)
    {
       echo "Hallo Welt $param \n";
    }
    

    Aber ob das für Dich so passt, kann ich ohne weiteres nicht sagen.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      danke für die lange Erklärung.

      Meine erste Annahme wäre, dass man den Code in test.php in eine Funktion packen sollte. Aber ob das für Dich so passt, kann ich ohne weiteres nicht sagen.

      Passt leider nicht.

      Das Script erstellt pro Durchlauf eine Datei. Diese wird im Normalfall auch ausgegeben. Ich möchte nun einen Ausnahmefall erstellen, der mir diese Dateien als batch erstellt, ohne sie auszugeben.

      Deshalb habe ich ein senderscript geschrieben, das mir ein Array aus ID's erstellt, die dann nacheinander das Empfängerscript aufrufen sollen, um die Dateien zu generieren und am Ablageort abzulegen. Wenn das geschehen ist, soll das Script diese dateien zippen und per mail versenden können.

      Bin jetzt bei includeangelangt.

      Da das Empfängerscript $_GET und $_POst Daten verarbeitet, setze ich diese manuell im Senderscript. So kann ich dann im Senderscript die Datei includieren und die Variablen sind im Scope enthalten.

      Soweit die Theorie, in der Praxis ist trotzdem nach 1 Datei Schluss. Ich sucher gerade nach einen versteckten "exit;" in der Empfängerdatei, finde aber keines, was relevant ist. Einfach das Empfängerscript alle ID's ausgeben lassen, funktioniert gut. Aber wirklich die Dateien generieren lassen, nur 1 Durchlauf und ich muss suchen, warum das so ist.

      Bastian

      1. Ich sucher gerade nach einen versteckten "exit;"

        Wie ich schon schrieb:

        nur der letzte Location-Header bleibt.

        Auf deutsch: Dein PHP merkt sich und übergibt dem Webserver nur den letzten Location-Header.

        1. Ich sucher gerade nach einen versteckten "exit;"

          Wie ich schon schrieb:

          nur der letzte Location-Header bleibt.

          Auf deutsch: Dein PHP merkt sich und übergibt dem Webserver nur den letzten Location-Header.

          ich bin doch von header(Location schon lange weg 😉

  5. ist es möglich, in einer while-Schleife fortwährend ein anderes Script aufzurufen?

    $i=0;
    while($i < 5) {
    header(Location:"test.php?param=".$i."");
    $i++;
    }
    

    test.php verursacht hierbei keine Bildschirmausgabe.

    Bei mir bricht das aufrufende Script nach dem ersten Aufruf leider ab.

    Klar: Wegen des offensichtlichen Syntaxfehlers.

    Aber auch wenn der repariert ist: Das Skript wird abgearbeitet und nur der letzte Location-Header bleibt.

    <?php
    $i=0;
    while($i < 5) {
        header("Location: test.php?param=$i");
    $i++;
    }
    

    (Das funktioniert auch ohne Syntaxfehler nicht!)

    HTTP-Anforderung gesendet, auf Antwort wird gewartet … 
    ---response begin---
    HTTP/1.1 302 Found
    Host: localhost:9000
    Date: Wed, 11 May 2022 12:18:13 GMT
    Connection: close
    X-Powered-By: PHP/8.1.2
    Location: test.php?param=4
    Content-type: text/html; charset=UTF-8
    ---response end---
    

    Der letzte Header ist Location: test.php?param=4. Da Dein Skript sich wohl selbst aufruft macht das sowohl wget als auch jeder Browser nur begrenzt oft mit und meldet dann, die Zahl der Weiterleitungen sei zu groß.

    1. Hallo Willi,

      Klar: Wegen des offensichtlichen Syntaxfehlers.

      Wo denn?

      Bastian

      1. Klar: Wegen des offensichtlichen Syntaxfehlers.

        Wo denn?

        header(Location:"test.php?param=".$i."");
        

        Das ist natürlich nur für blinde Körner, die nach Hühnern suchen, auffindbar 😀

        header("Location: test.php?param=$i");
        

        Der Frage, was Du erreichen willst, schließe ich mich an.

        1. Der Frage, was Du erreichen willst, schließe ich mich an.

          Habe ich doch inzwischen ausführlich beschrieben.

          Bastian

            1. Habe ich doch inzwischen ausführlich beschrieben.

              Na und ich hatte schon beschrieben und gezeigt, warum und dass Du Dein Ansinnen so nicht erreichen kannst....

              Na, das war aber nicht der Fehler. Das Script ruft sich nicht selber auf.

              Aber php stört sich an etwas anderem: Fatal error: Cannot declare class PDF_Table_Header, because the name is already in use in c:\usw.

              Und an der Stelle bin ich dann auch fachlich ganz raus, weil ich nicht oo programmieren kann. Dummerweise ist das Script tatsächlich so programmiert, dass genau 1 Datei damit erzeugt wird. Und ich will jetzt nen ganzen Stapel damit erzeugen.

              Bastian

              1. Dann zippe die Dateien...

                https://www.php.net/manual/de/ziparchive.addfile.php

                Das Script ruft sich nicht selber auf.

                Das ist völlig egal: PHP merkt sich und gibt nur den LETZTEN Location-Header an den Webserver weiter.

                1. Dann zippe die Dateien...

                  https://www.php.net/manual/de/ziparchive.addfile.php

                  Mein Senderscript hat das Id-Array. Mein Empfängerscript macht folgendes:

                  ID empfangen. Verschiedene Plausibilitätsprüfungen bezogen auf den Inhakt der ID PDF generieren (oo)

                  <php?
                  $ID = $_GET['ID'];
                  
                  // das/dies/jenes (Plausibilitätsprüfungen)
                  
                  	require('./fpdf/mc_table.php');
                  
                  	class PDF_Table_Header extends PDF_MC_Table_WA
                      {
                          //Kopfzeile
                          function Header()
                          {
                             //
                          } 
                  
                  
                          //Fusszeile
                          function Footer()
                          {
                               //       
                          }
                      }
                  
                      $pdf = new PDF_Table_Header('P','mm',$seitenformat);
                      $pdf->AliasNbPages();
                      $pdf->AddPage();
                  
                  	// hier dann 1000 Berechnungen für die ID
                  
                  	// und anschließend Zeilen des Dokumentes
                      $pdf->Row(array('','','','','','','','',''),0,5);
                  
                  	// und wieder Berechnungen
                  	// und dann wieder Zeilen usw. usw.
                  
                  	//und zum Schluss
                      $pdf->Output($file,F);  // wird nur gespeichert
                  

                  Ist aber bisher nur für 1 ID gedacht.

                  Wie ich das umgehen kann? Wär für Tips dankbar.

                  Basti

                  1. 1. Fehler:

                    Fatal error: Cannot declare class PDF_MC_Table, because the name is already in use

                    Änderung:

                    require('./fpdf/mc_table.php'); zu require_once('./fpdf/mc_table.php');

                    2. Fehler:

                    Cannot declare class PDF_Table_Header, because the name is already in use

                  2. Hallo Bastian,

                    das Problem ist, dass eine Klasse nur einmal deklariert werden kann. Und mit jedem include würde sie neu deklariert.

                    Schnellste Lösung: Ziehe die Klasse (vom require von mc_table.php bis zum Ende der class Deklaration, also das } vor der new Zeile aus test.php) heraus und speichere diesen Teil in einer eigenen PHP Datei. Und diese bindest Du im test.php mit require_once ein.

                    Grundsätzlich solltest Du aber ein paar Blöcke bilden.

                    • Deklaration der Klasse
                    • Eine Funktion, die die Plausis durchführt
                    • Eine Funktion, die ein PDF generiert

                    Wenn die beiden Funktionen riesig sind, kann es für die Lesbarkeit besser sein, sie in kleinere Funktionen aufzuteilen. Wie einfach das ist, hängt davon ab, wie stark die Kohärenz in diesen Funktionen ist (d.h. wie sehr hängen die einzelnen Code-Abschnitte datenmäßig miteinander zusammen). Ist die Kohärenz hoch, muss man zu viele Daten als Parameter durch die Gegend schieben. Ist sie niedrig, ist das Ausgliedern von Teilfunktionen gut machbar. Das kannst Du nur selbst beurteilen.

                    Diese drei Blöcke kannst Du in einer PHP Includedatei hintereinander setzen, oder in drei getrennte Includes. Da es relativ eng zusammenhängt, würde ich vermutlich ein Include bauen. Nennen wir es mal "pdf_fabrik.php". Und dieses Include TUT SONST NICHTS. Das ist einer der PHP Styleguides (PSR-1: Side Effects). Entweder deklariert eine PHP Datei Dinge (Konstanten, Klassen, Funktionen) Oder sie führt sie aus. Aber nicht beides. Dein test.php tut beides und prompt beweist sich der Sinn von PSR-1.

                    Nach der Trennung würde test.php dann nur noch die pdf_fabrik inkludieren, die ID aus $_GET holen, die Plausi aufrufen und dann das PDF erzeugen.

                    In deinem Batch würdest Du die pdf_fabrik ebenfalls inkludieren. Ob Du dann Plausis ausführen musst, ist Dir überlassen. Vermutlich nicht. Und dann rufst Du in der Schleife fünf Mal die Funktion zum Erzeugen eines PDFs auf.

                    Rolf

                    --
                    sumpsi - posui - obstruxi
                    1. Hallo Rolf,

                      das Problem ist, dass eine Klasse nur einmal deklariert werden kann. Und mit jedem include würde sie neu deklariert.

                      Schnellste Lösung: Ziehe die Klasse (vom require von mc_table.php bis zum Ende der class Deklaration, also das } vor der new Zeile aus test.php) heraus und speichere diesen Teil in einer eigenen PHP Datei. Und diese bindest Du im test.php mit require_once ein.

                      Hört sich gut an. Aber in der Klasse ist ja auch ein Header- und ein Footerteil. Und dieser wird anhand der jeweiligen ID dann gebildet.

                      Wenn ich also diese Klasse mit require_once einbinde, wird doch der Header- und Footerteil nicht mehr neu generiert, oder?

                      Basti

                      1. Hallo Bastian,

                        wenn Du innerhalb der Methoden Header und Footer auf die Variable $ID zugreifst, machst Du was falsch. Greifst Du mit dem global-Statement darauf zu? Oder verwendest Du $_GET['ID']?

                        Wenn Du innerhalb der Header und Footer Methoden die ID brauchst, solltest Du deiner PDF_Table_Header Klasse eine neue Eigenschaft namens id verpassen. Um nicht auch noch einen Konstruktor schreiben zu müssen, kannst Du diese Eigenschaft einfach public machen.

                        class PDF_Table_Header extends PDF_MC_Table_WA
                        {
                        
                           public $id;
                        
                           public Header()
                           {
                              $this->Cell($x, $y, "Dokument $this->id");
                              // oder so:
                              $this->Cell($x, $y, "Dokument " . $this->id);
                           }
                        
                           public Footer()
                           {
                           }
                        }
                        
                        ...
                        
                            $pdf = new PDF_Table_Header('P','mm',$seitenformat);
                        
                            $pdf->id = $ID;
                        
                            $pdf->AliasNbPages();
                            $pdf->AddPage();
                        

                        Zur Erklärung: FPDF geht nur im einfachsten Fall so vor, dass Du das FPDF Objekt erzeugst und die PDF-Erzeugung dann komplett von außen steuerst. Für Dinge wie Seiten-Header und -Footer bietet es Dir die Möglichkeit, das FPDF Objekt zu erweitern. Das passiert mittels class ... extends. In deinem Fall erweiterst Du PDF_MC_Table, was sicherlich eine von FPDF abgeleitete Klasse ist. Woher auch immer diese Klasse kommt - im Internet finde ich dazu nur eines: Diesen Selfhtml Thread 😂.

                        Header und Footer sind sogenannte Abstrakte Methoden. Sie sind in FPDF zwar vorhanden, tun aber nichts. FPDF ruft sie auf, wenn es an der Zeit wäre, einen Header oder einen Footer zu erzeugen. Wenn Du diese Methoden in deiner abgeleiteten Klasse einbaust, dann überschreiben sie die Dummy-Methoden, die in FPDF enthalten sind, d.h. wenn FPDF als Basisklasse von PDF_Table_Header läuft, verwendet es deinen Header und Footer.

                        Genau wie Du Methoden (also Funktionen im Objekt) ergänzen kannst, kannst Du auch Eigenschaften (Variablen im Objekt) hinzufügen. Es gibt öffentliche und private Eigenschaften, deswegen muss man da innerhalb einer Klasse "public" oder "private" davorschreiben (ja okay, man MUSS nicht. Lässt man es weg, ist die Variable public. Ich schreib's trotzdem immer hin).

                        Du könntest auch noch eine Methode __construct hinzufügen, um die ID gleich beim new zu setzen, aber dafür müsste ich dann zuviel OOP erklären. Darum einfach eine public Eigenschaft, und ihr wird nach dem new Aufruf (der das Objekt erzeugt) die benötigte ID zugewiesen. Auf diese Weise kennt das Objekt nun die ID und ist nicht darauf angewiesen, auf eine globale Variable zuzugreifen.

                        Du verwendest diese Eigenschaft genau wie alle anderen FPDF-Eigenschaften oder -Methoden: mit einem $this-> davor.

                        Rolf

                        --
                        sumpsi - posui - obstruxi
                        1. Hallo Rolf,

                          wenn Du innerhalb der Methoden Header und Footer auf die Variable $ID zugreifst, machst Du was falsch. Greifst Du mit dem global-Statement darauf zu? Oder verwendest Du $_GET['ID']?

                          global. Und das nicht nur mit der $ID, sondern mit weiteren 24 Variablen. 😕 Wußte nicht, daß das falsch ist. Und bei einer weiteren Durchsicht sind 20/24 unnötigerweise als global deklariert, weil sie sich durch Datenbankabfragen erst ergeben.

                          Wenn Du innerhalb der Header und Footer Methoden die ID brauchst, solltest Du deiner PDF_Table_Header Klasse eine neue Eigenschaft namens id verpassen. Um nicht auch noch einen Konstruktor schreiben zu müssen, kannst Du diese Eigenschaft einfach public machen.

                          Ja, wenn denn nur die ID wäre. Aber wenn ich Dich richtig verstanden habe, könnte ich alle Variablen, die ich in der Klasse brauche, einfach auf "public" setzen? Und woher beklommt die Klasse den Inhalt? Einen Konstruktor anlegen und das Objekt dann mit Parametern erzeugen erscheint mir im Moment sogar noch etwas schlüssiger. Woher weiß die Klasse, was in $ID drin ist, wenn der Wert variiert und ich ihn nicht übergebe?

                          class PDF_Table_Header extends PDF_MC_Table_WA
                          {
                          
                             public $id;
                          
                             public Header()
                             {
                                $this->Cell($x, $y, "Dokument $this->id");
                                // oder so:
                                $this->Cell($x, $y, "Dokument " . $this->id);
                             }
                          
                             public Footer()
                             {
                             }
                          }
                          
                          ...
                          
                              $pdf = new PDF_Table_Header('P','mm',$seitenformat);
                          
                              $pdf->id = $ID;
                          
                              $pdf->AliasNbPages();
                              $pdf->AddPage();
                          

                          Zur Erklärung: FPDF geht nur im einfachsten Fall so vor, dass Du das FPDF Objekt erzeugst und die PDF-Erzeugung dann komplett von außen steuerst. Für Dinge wie Seiten-Header und -Footer bietet es Dir die Möglichkeit, das FPDF Objekt zu erweitern. Das passiert mittels class ... extends. In deinem Fall erweiterst Du PDF_MC_Table, was sicherlich eine von FPDF abgeleitete Klasse ist. Woher auch immer diese Klasse kommt - im Internet finde ich dazu nur eines: Diesen Selfhtml Thread 😂.

                          Ich habe dir irgendwann mal aus den Addons zu fpdf genommen. Und mir dann aus mehreren eines zusammen gebastelt. Ist aber gefühlte Ewigkeiten her, damals kannte ich mich besser damit aus.

                          Header und Footer sind sogenannte Abstrakte Methoden. Sie sind in FPDF zwar vorhanden, tun aber nichts. FPDF ruft sie auf, wenn es an der Zeit wäre, einen Header oder einen Footer zu erzeugen. Wenn Du diese Methoden in deiner abgeleiteten Klasse einbaust, dann überschreiben sie die Dummy-Methoden, die in FPDF enthalten sind, d.h. wenn FPDF als Basisklasse von PDF_Table_Header läuft, verwendet es deinen Header und Footer.

                          Sehr gute Erklärung. Da ich mehrere Scripte habe, die allesamt diese Klasse verwenden, könnte ich vielleicht wirklich die Klasse selber extrahieren und so immer über require_once einbinden. Ich hadere nur noch damit, ob lieber über public, was ich noch nicht verstanden habe oder über einen Konstruktor, den ich zu verstehen glaube. Vielleicht auch eine Mischung aus Beidem?

                          Du könntest auch noch eine Methode __construct hinzufügen, um die ID gleich beim new zu setzen, aber dafür müsste ich dann zuviel OOP erklären. Darum einfach eine public Eigenschaft, und ihr wird nach dem new Aufruf (der das Objekt erzeugt) die benötigte ID zugewiesen. Auf diese Weise kennt das Objekt nun die ID und ist nicht darauf angewiesen, auf eine globale Variable zuzugreifen.

                          Wenn Du mir nochmal erklären könntest, woher die public Variable ihren Inhalt nimmt?

                          Basti

                          1. Hallo Bastian,

                            bitte pass mit den Begrifflichkeiten auf. Was Du außerhalb der OOP "Variable" und "Funktion" nennst, wird in einer Klasse zu "Eigenschaft" und "Methode". Man nennt das anders, weil Eigenschaften und Methoden an ein Objekt gebunden sind, und Variablen nicht. Eine Variable in PHP kann sein:

                            • Superglobal (z.B. $_GET) - die Variable ist überall sichtbar
                            • Global - die Variable existiet so lange wie das Script läuft, ist aber innerhalb von Funktionen oder Methoden nur sichtbar, wenn Du das mit dem global Befehl anforderst
                            • Lokal - die Variable existiert im Ausführungskontext einer Funktion oder Methode und ist auch nur dort sichtbar. Endet die Funktion/Methode, verschwindet die Variable.

                            Eigenschaften und Methoden kannst Du nur ansprechen, wenn Du das Objekt davor schreibst. Entweder in Form der Variablen, in der Du das Objekt gespeichert hast ($pdf->Cell(...)) oder, wenn Du innerhalb einer Methode des gleichen Objekts bist, mit $this. In $this steht immer das Objekt, in dessen Kontext Du gerade unterwegs bist (oder null, wenn dein Code nicht Teil einer Methode ist)

                            Das ist in einem Forenbeitrag ziemlich aufwändig zu beschreiben. Eigentlich erklärt das PHP Handbuch eine ganze Menge dazu. Man braucht nur etwas Geduld beim Lesen 😉.

                            Eine Objekteigenschaft bekommt ihren Inhalt durch eine Wertzuweisung.

                            Ohne Konstruktor:

                            class PDF_Table_Header extends PDF_MC_Table_WA 
                            {
                               public $id;       // Eigenschaften!
                               public $dings;
                               public $bums;
                            
                               function Header()
                               {
                                  // $blub ist eine Variable, die lokal in der Header-Methode gilt
                                  $blub = $this->dings . $this->bums;
                            
                                  // Cell ist eine Methode (die PDF_Table_Header von FPDF erbt)
                                  $this->Cell(12,34, $this->id, $blub);
                               }
                            }
                            
                            // Objekt erzeugen. PHP verwendet den Konstruktor, den 
                            // PDF_Table_Header von PDF_MC_Table_WA (oder deren Superklasse)
                            // erbt.
                            $pdf = new PDF_Table_Header('P','mm',$seitenformat);
                            
                            // Nach dem new setzt Du die eigenen Eigenschaften im Objekt
                            $pdf->id = 42;
                            $pdf->dings = "Hallo";
                            $pdf->bums = "Welt";
                            // Ab jetzt kann die Header- und Footer-Methode darauf zugreifen.
                            
                            

                            Mit Konstruktor - ich weiß nicht genau, was das für Parameter sind, denen Du "P" und "mm" übergibst, darum hab ich sie einfach mal $p und $mm genannt. Da Du jetzt deinen eigenen Konstruktor hast, musst Du den Konstruktor der Superklasse selbst aufrufen, damit "P", "mm" und $seitenformat dorthin gelangen.

                            class PDF_Table_Header extends PDF_MC_Table_WA 
                            {
                               public $id;
                               public $dings;
                               public $bums;
                            
                               function __construct($p, $mm, $seitenformat, $id, $dings, $bums)
                               {
                                  // Konstruktor der Elternklasse aufrufen, weil Du ihn jetzt nicht
                                  // mehr erbst, sondern selbst einen schreibst.
                            
                                  parent::__construct($p, $mm, $seitenformat);
                            
                                  // jetzt die eigenen Eigenschaften initialisieren. Wir sind im
                                  // Konstruktor, deshalb mit $this zugreifen
                            
                                  $this->id = $id;
                                  $this->dings = $dings;
                                  $this->bums = $bums;
                               }
                            
                               function Header()
                               {
                                  do_something($this->id, $this->dings . $this->bums);
                               }
                            }
                            
                            $pdf = new Foo('P','mm',$seitenformat, 42, "Hallo", "Welt");
                            //           +--------------------+  +-----------------+
                            //           Bisherige Parameter     Werte für Deine
                            //                                   Eigenschaften
                            

                            Wenn Du 17 Werte setzen musst, sind das eine Menge Parameter. Da kann es dann lesbarer werden, sie nicht über den Konstruktor zu setzen.

                            Rolf

                            --
                            sumpsi - posui - obstruxi
                            1. Hallo Rolf,

                              bitte pass mit den Begrifflichkeiten auf. Was Du außerhalb der OOP "Variable" und "Funktion" nennst, wird in einer Klasse zu "Eigenschaft" und "Methode". Man nennt das anders, weil Eigenschaften und Methoden an ein Objekt gebunden sind, und Variablen nicht.

                              Mach ich ab jetzt. :)

                              Das ist in einem Forenbeitrag ziemlich aufwändig zu beschreiben. Eigentlich erklärt das PHP Handbuch eine ganze Menge dazu. Man braucht nur etwas Geduld beim Lesen 😉.

                              War ich eben schon drin und habe eine Menge gelesen.

                              Eine Objekteigenschaft bekommt ihren Inhalt durch eine Wertzuweisung.

                              Das fehlte mir. Ist ja dann eigentlich sehr einfach. Darf ich auch in der Klasse Eigenschaften setzen, denen ich dann später keinen Wert zuweise? Das würde die Klasse für mich viel nutzbarer machen.

                              Und der Unterscheid zu Getter und Setter? Ist nur ein Sicherheitsfeature, damit ich selber die Zuweisung innerhalb der Klasse kontrollieren kann?

                              Mit Konstruktor - ich weiß nicht genau, was das für Parameter sind, denen Du "P" und "mm" übergibst, darum hab ich sie einfach mal $p und $mm genannt. Da Du jetzt deinen eigenen Konstruktor hast, musst Du den Konstruktor der Superklasse selbst aufrufen, damit "P", "mm" und $seitenformat dorthin gelangen.

                              Mit diesen werten wird in der fpdf-Klasse selber später gearbeitet. Allerdings weiß ich nicht genau, wie fpdf das macht, denn ich habe in der Klasse keinen Konstruktor gefunden. Wie also verarbeitet fpdf diese Parameter?

                              Wenn Du 17 Werte setzen musst, sind das eine Menge Parameter. Da kann es dann lesbarer werden, sie nicht über den Konstruktor zu setzen.

                              Ich glaube zwar, dass "bereinigt" weniger als 6-7 Eigenschaften an die Klasse gegeben werden müssen, aber mir ist es auch lieber, diese Eigenschaften separat zu setzen. Das macht es für mich flexibler.

                              ich versuch das nun mal. Drück mal die Daumen, dass ich danach noch PDFfe erhalte. 😉

                              Bastian

                              1. Hallo Bastian,

                                Allerdings weiß ich nicht genau, wie fpdf das macht, denn ich habe in der Klasse keinen Konstruktor gefunden.

                                PDF_MC_Table_WA muss auch keinen haben, wenn diese Klasse ihrerseits eine Subklasse von FPDF ist. FPDF hat auf jeden Fall einen, guckst Du hier - ugh, ein Frameset? Hier ist die Haupt-Dokuseite

                                Da steht auch, was die Parameter P und mm bedeuten 😀: Orientierung (P=Portrait) und Einheit (mm=Millimeter).

                                Und der Unterscheid zu Getter und Setter?

                                Die gibt's in PHP als Sprachelement nicht. Rein konzeptionell natürlich schon, analog zur Sprache Java kannst Du Methoden namens get_id und set_id schreiben, die diesen Job erfüllen.

                                <Exkurs> In Sprachen wie JavaScript oder C# ist das anders, die haben eine spezielle Syntax für Getter und Setter und unterscheiden dann auch auf Sprachebene zwischen Property (das Pärchen aus Getter und Setter) und Field (das, was wir hier bislang als Eigenschaft bezeichnet haben). Damit sind wir aber nun schon ziemlich tief in den OO Konzepten.</Exkurs>

                                Ob es sinnvoll ist, getter und setter zu verwenden, kann unterschiedliche Gründe haben. Einer ist dogmatisch: Objekte kapseln ihre Daten und erlauben den Zugriff darauf NUR über Methoden. Diese Dogma wurzelt in einer noch älteren Sicht auf Objekte - ein Objekt empfängt und sendet Botschaften. Wenn Du den Wert der Eigenschaft "id" wissen willst, musst Du die Botschaft "sag mir Deine ID" schicken und bekommst als Antwort die Botschaft "Meine ID ist 47". Rein formal kann man das bauen, rein praktisch ist das strikt inkompatibel zum gewohnten prozeduralen Konzept von Funktionsaufruf und Rückgabewert. Deswegen implementieren die meisten OOP Sprachen das Botschaftenkonzept als Methoden, die analog zu Funktionen aufgerufen werden. Eine strikte Implementierung durch Botschaften findet man bspw. in der Sprache Erlang, wodurch sich Erlang-Programme superleicht auf viele Prozessorkerne verteilen lassen. but I digress...

                                Der direkte Zugriff auf Eigenschaften widerspricht der OO-Idee nach wie vor, deswegen ist es in Java einfach üblich, Getter und Setter zu schreiben. Zwingend nötig ist es nicht, auch Java kennt public fields. Wie gesagt: Dogma.

                                Es gibt aber auch praktische Gründe für getter und setter.

                                • Ein Setter erlaubt es, Plausibilitätsprüfungen durchzuführen. Eine direkte Zuweisung an eine Eigenschaft erlaubt das nicht. Hat also Vorteile. Wenn Du Plausis brauchst, die mehrere Eigenschaften im Zusammenhang validieren, dann habe ich auch schon man an Stelle eines Setters eine Initialize-Methode programmiert, die mehrere Parameter bekommt und die übergreifende Validierung übernommen hat.

                                • Ein Getter kann eine virtuelle Eigenschaft abbilden, also eine Eigenschaft, die das Objekt eigentlich gar nicht hat. Beispielsweise ein Objekt "Kreis" mit den Eigenschaften Radius und Fläche. Der Radius ist eine echte Eigenschaft, und die Fläche kann man bei Bedarf per $$A=\pi r^2$$ berechnen. Wenn Du einen Zoo von Form-Objekten hast, und jedes hat einen Getter "get_Area", dann kann ein Kreis oder ein Rechteck die Fläche beim Zugriff bestimmen, und ein durch Bezierkurven eingeschlossenes Dings muss die Fläche zusammenintegrieren - das tut es nur einmal und speichert das Ergebnis dann ab.

                                Auf diese Weise können Getter und Setter die Details abschirmen, wie bestimmte Dinge im Objekt implementiert sind. Und Du kannst die Implementierung ändern, ohne dass es jemand merkt. Ein weiterer Vorteil ist, dass Getter und Setter Methoden sind, d.h. man kann sie als Teil eines Interface deklarieren. Mit Eigenschaften geht das nicht. Wenn Du ein Objekt abstrakt über ein Interface verwenden willst, brauchst Du getter und setter. Aber das ist jetzt wieder sehr tief gehend. Für deinen Fall reichen die einfachen Eigenschaften vermutlich aus.

                                Darf ich auch in der Klasse Eigenschaften setzen, denen ich dann später keinen Wert zuweise?

                                Darfst Du - aber dann darfst Du Dich auch nicht über den RRRUMMS wundern, der ertönt, wenn Du diese Eigenschaft versehentlich verwendest 😉. Ohne Zuweisung enthält eine Eigenschaft den Wert NULL.

                                Rolf

                                --
                                sumpsi - posui - obstruxi
                                1. Hallo Rolf,

                                  PDF_MC_Table_WA muss auch keinen haben, wenn diese Klasse ihrerseits eine Subklasse von FPDF ist. FPDF hat auf jeden Fall einen, guckst Du hier - ugh, ein Frameset? Hier ist die Haupt-Dokuseite

                                  Da steht auch, was die Parameter P und mm bedeuten 😀: Orientierung (P=Portrait) und Einheit (mm=Millimeter).

                                  Ich habe in der fpdf-Klasse selber gesucht. Und dort empfängt einfach eine Methode die Parameter, aber kein Konstruktor. Ich erkenne zumindest keinen.

                                  function FPDF($orientation='P',$unit='mm',$format='A4')
                                  {
                                  

                                  Danke für die ausführliche Getter/Setter Erklärung.

                                  Ich habe nun in der Klasse meine Eigenschaften gesetzt und in den Methoden durch $this->eigenschaft ersetzt. Was mache ich mit den

                                  • include(datei.php)
                                  • funktionen(param)

                                  die dort vorhanden sind?

                                  Darf ich die einfach weiter wie bisher nutzen oder gibts da nun Regeln zu beachten? Und wenn ich sie nutzen darf, welcher relative Pfad ist dann entscheidend? Der von der Klasse ausgehende Pfad oder der vom aufrufenden Script ausgehende Pfad?

                                  Die selber Frage habe ich übrigens auch für mein require_once(), das ja vom Hauptscript mit gewandert ist in die extrahierte Klasse.

                                  Und nochwas, darf ich Eigenschaften jederzeit überschreiben?

                                  $pdf = new(klassenaufruf);
                                  $pdf->name = "Heinz";
                                  ...
                                  ...
                                  ...
                                  $pdf->name = "doch lieber Hans";
                                  

                                  Bastian

                                  1. Und nochwas, darf ich Eigenschaften jederzeit überschreiben?

                                    $pdf = new(klassenaufruf);
                                    $pdf->name = "Heinz";
                                    ...
                                    ...
                                    ...
                                    $pdf->name = "doch lieber Hans";
                                    

                                    Bastian

                                    Das kommt darauf an, wie die Klasse definiert ist

                                    Steht da:

                                    class foo {
                                        protected name="";
                                        #…
                                    }
                                    

                                    Dann kannst Du das nicht. Es sei denn Du hast einen setter, bzw. getter:

                                    <?php
                                    # file: foo.class.php
                                    
                                    class foo {
                                    
                                        protected $name;
                                        
                                        function __construct( $s = "Foo" ) {
                                            $this -> setName( $s );
                                        }
                                        
                                        function setName( $s ) {
                                             $s = trim( $s );
                                             if ( $s ) {
                                                 $this->name = trim( $s );
                                                 return true;
                                             } else {
                                                 return false;
                                             }
                                        }
                                    
                                        function getName() {
                                             return $this -> name;
                                        }
                                    }
                                    

                                    Dann kannst Du das wie folgt machen:

                                    <?php
                                    require_once( 'foo.class.php' )
                                    $f = new foo ('Bastian');
                                    echo $f -> getName() . PHP_EOL;
                                    $f -> setName( 'Hans' );
                                    echo $f -> getName() . PHP_EOL;
                                    $f -> setName( 'Willi' );
                                    echo $f -> getName() . PHP_EOL;
                                    # Bastian
                                    # Hans
                                    # Willi
                                    
                                    

                                    Vorteil: Du kannst die übergebenen Werte prüfen ( if() ) und ggf. verändern ( trim() ), ggf. sogar eine Authorisierung prüfen.

                                    Hast Du aber:

                                    class foo {
                                        public $name;
                                    }
                                    

                                    Dann kannst Du das „jederzeit“ - ohne eine Prüfung zu erzwingen.

                                    $f = new foo;
                                    $f -> name = 'Bastian';
                                    echo $f -> name . PHP_EOL;
                                    $f -> name = 'Hans';
                                    echo $f -> name . PHP_EOL;
                                    $f -> name = 'Willi';
                                    echo $f -> name . PHP_EOL;
                                    # Bastian
                                    # Hans
                                    # Willi
                                    

                                    Die Variante 2 sieht einfacher aus, öffnet aber „jeder Menge Mist“ Tür und Tor. Oft will man genau das gerade nicht haben. Das wirst Du schon noch merken...

                                    1. Hallo Willi,

                                      Die Variante 2 sieht einfacher aus, öffnet aber „jeder Menge Mist“ Tür und Tor. Oft will man genau das gerade nicht haben. Das wirst Du schon noch merken...

                                      Haha, ich glaub auch. Erstmal muss ich überhaupt mal schaffen, ein PDF zu erzeugen, bevor ich an den Feinschliff komme. Daher auch einige allgemiene Fragen dazu.

                                      Bisher erzeuge ich mir einen Datenbankfehler, dessen Ursprung mir nicht bekannt ist. Ich logge eine Query als ursprung, die für sich gesehen aber keinen Fehler erzeugen dürfte.

                                      Also ist entweder die falsche Query geloggt oder aber die Datenbankverbindung steht nicht sattelfest. Beides würde einen Fehler mit diesem Log erzeugen.

                                      Bastian

                                      1. Also ist entweder die falsche Query geloggt oder aber die Datenbankverbindung steht nicht sattelfest. Beides würde einen Fehler mit diesem Log erzeugen.

                                        Nö. Es sei denn Du hast schlecht gestrickt und loggst nur „Ein Fehler trat auf."

                                        Aber selbst dann hast Du den Name des Skriptes und eine Zeilennummer im Log.

                                    2. @@Raketenwilli

                                          function setName( $s ) {
                                               $s = trim( $s );
                                               if ( $s ) {
                                                   $this->name = trim( $s );
                                      

                                      Lieber einmal zu viel getrimmt als einmal zu wenig?

                                      🖖 Живіть довго і процвітайте

                                      --
                                      When the power of love overcomes the love of power the world will know peace.
                                      — Jimi Hendrix
                                      1. Lieber einmal zu viel getrimmt als einmal zu wenig?

                                        Jepp. Schon vom Ergebnis her... Aber Du hast Recht, da hatte ich eine nachträglicher Verbesserung nicht vollständig notiert, genauer das hyperliquid gewordene trim() nicht gelöscht.

                                      2. Moin Gunnar,

                                            function setName( $s ) {
                                                 $s = trim( $s );
                                                 if ( $s ) {
                                                     $this->name = trim( $s );
                                        

                                        Lieber einmal zu viel getrimmt als einmal zu wenig?

                                        wenn die Klasse einen Pfad speichert, dann wäre setPath wohl der Trimm-Dich-Pfad.

                                        Sportliche Grüße
                                        Robert

                                    3. Moin,

                                      Und nochwas, darf ich Eigenschaften jederzeit überschreiben?

                                      Das kommt darauf an, wie die Klasse definiert ist

                                      Steht da:

                                      class foo {
                                          protected name="";
                                          #…
                                      }
                                      

                                      Dann kannst Du das nicht.

                                      Bzw. genauer: nur wenn dort folgendes steht:

                                      class foo {
                                          public $name = '';    // Objekt-Eigenschaft
                                          static $name = '';    // Klassen-Eigenschaft
                                      }
                                      

                                      Viele Grüße
                                      Robert

                                  2. Hallo Bastian,

                                    function FPDF($orientation='P',$unit='mm',$format='A4')

                                    Oh. Der letzte FPDF-Stand, in dem ich das finde, ist die Version 1.7, d.h. deine FPDF-Version ist mindestens 11 Jahre alt. Grusel 😉

                                    Welche Versionen von FPDF und PHP verwendest Du?

                                    Den Konstruktor wie die Klasse zu benennen ist die alte Schreibweise aus der Zeit von PHP 4, die sich an C++ orientiert. Mit PHP 5 wurde die Schreibweise mit __constructor eingeführt - warum auch immer. Offenbar waren die Sprachentwickler der Meinung, dass Konstruktoren etwas magisches sind.

                                    Handbuch - Konstruktoren alten Stils

                                    Verwende in deinem Code immer __construct.

                                    Wie Du mit Includes und Funktionen umgehst, kann ich Dir nicht sagen. Das hängt zu sehr von den Details ab.

                                    Wenn Du im test.php außer der Klasse noch Funktionen hast, kommt es darauf an, ob diese Funktionen per GLOBAL auf globale Dinge zugreifen, oder ob sie ihre Daten nur über Parameter erhalten. Solange sie isoliert sind (also auf nichts globales zugreifen), kannst Du Dir aussuchen, ob Du sie als Funktion stehen lässt oder sie als private Methode in die Klasse ziehst. Als Methode musst Du sie dann mit $this->MeineFunktion() aufrufen.

                                    Wenn die Funktionen an globale Dinge herangehen, musst Du sie ggf. auch noch umschreiben, damit sie zum Objekt passen. Diese Codeanalyse kann ich Dir ohne Kenntnis deines vollständigen Codes nicht abnehmen.

                                    Rolf

                                    --
                                    sumpsi - posui - obstruxi
                                    1. Hallo Bastian,

                                      function FPDF($orientation='P',$unit='mm',$format='A4')

                                      Oh. Der letzte FPDF-Stand, in dem ich das finde, ist die Version 1.7, d.h. deine FPDF-Version ist mindestens 11 Jahre alt. Grusel 😉

                                      Neuere gibt es hier:

                                      http://www.fpdf.org/en/download.php

                                      Eine Dokumentation für diese Version findet sich im ausgepacktem zip-File dann im Ordner doc.

                                      Im Hinblick darauf, dass im Changelog bei Version v1.82 (2019-12-07) „Removed a deprecation notice under PHP 7.4.“ steht würde ich auch nicht erwarten, dass ältere Versionen von FPDF unter aktuellen PHP-Versionen überhaupt lauffähig sind.

                                      1. Im Hinblick darauf, dass im Changelog bei Version v1.82 (2019-12-07) „Removed a deprecation notice under PHP 7.4.“ steht würde ich auch nicht erwarten, dass ältere Versionen von FPDF unter aktuellen PHP-Versionen überhaupt lauffähig sind.

                                        Doch, die laufen. Jedenfalls in dem Bereich, den ich selber nutze, kann ich das bestätigen. Sollte ich jemals umsteigen müssen, wird das ziemlich doof für mich werden, weil dann alle Änderungen und workarounds nicht mehr laufen, die ich extra mal vor langer Zeit erarbeitet habe.

                                        Basti

                                        1. Hallo Bastian,

                                          PHP Roadmap

                                          Die letzte 7er Version ist im Begriff, ihr End Of Life zu erreichen.

                                          Unter PHP 8 läuft deine Version von FPDF nicht mehr. Ob es reicht, die FPDF-Methode in __construct umzubenennen, weiß ich nicht. Probiere es mal aus.

                                          An aktuellen Versionen von Libraries dranzubleiben kann mühsam sein. Aber man kommt nicht drum herum. Und zumindest bei PHP ist es auch so, dass die Sprache nicht so stabil ist, dass 12 Jahre alte Libraries auf allen Versionen von PHP seit dieser Zeit laufen.

                                          Rolf

                                          --
                                          sumpsi - posui - obstruxi
                                        2. Sollte ich jemals umsteigen müssen, wird das ziemlich doof für mich werden, weil dann alle Änderungen und workarounds nicht mehr laufen, die ich extra mal vor langer Zeit erarbeitet habe.

                                          Das muss aber sein.

                                          Wenn Du es verweigerst auf eine neue PHP-Version umzusteigen, kann es sein (und wird so kommen), dass irgendwelche andere Software (nehmen wir Wordpress) nicht mehr läuft. Jetzt fängst Du mit obigem Ansinnen (Aufwand vermeiden) damit an, diesen anderen Programmen auch keine Updates mehr zu gönnen - also bleiben die Sicherheitslücken.

                                          Naja. So wird man mein Lieblingskunde...

                                          1. Das muss aber sein.

                                            Ich weiß. Bin derzeit auf php 7.4, mit einigen Domains auch schon auf 8.0
                                            Leider hatte ich fpdf vergessen.
                                            Das läuft derzeit auch "nur" auf php 7.4.
                                            Wie lange läuft 7.4 denn noch offiziell?

                                            1. Wie lange läuft 7.4 denn noch offiziell?

                                              https://www.php.net/supported-versions.php

                                              1. Wie lange läuft 7.4 denn noch offiziell?

                                                https://www.php.net/supported-versions.php

                                                Danke.

                                    2. Hallo Bastian,

                                      Oh. Der letzte FPDF-Stand, in dem ich das finde, ist die Version 1.7, d.h. deine FPDF-Version ist mindestens 11 Jahre alt. Grusel 😉

                                      Welche Versionen von FPDF und PHP verwendest Du?

                                      Ich habe noch eine Version davor. Ich weiß nicht genau, welche es ist.

                                      Verwende in deinem Code immer __construct.

                                      Ok, genau danach hatte ich gesucht und es nicht gefunden. Das erklärt es.

                                      Aber alles in allem ist es mir gerade zum ersten mal gelungen, ein PDF mit extrahierter Klasse zu erzeugen. 😊 Hätte ich alleine nicht geschafft. Danke.

                                      Wenn ich nun später die PDFfe als Stapel drucken möchte, wird ja die Klasse mit require_once nur einmal eingelesen. Werden dann trotzdem alle Eigenschaften immer wieder neu gesetzt? Das war ja so ungefähr das Ziel der ganzen Aktion.

                                      Basti

                                      1. Wenn ich nun später die PDFfe als Stapel drucken möchte, wird ja die Klasse mit require_once nur einmal eingelesen. Werden dann trotzdem alle Eigenschaften immer wieder neu gesetzt? Das war ja so ungefähr das Ziel der ganzen Aktion.

                                        Eine Klasse „trabant“ wäre etwas wie eine Konstruktionszeichnung. Eine Klasse „trabant4takt“ wäre eine davon abgeleitete Konstruktionszeichnung.

                                        <?php
                                        class trabant {
                                            protected $habitus = 'laut und stinkt';
                                            protected $color   = '';
                                            function __construct( $color = 'schlüpferblau' ) {
                                        		$this -> color = $color;
                                        	}
                                        }
                                        
                                        class trabant4takt extends trabant {
                                        	function __construct ( $color = 'schlüpferblau' ) {
                                                $this -> habitus = 'stinkt und ist eng';
                                                $this ->  color = $color;
                                            }
                                        }
                                        

                                        Gemäß diesen wurden dann in Zwickau konkrete Trabbis gebaut:

                                        $trabbis[] = new trabant();
                                        $trabbis[] = new trabant( 'Papyrusweiß' );
                                        $trabbis[] = new trabant( 'Zonengrau' );
                                        $trabbis[] = new trabant4takt( 'Froschgrün' );
                                        
                                        print_r ( $trabbis );
                                        

                                        Ergebnis:

                                        Array
                                        (
                                            [0] => trabant Object
                                                (
                                                    [habitus:protected] => laut und stinkt
                                                    [color:protected] => schlüpferblau
                                                )
                                        
                                            [1] => trabant Object
                                                (
                                                    [habitus:protected] => laut und stinkt
                                                    [color:protected] => Papyrusweiß
                                                )
                                        
                                            [2] => trabant Object
                                                (
                                                    [habitus:protected] => laut und stinkt
                                                    [color:protected] => Zonengrau
                                                )
                                        
                                            [3] => trabant4takt Object
                                                (
                                                    [habitus:protected] => stinkt und ist eng
                                                    [color:protected] => Froschgrün
                                                )
                                        
                                        )
                                        
                                        
                                        1. Wenn ich nun später die PDFfe als Stapel drucken möchte, wird ja die Klasse mit require_once nur einmal eingelesen. Werden dann trotzdem alle Eigenschaften immer wieder neu gesetzt? Das war ja so ungefähr das Ziel der ganzen Aktion.

                                          Eine Klasse „trabant“ wäre etwas wie eine Konstruktionszeichnung. Eine Klasse „trabant4takt“ wäre eine davon abgeleitete Konstruktionszeichnung.

                                          Achja. Dann sollte es gehen.

                                          Und ja, tut es auch, fast.

                                          Mir ist eben die erste Stapelverarbeitung gelungen. Danke Euch und vor allem an RolfB und Willi für die Hilfe bis hierher.😍

                                          Aber ich musste ein paar Zeilen Code dafür aus dem Gesamtcode nehmen. Diese Codezeilen stammen übrigens von Dir, Willi. Damals noch als Wissenschaftler unterwegs und ich als Fragesteller Rabeneik.

                                          Ich habe die seinerzeit praktisch 1:1 nutzen können.

                                          Jedenfalls kommt das Script an dieser Stelle nicht ab dem 2. Durchlauf der Stapelverarbeitung vorbei.

                                          Kann sich das jemand erklären?
                                          Ich muss beide Funktionen und den Funktionsaufruf deaktivieren.
                                          Nur den Funktionsaufruf zu deaktivieren reicht nicht aus.

                                              function myCompare($a,$b,$invers = false)
                                              {
                                                  if($invers) {
                                                      $c = $a;
                                                      $a = $b;
                                                      $b = $c;
                                                      unset($c);
                                                  }
                                                  if(is_string($a) and is_string($b)) {
                                                      return strcmp($a,$b);
                                                  } elseif(is_numeric($a) and is_numeric($b)) {
                                                      if($a == $b)
                                                          return 0;
                                                      if($a < $b)
                                                          return -1;
                                                      if($a > $b)
                                                          return 1;
                                                  }
                                                  trigger_error('Nicht vorgesehener Datentyp in Funktion myCompare. Erlaubt sind string und numeric',E_USER_ERROR);
                                              }
                                          
                                          
                                              function compare_Datum_UID_Prio_Prio2($a,$b)
                                              {
                                                  $invers['Datum'] = false;
                                                  $invers['UID'] = false;
                                                  $invers['Prio'] = false;
                                                  $invers['Prio2'] = false;
                                                  foreach(['Datum','UID','Prio','Prio2'] as $itemProp) {
                                                      $r = myCompare($a[$itemProp],$b[$itemProp],$invers[$itemProp]);
                                                      if(0 != $r) {
                                                          return $r;
                                                      }
                                                  }
                                              }
                                          
                                              usort($list,'compare_Datum_UID_Prio_Prio2');
                                          
                                          1. Hallo,

                                            Kann sich das jemand erklären?

                                            Heißt das, du versuchst in jedem Schleifendurchgang, die Funktion neu zu definieren? Warum?

                                            Betreib bitte ordentliches Debugging, da sollten solche Sachen mehr oder weniger eindeutig angemeckert werden…

                                            Gruß
                                            Kalk

                                            1. Hallo,

                                              Heißt das, du versuchst in jedem Schleifendurchgang, die Funktion neu zu definieren? Warum?

                                              Betreib bitte ordentliches Debugging, da sollten solche Sachen mehr oder weniger eindeutig angemeckert werden…

                                              Hab ich nicht gefunden, hätte das nicht einen fatal error produzieren sollen? Danke für den Hinweis.

                                              Bastian

                                              1. Hallo Bastian,

                                                ja, das sollte einen fatal error produzieren. In dem Moment, wo der zweite Durchgang läuft.

                                                Bist Du sicher, dass Du einen solchen zu sehen bekommen würdest?

                                                Hast Du das error_reporting ganz aufgedreht?

                                                Rolf

                                                --
                                                sumpsi - posui - obstruxi
                                                1. Hallo Bastian,

                                                  ja, das sollte einen fatal error produzieren. In dem Moment, wo der zweite Durchgang läuft.

                                                  Bist Du sicher, dass Du einen solchen zu sehen bekommen würdest?

                                                  Hast Du das error_reporting ganz aufgedreht?

                                                  Ja, error_reporting stand auf E_ALL und ich habe im Text nach "fatal" gesucht.

                                                  Ok, jetzt habe ich die beiden Funktionen ausgegliedert und nun läufts auch inklusiv dem Funktionsaufruf.

                                                  Habe eben mal knapp 200 PDF auf einen Rutsch erzeugt und bin beeindruckt.

                                                  Danke an Eure Hilfe!

                                                  Kennt jemand ein Tool, mit dem man ordnerweise PDFs vergleichen kann?

                                                  Auf den ersten Blick sehen die Stapel-PDF mit den ursprünglich erzeugten identisch aus, aber das wäre nochmal ein schöner DSchritt zum Schluss, mal 2 Ordner mit PDFS zu vergleichen.

                                                  Bastian

                                                  1. Kennt jemand ein Tool, mit dem man ordnerweise PDFs vergleichen kann?

                                                    Die Shell.

                                                    #! /bin/bash
                                                    ## finde.sh
                                                    dir1="${TMPDIR}eins"
                                                    #dir2="${TMPDIR}zwei"
                                                    
                                                    cd "$dir1"
                                                    find -maxdepth 1 -name '*.php' -exec /pfad/zu/teste.sh "{}" \;
                                                    cd "${OLDPWD}"
                                                    
                                                    #!/bin/bash
                                                    ## teste.sh
                                                    echo "Parameter $1";
                                                    dir1="${TMPDIR}eins"
                                                    dir2="${TMPDIR}zwei"
                                                    
                                                    f1="${dir1}/$1";
                                                    f2="${dir2}/$1";
                                                    
                                                    s1=$(sha1sum < "${f1}")
                                                    s2=$(sha1sum < "${f2}")
                                                    
                                                    if [ "$s1" = "$s2" ]; then 
                                                        echo "${f1} und ${f2} sind mit sehr hoher Wahrscheinlichkeit identisch."
                                                    else 
                                                        echo "${f1} und ${f2} sind verschieden."
                                                    fi
                                                    

                                                    Du musst natürlich die Pfade anpassen, weiter was wo genau gesucht wird und wie bzw. was „verglichen“ wird. Für letzteres hab ich SHA1 genommen, für solche Vergleiche ist das wohl hinreichend.

                                                    1. Du musst natürlich die Pfade anpassen, weiter was wo genau gesucht wird und wie bzw. was „verglichen“ wird. Für letzteres hab ich SHA1 genommen, für solche Vergleiche ist das wohl hinreichend.

                                                      Denke ich auch, danke. Bastian

                                          2. Hallo Bastian,

                                            du includest das test.php immer noch?

                                            In dem Fall würde der zweite Include versuchen, die Funktionen zu redefinieren. Und das geht nicht.

                                            Deswegen wies ich auf die PSR-1 Regel hin: Eine PHP Datei soll entweder Dinge definieren, ODER definierte Dinge ausführen.

                                            Mach ein Include, das nur definiert. Klassen, Funktionen, wasauchimmer.

                                            Und da, wo ausgeführt werden soll, inkludierst Du das. Wenn die Gefahr eines Mehrfach-Include besteht, gerne auch mit _once hintendran.

                                            Danach erzeugst Du Objekte und rufst Methoden und Funktionen nach Herzenslaune aus. Das ist kein Problem. Aber in einer Schleife Funktionen zu definieren, das geht schief.

                                            Rolf

                                            --
                                            sumpsi - posui - obstruxi
                                        2. Hallo,

                                          mein Script ist also nun so aufgebaut:

                                          ...
                                          require_once("./pdffabrik.php");
                                              $pdf = new PDF('P','mm',$seitenformat);
                                              // Eigenschaften setzen
                                              $pdf->ID = $ID;
                                          ...
                                          
                                          if ($test == "test") {
                                          echo $test;
                                          }
                                          

                                          und pdffabrik.php so:

                                              class PDF_Table_Header extends PDF_MC_Table
                                              {
                                                  // Eigenschaften
                                                  public $ID;
                                          
                                                  //Kopfzeile
                                                  function Header()
                                                  {
                                                      $test = "test";
                                                  } 
                                          
                                          
                                                  //Fusszeile
                                                  function Footer()
                                                  {
                                                    //  
                                                  }
                                              }
                                          

                                          Meine Frage ist, wie ich im Restscript auf die $test-Variable aus der header-Methode der Klasse zugreifen kann?
                                          Habe es mal mit global versucht, das hat aber nicht funktioniert.

                                          Bastian

                                          1. Hallo Bastian,

                                            muss aber funzen.

                                             //Kopfzeile
                                                    function Header()
                                                    {
                                                        global $test;
                                                        $test = "test";
                                                    } 
                                            

                                            Ich frag mich nur: Wenn Du da $pdf = new PDF stehen hast, statt PDF_Table_Header, wird dann überhaupt deine Header-Methode aufgerufen?

                                            Ich fände es aber sinnvoller, an Stelle der $test Variable eine Eigenschaft $test am Objekt anzulegen.

                                            class PDF_Table_Header extends PDF_MC_Table
                                            {
                                                // Eigenschaften
                                                public $ID;
                                                public $test;
                                            
                                                //Kopfzeile
                                                function Header()
                                                {
                                                    $this->test = "test";
                                                } 
                                            
                                                //Fusszeile
                                                function Footer()
                                                {
                                                    //  
                                                }
                                            }
                                            
                                            $x = new PDF_Table_Header(...);
                                            ...
                                            if ($x->test == 'test')
                                            {
                                                echo "Test successful";
                                            }
                                            

                                            Rolf

                                            --
                                            sumpsi - posui - obstruxi
                                            1. Grüß dich, Rolf,

                                              Ich frag mich nur: Wenn Du da $pdf = new PDF stehen hast, statt PDF_Table_Header, wird dann überhaupt deine Header-Methode aufgerufen?

                                              Copy+paste-Fehler.

                                              Ich fände es aber sinnvoller, an Stelle der $test Variable eine Eigenschaft $test am Objekt anzulegen.

                                              class PDF_Table_Header extends PDF_MC_Table
                                              {
                                                  // Eigenschaften
                                                  public $ID;
                                                  public $test;
                                              
                                                  //Kopfzeile
                                                  function Header()
                                                  {
                                                      $this->test = "test";
                                                  } 
                                              
                                                  //Fusszeile
                                                  function Footer()
                                                  {
                                                      //  
                                                  }
                                              }
                                              
                                              $x = new PDF_Table_Header(...);
                                              ...
                                              if ($x->test == 'test')
                                              {
                                                  echo "Test successful";
                                              }
                                              

                                              Das habe ich ganz genau so gemacht und das Restscript kennt $x->test nicht 😟

                                              Bastian

                                              1. Hallo Bastian,

                                                kann nicht sein. Hm. Kann natürlich immer sein, aber dann ist da irgendeine Kleinigkeit faul, die man jetzt übersieht.

                                                Kannst / Willst Du den relevanten Sourcecode irgendwo bereitstellen?

                                                Rolf

                                                --
                                                sumpsi - posui - obstruxi
                                                1. Hallo,

                                                  kann nicht sein. Hm. Kann natürlich immer sein, aber dann ist da irgendeine Kleinigkeit faul, die man jetzt übersieht.

                                                  Müsste man nicht, statt einfach darauf zugreifen zu wollen, eine Getter-Methode bereitstellen?

                                                  Gruß
                                                  Kalk

                                                  1. Hallo Tabellenkalk,

                                                    man *kann getter/setter programmieren und das eigentliche Property private halten. Muss man aber nicht.

                                                    Ein public Property kann man von außen ganz normal verwenden. Ob das guter Stil ist, ist eine andere Frage. Ich persönlich habe keine Skrupel, auf Propertyfelder ohne getter/setter zuzugreifen. Andere sehen das anders. In den 90ern hatte ich darüber in einem Smalltalk-Seminar (die Programmiersprache Smalltalk) ein ziemlich hitziges Gespräch mit dem Referenten, der mich dann mit "Sie müssen objektorientiert denken, nicht in prozeduralem Spagetti" abfertigte. Ich hab mich dann damit abwürgen lassen, statt meinem spontanen Impuls nachzugeben, den Referenten zu erwürgen.

                                                    Getter/Setter zu verwenden statt direkt die Felder anzusprechen kostet etwas Performance. Das ist aber heutzutage vernachlässigbar.

                                                    Rolf

                                                    --
                                                    sumpsi - posui - obstruxi
                                                    1. Hi,

                                                      Getter/Setter zu verwenden statt direkt die Felder anzusprechen kostet etwas Performance. Das ist aber heutzutage vernachlässigbar.

                                                      dafür kann man zusätzliche Logik einbauen - im Getter z.B. einen Default-Wert liefern, wenn der Wert noch nicht gesetzt wurde, oder im Setter noch ein trim auf den String anwenden oder wenn null gegeben wird, einen Leerstring speichern usw.

                                                      Man sollte halt, wenn man getter/setter mit Logik hat, das eigentliche Property private machen.

                                                      cu,
                                                      Andreas a/k/a MudGuard

                                                2. Hallo Rolf,

                                                  Kannst / Willst Du den relevanten Sourcecode irgendwo bereitstellen?

                                                  Klar.

                                                  Ich habe es jetzt extrahiert und kann nicht auf die Eigenschaft zugreifen.

                                                  Mehr Code als den, den ich hier zeige, gibt es bei dem extrahierten Script(en) nicht.

                                                  Edit: Mit getter-Methode kann ich übrigens problemlos auf eine Variable innerhalb der Gettermethode zugreifen. Dann habe ich aber das Problem, dass ich die Variable aus der Headermethode nicht in den Gültigkeit der Gettermethode hinein bekomme. Ich drehe mich also etwas im Kreis.

                                                  testtest.php

                                                  <?php
                                                  
                                                  require_once("./verz1/pdffabrik_test.php");
                                                  
                                                      $pdf = new PDF_Table_Header('P','mm','A4');
                                                      echo "test: ".$pdf->test."<br>";
                                                      exit;
                                                  

                                                  pdffabrik_test.php

                                                  <?php
                                                  
                                                  require_once('../fpdf/mc_table.php');
                                                  
                                                  class PDF_Table_Header extends PDF_MC_Table
                                                  {
                                                      // Eigenschaften
                                                      public $test;
                                                  
                                                      //Kopfzeile
                                                      function Header()
                                                      {
                                                          $this->test = "mein Test";
                                                      } 
                                                  
                                                      //Fusszeile
                                                      function Footer()
                                                      {
                                                      }
                                                  }
                                                  

                                                  Ausgabe:

                                                  test: 
                                                  

                                                  Wo liegt mein Fehler?

                                                  Bastian

                                                  1. Hallo Bastian,

                                                    testtest.php

                                                    <?php
                                                    
                                                    require_once("./verz1/pdffabrik_test.php");
                                                    
                                                        $pdf = new PDF_Table_Header('P','mm','A4');
                                                        echo "test: ".$pdf->test."<br>";
                                                        exit;
                                                    

                                                    pdffabrik_test.php

                                                    <?php
                                                    
                                                    require_once('../fpdf/mc_table.php');
                                                    
                                                    class PDF_Table_Header extends PDF_MC_Table
                                                    {
                                                        // Eigenschaften
                                                        public $test;
                                                    
                                                        //Kopfzeile
                                                        function Header()
                                                        {
                                                            $this->test = "mein Test";
                                                        } 
                                                    
                                                        //Fusszeile
                                                        function Footer()
                                                        {
                                                        }
                                                    }
                                                    

                                                    Ausgabe:

                                                    test: 
                                                    

                                                    Wo liegt mein Fehler?

                                                    ich kann nicht erkennen, dass du die Methode Header(), die $test einen Wert zuweisen würde, auch aufrufst. Also ist $test undefiniert.

                                                    Einen schönen Tag noch
                                                     Martin

                                                    --
                                                    Was sagt die kleine Kerze zur großen Kerze?
                                                    "Ich gehe heute Nacht aus."
                                                    1. Hallo Martin,

                                                      Wo liegt mein Fehler?

                                                      ich kann nicht erkennen, dass du die Methode Header(), die $test einen Wert zuweisen würde, auch aufrufst. Also ist $test undefiniert.

                                                      Ja, das stimmt.
                                                      Das erklärt es.
                                                      Dann muss ich jetzt nur noch herausfinden, an welcher Stelle mein (richtiges) Skript die Headermethode aufruft. Denn das macht es nicht ganz so offensichtlich. Ist für mich aber wichtig, um zu wissen, ab wann die Eigenschaft aus der Headermethode für mich gültig und verfügbar ist.

                                                      Danke für die Hilfe.

                                                      Bastian

                                                      1. Dann muss ich jetzt nur noch herausfinden, an welcher Stelle mein (richtiges) Skript die Headermethode aufruft. Denn das macht es nicht ganz so offensichtlich. Ist für mich aber wichtig, um zu wissen, ab wann die Eigenschaft aus der Headermethode für mich gültig und verfügbar ist.

                                                        Schon gefunden.
                                                        Über den Aufruf $pdf->AddPage() wird wohl automatisch auch die Headermethoide aufgerufen und ab dort ist auch meine Eigenschaft verfügbar.

                                                        Bastian

                                                        1. Hallo Bastian,

                                                          ja, klar. Solange Du keine Seiten erzeugst, gibt's auch keinen Header 😀

                                                          Rolf

                                                          --
                                                          sumpsi - posui - obstruxi
                                                          1. Hallo Bastian,

                                                            ja, klar. Solange Du keine Seiten erzeugst, gibt's auch keinen Header 😀

                                                            Hallo Rolf,

                                                            habt mir mal wieder sehr gut weiter geholfen.

                                                            Erstens fühle ich mich wohler damit, die Klasse extrahiert zu haben, zweitens läuft meine Stapelverarbeitung jetzt und drittens habe ich eine Menge gelernt und wieder etwas gefallen an OOP gefunden.

                                                            Was bei mir noch übrig bleibt, ist die Frage, wie ich z.b. eine protected $eigenschaft, die in der Headerfunktion mit einem wert gefüllt wird, über eine getter methode abrufen kann. Woher weiß die getter methode den Wert der Eigenschaft, wenn diese in einer anderen methode gesetzt wurde?

                                                            Muss ich dann mit global arbeiten?

                                                            Bastian

                                                            1. Hallo Bastian,

                                                              Objekteigenschaften hängen am Objekt und behalten ihren Wert, solange das Objekt "lebt". Du kannst Dir das Objekt dafür als "Array mit angeklebten Funktionen" vorstellen. Was Du also in einer Methode setzt, ist in einer nachfolgend aufgerufenen Methode verfügbar - solange das mit dem gleichen Objekt passiert. Hier etwas Spielerei:

                                                              class Westmensch
                                                              {
                                                                 private $vorname;
                                                                 public $nachname
                                                              
                                                                 public function __constructor($v, $n) {
                                                                    $this->vorname = $v;
                                                                    $this->nachname = $n;
                                                                 }
                                                              
                                                                 public get_Vorname() {
                                                                    return $this->vorname;
                                                                 }
                                                              
                                                                 public get_Name() {
                                                                    return $this->vorname . " " . $this->nachname;
                                                                 }
                                                              
                                                              
                                                                 public set_Name($neuerVorname, $neuerNachame) {
                                                                    $this->vorname = $neuerVorname
                                                                    $this->nachname = $neuerNachname
                                                                 }
                                                              }
                                                              
                                                              $m = new Westmensch("Bastian", "Bux");
                                                              $r = new Westmensch("Rolf", "B");
                                                              
                                                              echo $m->nachname;      // Direktzugriff auf Eigenschaft -> Bux
                                                              echo $m->get_Vorname(); // Getter -> Bastian
                                                              echo $m->vorname;       // Direktzugriff scheitert wegen private
                                                              
                                                              $m->set_Name("Karl", "Koriander");
                                                              $r->set_Name("Rübe", "Zahl");
                                                              $r->nachname = "Rapunzel";
                                                              
                                                              echo $m->get_Name();    // -> Karl Koriander
                                                              echo $r->get_Name();    // -> Rübe Rapunzel
                                                              

                                                              Die Klasse heißt Westmensch, weil das Namensschema für östliche Völker ggf. nicht passt. Die Methodenauswahl ist kein Vorbild für Objektmodellierung!

                                                              Ich erstelle zwei Objekte, jedes mit eigenen Inhalten. Der Vorname ist private (könnte auch protected sein), der Nachname public. Deswegen kann man den Nachnamen direkt lesen und ändern, den Vornamen aber nicht.

                                                              Und was Du in der einen Methode gesetzt hast (oder direkt gesetzt hast), ist in nachfolgenden Methoden weiterhin verfügbar. Aber für jedes Objekt separat.

                                                              Rolf

                                                              --
                                                              sumpsi - posui - obstruxi
                                                              1. n'Abend Rolf,

                                                                Die Klasse heißt Westmensch, weil das Namensschema für östliche Völker ggf. nicht passt. Die Methodenauswahl ist kein Vorbild für Objektmodellierung!

                                                                originelle Idee trotz allem. 😀

                                                                Deswegen kann man den Nachnamen direkt lesen und ändern, den Vornamen aber nicht.

                                                                Ich möchte aber nicht, dass jemand ungefragt meinen Nachnamen ändert!

                                                                Und was Du in der einen Methode gesetzt hast (oder direkt gesetzt hast), ist in nachfolgenden Methoden weiterhin verfügbar. Aber für jedes Objekt separat.

                                                                Deswegen muss man genau zwischen Klasse und Instanz unterschieden: Die Klasse ist sozusagen der Bauplan, die Instanz ein einzelnes, nach diesem Bauplan gefertigtes Exemplar.

                                                                Einen schönen Tag noch
                                                                 Martin

                                                                --
                                                                Was sagt die kleine Kerze zur großen Kerze?
                                                                "Ich gehe heute Nacht aus."
                                  3. Hallo Bastian,

                                    Und nochwas, darf ich Eigenschaften jederzeit überschreiben?

                                    sofern sie öffentlich sind, ja.

                                    $pdf = new(klassenaufruf);
                                    

                                    Diese Syntax kenne ich nicht – meinst du vielleicht

                                    $pdf = new Klasse();
                                    

                                    Viele Grüße
                                    Robert

                                    1. Hallo Robert,

                                      Diese Syntax kenne ich nicht – meinst du vielleicht

                                      $pdf = new Klasse();
                                      

                                      Ganz genau 👍 Bastian

            2. <?php
              $ids=[1,2,3,4];
              header('Location: test.php?param=' . implode( ',' , $ids ) );
              ?>
              

              Du kannst dann die gesendeten Parameter wieder zerlegen. Wenn Du ein anderes Trennzeichen nehmen musst und die zulässigen Zeichen Deiner IDs womöglich in URL-Parametern nicht erlaubte Zeichen beinhalten, dann denke daran, diese mit urlencode(string) zu behandeln.

              1. <?php
                $ids=[1,2,3,4];
                header('Location: test.php?param=' . implode( $ids ) );
                ?>
                

                Du kannst dann die gesendeten Parameter wieder zerlegen. Wenn Du ein anderes Trennzeichen nehmen musst und die zulässigen Zeichen Deiner IDs womöglich in URL-Parametern nicht erlaubte Zeichen beinhalten, dann denke daran, diese mit urlencode(string) zu behandeln.

                Wird auch nichts werden. :(

                Aber php stört sich an etwas anderem: Fatal error: Cannot declare class PDF_Table_Header, because the name is already in use in c:\usw.

                1. Aber php stört sich an etwas anderem: Fatal error: Cannot declare class PDF_Table_Header, because the name is already in use in c:\usw.

                  Wenns kein zip sein soll sondern ein zusammengebautes PDF ... naja: dann muss man halt das PDF korrekt zusammenbauen.

                  Wie man das bewerkstelligt hängt davon ab, wie man das anfängt. Ich nehme dafür die Programme aus dem PDF-Toolkit, die ich eh immer nehme… Was Du versucht hast sehe ich nicht.

                  Ich gehe jetzt baden.

                  1. Ich gehe jetzt baden.

                    Viel Spaß dabei 🙂

                    Es soll gar nicht 1 PDF werden, sondern viele PDF (je ID ein PDF).

                    Wie ich das bisher für 1 PDF mache, habe ich hier beschrieben.

                    Basti

                  2. @@Raketenwilli

                    Ich gehe jetzt baden.

                    Im See? Wie warm ist das Wasser denn schon?

                    (Schon Mitte Mai und ich war immer noch nicht anbaden.)

                    🖖 Живіть довго і процвітайте

                    --
                    When the power of love overcomes the love of power the world will know peace.
                    — Jimi Hendrix
                    1. @@Raketenwilli

                      Ich gehe jetzt baden.

                      Im See?

                      Ja. Buga. Waren mal Kiesgruben. Herrlich und nah (10 Minuten Fahrrad + 2 Ampeln + Fresskram besorgen)

                      Wie warm ist das Wasser denn schon?

                      Ich mach mal lieber kein Foto von dem Thermometer, welches Mann ganz obligatorisch dabei hat. Ich war so 5 Minuten lang drin.

                      1. Hallo,

                        Ich gehe jetzt baden.

                        Im See?

                        Ja. Buga. Waren mal Kiesgruben. Herrlich

                        naja, "ins Wasser gehen" und "herrlich" sind für mich in etwa so widersprüchlich wie "Seife essen" und "lecker". Um wirklich genießen und entspannen zu können, möchte ich zwischen mir und dem Wasser ganz gern noch ein Boot haben. Am besten 'ne kleine 10m-Motoryacht.

                        Wie warm ist das Wasser denn schon?

                        Ich mach mal lieber kein Foto von dem Thermometer, welches Mann ganz obligatorisch dabei hat. Ich war so 5 Minuten lang drin.

                        Unter 30°C Wassertemperatur kommt das für mich gar nicht in Frage (höchstens mal mit den Füßen). Sonst fange ich nach kurzer Zeit völlig unkontrollierbar an zu zittern und kann gar nicht so viel Wärme nachlegen, wie mir das Wasser entzieht.

                        Einen schönen Tag noch
                         Martin

                        --
                        Мир для України.
                    2. Hallo Gunnar,

                      Wie warm ist das Wasser denn schon?

                      Um diese Jahreszeit? Vermutlich so 20°. Bis zu einer Tiefe vom 5mm.

                      Rolf

                      --
                      sumpsi - posui - obstruxi
                      1. Hallo Rolf,

                        Wie warm ist das Wasser denn schon?

                        Um diese Jahreszeit? Vermutlich so 20°. Bis zu einer Tiefe vom 5mm.

                        Und in einer Tiefe von 200m wahrscheinlich so etwa 4°C. 😉

                        Einen schönen Tag noch
                         Martin

                        --
                        Мир для України.
                        1. Moin Martin und Rolf,

                          Wie warm ist das Wasser denn schon?

                          Um diese Jahreszeit? Vermutlich so 20°. Bis zu einer Tiefe vom 5mm.

                          Und in einer Tiefe von 200m wahrscheinlich so etwa 4°C. 😉

                          dicht dran 😜

                          Viele Grüße
                          Robert

  6. @@Bastian

    header(Location:"test.php?param=".$i."");
    

    Auf das falsch gesetzte Anführungszeichen wies Raketenirgendwas ja schon hin. Die andere Unstimmigkeit hatte er stillschweigend mitkorrigiert; hier noch mal in Worten:

    header("Location: test.php?param=".$i."");
    

    ist Unfug. Bei einfachen Anführungszeichen müsstest du den String mit .-Operator zusammensetzen:

    header('Location: test.php?param=' . $i . '');
    

    (Nachtrag: . '' ist ziemlich sinnfrei.)

    Bei doppelten Anführungszeichen aber nicht, denn im String vorkommende Variablen werden geparst.

    header("Location: test.php?param=$i");
    

    🖖 Живіть довго і процвітайте

    --
    When the power of love overcomes the love of power the world will know peace.
    — Jimi Hendrix
    1. Hallo Gunnar,

      header("Location: test.php?param=".$i."");
      

      ist Unfug.

      Unnötig?
      Aber auch wirklich falsch?

      Bastian

      1. @@Bastian

        Unnötig?
        Aber auch wirklich falsch?

        Kein Syntaxfehler, d.h. für den PHP-Parser wäre es nicht falsch.

        Aber alles, was den Code für Menschen unnötig verkompliziert, würde ich falsch nennen.

        🖖 Живіть довго і процвітайте

        --
        When the power of love overcomes the love of power the world will know peace.
        — Jimi Hendrix
      2. Hallo Gunnar,

        header("Location: test.php?param=".$i."");
        

        ist Unfug.

        Unnötig?
        Aber auch wirklich falsch?

        Nun ja. Du bist ja selbst über die notlos und sinnfrei verkomplizierte Syntax gestolpert. Wenn man das schwarz-weiß sehen will ist es also „falsch“, mit Grauwerten: „schlecht“.