fritz85: PHP & XML & Schleife

Hallo zusammen,

ich lese mit PHP eine XML Datei aus. Dies funktioniert wunderbar. Nun versuche ich ein Paging einzufügen.

Ich habe ein $ins_page, die sagt mir wieviel Einträge pro Seite angezeigt werden dürfen.

So lese ich die Einträge aus der XML Datei aus:

  
foreach($XMLcontent->xmlphp as $ausgabe)  
{  
   //....EINTRÄGE  
}  

Ich muss das warsch. sicherlich mittels einer Schleife regeln das er genau bei X Einträgen aufhört... Hab ich probiert wie folgt:

  
for($x = 0; $x < $ins_page; $x++)  
{  
  foreach($XMLcontent->xmlphp as $ausgabe)  
  {  
      //....EINTRÄGE  
  }  
}  

Jedoch funktioniert die Schleife überhaupt nicht :(
Wo liegt der Bug?

Danke und Gruss
fritz85

  1. Jedoch funktioniert die Schleife überhaupt nicht :(

    "überhaupt nicht" liefert dir wahrscheinlich einen fatal error
    "nicht ganz" liefert dir zumindest ein warning ;)

    je nach konfiguration sollten diese aber zumindest irgendwo ausgegeben oder gar protokolliert werden - gibts denn eine fehlermeldung?

    1. Hey,

      je nach konfiguration sollten diese aber zumindest irgendwo ausgegeben oder gar protokolliert werden - gibts denn eine fehlermeldung?

      Nein nein, das nicht.
      Ich habe insgesamt 30 Einträge und es sollen 15 pro Seite angezeigt werden. $ins_page ist 15. Jedoch macht es mir mit dieser Schleife jeden Eintrag 15mal :-)

  2. Hi,
    möglicherweise habe ich dein Problem falsch verstanden, oder du sieht den Wald vor lauter Bäumen nicht. Mein Vorschlag:

    $i = 1;
    foreach($XMLcontent->xmlphp as $ausgabe)
    {
       //....EINTRÄGE
       if ($i == $ins_page) break;
    }

    1. $i = 1;
      foreach($XMLcontent->xmlphp as $ausgabe)
      {
         //....EINTRÄGE
         if ($i == $ins_page) break;
      }

      nach der antwort auf meinen post finde ich, dass das den nerv der zeit trifft und dem entspricht, was der op sucht

      allerdings fehlt noch das start-offset, falls zb bei eintrag 15 begonnen werden soll ;)

      1. allerdings fehlt noch das start-offset, falls zb bei eintrag 15 begonnen werden soll ;)

        $i = $offset;
        foreach($XMLcontent->xmlphp as $ausgabe)
        {
          //....EINTRÄGE
          if ($i == $offset+$ins_page) break;
        }

        =)

        1. Äußere Schleife:

          for ($Offset = 1; $Offset <= count($XMLcontent->xmlphp); $Offset += $ins_page)

          1. Hi

            Äußere Schleife:

            for ($Offset = 1; $Offset <= count($XMLcontent->xmlphp); $Offset += $ins_page)

            Er macht mir die Schleife gleich 3x also er spuckt 3x alle Einträge raus:

            [ 1 ] 2 3

            for ( = 1; <= 30; += 12)
            for ( = 1; <= 30; += 12)
            for ( = 1; <= 30; += 12)

            $num =

            for ($Offset = 1; $Offset <= count($XMLcontent->xmlphp); $Offset += $ins_page)

            hmmm

            1. Kann mir niemand helfen?

              1. Hallo,

                Kann mir niemand helfen?

                Doch. Du selbst, in dem die Antworten auf dein Posting liest.
                Vor allem: https://forum.selfhtml.org/?t=177536&m=1169606

                Wenn du Antworten ignorierst: nein, dann kann dir niemand helfen.

                Grüße
                Thomas

        2. Hey

          $i = $offset;
          foreach($XMLcontent->xmlphp as $ausgabe)
          {
            //....EINTRÄGE
            if ($i == $offset+$ins_page) break;
          }

          Und was ist Offset???

          Leider funktioniert ned bei mir zeigt noch immer alle an.

          Jedoch wenn ich

          if($i == $ins_page) break;

          mache dann bricht er schon bei 15 ab .. aber die nächsten auf seite 2 kommen nicht...

          1. Yerf!

            Ich Antworte mal hier, da ich es so am besten erklären kann:

            $i = $offset;
            foreach($XMLcontent->xmlphp as $ausgabe)
            {
              //....EINTRÄGE
              if ($i == $offset+$ins_page) break;
            }
            Und was ist Offset???

            Offset ist der Startwert, also wo du mit der Anzeige beginnen möchtest.
            Berechnung: Seitennummer (ab 0 gezählt) * Anzahl an Einträgen pro Seite

            Leider funktioniert ned bei mir zeigt noch immer alle an.

            Offset muss natürlich richtig belegt sein.

            mache dann bricht er schon bei 15 ab ..

            Damit hast du Seite 1.

            aber die nächsten auf seite 2 kommen nicht...

            Wie möchstest du die Seite 2 ausgeben? Als abgetrennten Bereich innerhalb des gleichen Requests oder als eigenständig angeforderte Webseite? Davon hängt ab, wie due weiter vorgehen musst.

            Aber im Prinzip geht es darum den Offset richtig vorzubelegen (mit 15 vorbelegt solltest du Seite 2 bekommen).

            Gruß,

            Harlequin

            --
            <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    2. Hi

      möglicherweise habe ich dein Problem falsch verstanden, oder du sieht den Wald vor lauter Bäumen nicht. Mein Vorschlag:

      $i = 1;
      foreach($XMLcontent->xmlphp as $ausgabe)
      {
         //....EINTRÄGE
         if ($i == $ins_page) break;
      }

      Hört sich schon Simpel an, jedoch wenn ich auf Seite 2 gehe muss er mir die nächsten 15 anzeigen - also muss ja doch eine Schleife vorhanden sein?!

  3. Hallo,

    ich lese mit PHP eine XML Datei aus. Dies funktioniert wunderbar. Nun versuche ich ein Paging einzufügen.

    Ich habe ein $ins_page, die sagt mir wieviel Einträge pro Seite angezeigt werden dürfen.

    So lese ich die Einträge aus der XML Datei aus:

    foreach($XMLcontent->xmlphp as $ausgabe)

      
    Und damit hast du alle XML-Einträge  
      
    
    >   
    > Ich muss das warsch. sicherlich mittels einer Schleife regeln das er genau bei X Einträgen aufhört... Hab ich probiert wie folgt:  
    >   
    > ~~~php
      
    
    > for($x = 0; $x < $ins_page; $x++)  
    > {  
    >   foreach($XMLcontent->xmlphp as $ausgabe)  
    >   {  
    > 
    
    

    Und du hast noch immer alle XML-Einträge, egal wie einfach/kompliziert/etc. etc. die äußere Schleife ist. Sobald sie vorhanden ist, reproduzierst nur so und so viele Male alle XML-Einträge.

    Wo liegt der Bug?

    Im Gedankengang, bei den anderen Antwortenden übrigens auch, wie ich finde.

    Wenn du nur x Einträge aus dem XML holen willst musst du wohl an "$XMLcontent" ansetzen und per DOM nur die Anzahl X an Elementen holen.
    (oder SimpleXML mit XPath verwenden: http://www.php.net/manual/en/function.simplexml-element-xpath.php.

    Grüße
    Thomas

    1. Hallo,

      erstmals danke für deine Antwort ich hab das übersehen.
      Nun hab ich mir einige Zeit das XPath angeguckt - jedoch blick ich überhaupt nicht durch.
      Die andere Variante mit DOM -> ???

      pro Seite 5 Einträge

      0-5
      6-10
      11-15
      usw.

      Gruss

      Im Gedankengang, bei den anderen Antwortenden übrigens auch, wie ich finde.

      Wenn du nur x Einträge aus dem XML holen willst musst du wohl an "$XMLcontent" ansetzen und per DOM nur die Anzahl X an Elementen holen.

      1. DOM würde doch wieder zum gleichen führen?

         <?php  
          $doc = new DOMDocument();  
          $doc->load( 'books.xml' );  
          
          $books = $doc->getElementsByTagName( "book" );  
          foreach( $books as $book )  
          {  
          $authors = $book->getElementsByTagName( "author" );  
          $author = $authors->item(0)->nodeValue;  
          
          $publishers = $book->getElementsByTagName( "publisher" );  
          $publisher = $publishers->item(0)->nodeValue;  
          
          $titles = $book->getElementsByTagName( "title" );  
          $title = $titles->item(0)->nodeValue;  
          
          echo "$title - $author - $publisher\n";  
          }  
          ?>
        

        hier hätte ich wieder eine foreach ?

        1. Hallo,

          DOM würde doch wieder zum gleichen führen?
          hier hätte ich wieder eine foreach ?

          Jein.
          getElementsByTagName() liefert eine Node-list und den kannst du zu einem Array machen, uas dem du dann natürlich per index leicht die entsprechende Einträge holen kannst.

          siehe:
          DOMNodeList

           und [link:http://www.php.net/manual/en/domnodelist.item.php@title=DOMNodelist::item]  
            
          Aber DOMXPath ist auch nicht so kompliziert:  
            
          [code lang=php]  
           <?php  
            $doc = new DOMDocument();  
            
          // *****  
            $doc->preserveWhiteSpace = false;  
            
            
            $doc->load( 'books.xml' );  
            
          // *****  
          $xpath = new DOMXPath($doc);  
            
          $query = '//books/book[(position() > $VON) and (position() <= $BIS)]';  
            
          $books= $xpath->query($query);  
            
          foreach ($books as $book) {  
              // was auch immer hier z.B.  
             echo $book->firstChild->nodeValue;  
          }  
            ?>  
          
          

          $VON und $BIS kannst du ggf. ja dann per URL-Parameter setzen.
          ($VON darf aber nicht 0 sein, da es in XPath keine "position() = 0" gibt.

          http://www.php.net/manual/en/domxpath.query.php

          Grüße
          Thomas

          PS: ich bin kein PHP-Experte, also nimm den Code bitte als zu verfeinernde Idee.

          1. Hi Thomas,

            danke vielvielmal...

            Aber DOMXPath ist auch nicht so kompliziert:

            <?php
              $doc = new DOMDocument();

            // *****
              $doc->preserveWhiteSpace = false;

            $doc->load( 'books.xml' );

            // *****
            $xpath = new DOMXPath($doc);

            $query = '//books/book[(position() > $VON) and (position() <= $BIS)]';

            $books= $xpath->query($query);

            foreach ($books as $book) {
                // was auch immer hier z.B.
               echo $book->firstChild->nodeValue;
            }
              ?>

            
            >   
            > $VON und $BIS kannst du ggf. ja dann per URL-Parameter setzen.  
            > ($VON darf aber nicht 0 sein, da es in XPath keine "position() = 0" gibt.  
            >   
            > <http://www.php.net/manual/en/domxpath.query.php>  
            >   
              
              
            Hab gerade das draus gemacht:  
              
            ~~~php
              
            $doc = new DOMDocument();  
            $doc->preserveWhiteSpace = false;  
            $doc->load( 'xml.xml' );  
            $xpath = new DOMXPath($doc);  
              
            $query = "//xmlphp/xmlphp[(position() > 1) and (position() <= 5)]";  
            $books = $xpath->query($query);  
            foreach ($books as $book)  
            {  
             // was auch immer hier z.B.  
             echo $book->text->nodeValue;  
            }  
            
            

            Jedoch kommt nichts...... beim Query muss ich nachhacken..

              
            <?xml version="1.0" encoding="ISO-8859-1"?>  
            <xmlphp date="29.09.2008, 16:42:08">  
             <xmlphp id="7942">  
              <id>7942</id>  
              <text>Test-text</text>  
              <show_name>Test_showname</show_name>  
              <bild>2342.jpg</bild>  
             </xmlphp>  
            </xmlphp>  
            
            

            So sieht mein XML aus.

            1. Wo kann ich das mit den Positionen nachlesen? Weil ich denke das es nicht funktioniert wie das gemacht wurde mit den Positionen da immer die gleichen kommen.