Nicki: Flatfile-db | Pagination zusammen mit Tags/Kategorien verwenden

Hi,

Ich will meine Pagination-Code mit Kategorien erweitern. Wie und wo muss ich den Kategorie-Code einzufügen, dass es auch zusammen mit der Pagination funktioniert?

Code für KategorieTags:

if $_GET['tag'] == $elemente[4] { 
...
}

Flatfile:

text0|text1|text2|text3|KategorieTag

Ausgabe der Artikel mit Pagination:

$lines = file($_SERVER['DOCUMENT_ROOT']."/posts/".date("Y").".txt");  # This is your text file.
$line_amount = count($lines);


$perpage = 5; #This number specified how many lines to show on a page.

$p = isset($_GET['p']) ? $_GET['p'] : 1;
for ($i = (($p * $perpage) - $perpage); $i <= (($perpage * $p) - 1); $i++){
    if($i >= $line_amount){
        break;
    }
    else{
        if($lines[$i] != ''){

            $elemente=explode("|",$lines[$i]);

            echo '<div class="post-preview">';
                echo '<a href="post.html?q='.urlencode($elemente[1]).'&title='.urlencode($elemente[2]).'&sub='.urlencode($elemente[3]).'&date='.urlencode($elemente[0]).'">
                    <h2 class="post-title">
                       '.urldecode($elemente[2]).'
                    </h2>
                    </a>';
                echo '<h3 class="post-subtitle">
                        '.urldecode($elemente[3]).'
                    </h3>';

                echo '<p class="post-meta">Posted by <a href="#">Me</a> on '.urldecode($elemente[0]).'</p>';
            echo '</div>';
            echo '<hr />';

        }
    }
}





$total_pages = $line_amount/$perpage;
if($line_amount % $perpage != 0){
    $total_pages = $total_pages + 1;
}




if($p <= $total_pages - 1){
    $next_page=$p+1;
    echo "<a rel='next' href='?p=$next_page'>Next</a>";

}

if($p!=1)
{
  $back_page=$p-1;
    echo "<a rel='prev' href='?p=$back_page'>Back</a>";

}

Gruß, Nicki

  1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    Hi,

    Ich will meine Pagination-Code mit Kategorien erweitern. Wie und wo muss ich den Kategorie-Code einzufügen, dass es auch zusammen mit der Pagination funktioniert?

    Code für KategorieTags:

    if $_GET['tag'] == $elemente[4] { 
    ...
    }
    

    Flatfile:

    text0|text1|text2|text3|KategorieTag
    

    Ausgabe der Artikel mit Pagination:

    $lines = file($_SERVER['DOCUMENT_ROOT']."/posts/".date("Y").".txt");  # This is your text file.
    $line_amount = count($lines);
    
    
    $perpage = 5; #This number specified how many lines to show on a page.
    
    $p = isset($_GET['p']) ? $_GET['p'] : 1;
    for ($i = (($p * $perpage) - $perpage); $i <= (($perpage * $p) - 1); $i++){
        if($i >= $line_amount){
            break;
        }
        else{
            if($lines[$i] != ''){
    
                $elemente=explode("|",$lines[$i]);
    
                echo '<div class="post-preview">';
                    echo '<a href="post.html?q='.urlencode($elemente[1]).'&title='.urlencode($elemente[2]).'&sub='.urlencode($elemente[3]).'&date='.urlencode($elemente[0]).'">
                        <h2 class="post-title">
                           '.urldecode($elemente[2]).'
                        </h2>
                        </a>';
                    echo '<h3 class="post-subtitle">
                            '.urldecode($elemente[3]).'
                        </h3>';
    
                    echo '<p class="post-meta">Posted by <a href="#">Me</a> on '.urldecode($elemente[0]).'</p>';
                echo '</div>';
                echo '<hr />';
    
            }
        }
    }
    
    
    
    
    
    $total_pages = $line_amount/$perpage;
    if($line_amount % $perpage != 0){
        $total_pages = $total_pages + 1;
    }
    
    
    
    
    if($p <= $total_pages - 1){
        $next_page=$p+1;
        echo "<a rel='next' href='?p=$next_page'>Next</a>";
    
    }
    
    if($p!=1)
    {
      $back_page=$p-1;
        echo "<a rel='prev' href='?p=$back_page'>Back</a>";
    
    }
    

    Da fehlt noch die Doku, was dein Code momentan machen soll, was er tatsächlich macht, wie es aussieht, was der Code in Zukunft machen soll, wie es aussehen soll, woher die Daten kommen und wie sie modelliert sind, wie sie nach der Aufbereitung für die Ausgabe aussehen sollen, usw.

    Hast Du bestimmt nur vergessen und reichst das noch nach? ;-)

    Spirituelle Grüße
    Euer Robert
    robert.r@online.de

    --
    Möge der wahre Forumsgeist ewig leben!
    1. Hallo Robert,

      Da fehlt noch die Doku, was dein Code momentan machen soll, was er tatsächlich macht, wie es aussieht, was der Code in Zukunft machen soll, wie es aussehen soll, woher die Daten kommen und wie sie modelliert sind, wie sie nach der Aufbereitung für die Ausgabe aussehen sollen, usw.

      Hast Du bestimmt nur vergessen ..? ;-)

      Eigentlich nicht ;) Der Code macht z.Z. die "Ausgabe der Artikel mit Pagination". Nachher soll der Code noch so erweitert werden, sodass er die Artikel nach KategorieTags filtert, die Pagination dabei aber noch funktioniert. Die KategorieTags werden über $_GET['tag'] (also durch einen Link) aufgerufen. Die Daten kommen aus einer Textdatei. Wie der Code nachher aussehen soll, das wäre die Frage. ;)

      Gruß, Nicki

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        Da fehlt noch die Doku, was dein Code momentan machen soll, was er tatsächlich macht, wie es aussieht, was der Code in Zukunft machen soll, wie es aussehen soll, woher die Daten kommen und wie sie modelliert sind, wie sie nach der Aufbereitung für die Ausgabe aussehen sollen, usw.

        Hast Du bestimmt nur vergessen ..? ;-)

        Eigentlich nicht ;) Der Code macht z.Z. die "Ausgabe der Artikel mit Pagination". Nachher soll der Code noch so erweitert werden, sodass er die Artikel nach KategorieTags filtert, die Pagination dabei aber noch funktioniert. Die KategorieTags werden über $_GET['tag'] (also durch einen Link) aufgerufen. Die Daten kommen aus einer Textdatei. Wie der Code nachher aussehen soll, das wäre die Frage. ;)

        Wie würdest Du die Kategorie denn filtern?

        Hast Du schon mal darüber nachgedacht, das Dateiformat zu ändern, oder eventuell sogar eine Datenbank zu nutzen?

        Das von Dir gewählte Format ist für größere Datensammlungen und insbesondere Sortierung und Filterung ungünstig. Es muss ja jedes Mal die gesamte Datei eingelesen werden, um sie dann ertst zu verarbeiten (filtern, sortieren, ...), um dann nur fünf Datensätze davon auszugeben. Außerdem musst Du diverse Zeichen maskieren bzw. ersetzen, damit die Inhalte nicht die Dateiorganisation stören.

        Wenn Du bei Flatfile bleiben willst, dann beschäftige dich mal mit Arrays und den Funktionen serialize() und unserialize(). Und wenn Du schon mal dabei bist, dann erzähl mal, ob Du auch schon den konkurrierenden Betrieb behandelt hast: flock(). Wäre dann ein Aufwasch.

        Mit einem serialisierten Array muss zwar immer noch die ganze Datei eingelesen werden, aber das Filtern und Sortieren ist damit schon mal ein Stück einfacher.

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. Tach!

          Hast Du schon mal darüber nachgedacht, das Dateiformat zu ändern, oder eventuell sogar eine Datenbank zu nutzen?

          Zum Beispiel SQLite. Ist auch nur eine Datei.

          Das von Dir gewählte Format ist für größere Datensammlungen und insbesondere Sortierung und Filterung ungünstig. Es muss ja jedes Mal die gesamte Datei eingelesen werden, um sie dann ertst zu verarbeiten (filtern, sortieren, ...), um dann nur fünf Datensätze davon auszugeben. Außerdem musst Du diverse Zeichen maskieren bzw. ersetzen, damit die Inhalte nicht die Dateiorganisation stören.

          Mit SQLite hat man alle diese Komfortmerkmale ...

          Wenn Du bei Flatfile bleiben willst, dann beschäftige dich mal mit Arrays und den Funktionen serialize() und unserialize(). Und wenn Du schon mal dabei bist, dann erzähl mal, ob Du auch schon den konkurrierenden Betrieb behandelt hast: flock(). Wäre dann ein Aufwasch.

          ... ohne die Nachteile einer selbst zu verwaltenden Datei. Selbst das Problem des konkurrierenden Betriebs wird vom SQLite-System gleich mitgelöst.

          dedlfix.

          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            Hast Du schon mal darüber nachgedacht, das Dateiformat zu ändern, oder eventuell sogar eine Datenbank zu nutzen?

            Zum Beispiel SQLite. Ist auch nur eine Datei.

            Das von Dir gewählte Format ist für größere Datensammlungen und insbesondere Sortierung und Filterung ungünstig. Es muss ja jedes Mal die gesamte Datei eingelesen werden, um sie dann ertst zu verarbeiten (filtern, sortieren, ...), um dann nur fünf Datensätze davon auszugeben. Außerdem musst Du diverse Zeichen maskieren bzw. ersetzen, damit die Inhalte nicht die Dateiorganisation stören.

            Mit SQLite hat man alle diese Komfortmerkmale ...

            Wenn Du bei Flatfile bleiben willst, dann beschäftige dich mal mit Arrays und den Funktionen serialize() und unserialize(). Und wenn Du schon mal dabei bist, dann erzähl mal, ob Du auch schon den konkurrierenden Betrieb behandelt hast: flock(). Wäre dann ein Aufwasch.

            ... ohne die Nachteile einer selbst zu verwaltenden Datei. Selbst das Problem des konkurrierenden Betriebs wird vom SQLite-System gleich mitgelöst.

            Im Prinzip ein guter Vorschlag. Aber man muss dann doch wieder escapen.

            Die Arrays habe ich als Alternative zur gewählten rein seriellen Textdatei vorgeschlagen, weil die binary-safe sind, man sich also keine Gedanken mehr über verbotene Zeichen in den Daten machen muss. Das hätte ich eigentlich auch noch hinschreiben wollen, aber da war dann das Korrektur-Zeitfenster schon wieder geschlossen und ich hab's doch vergessen :-O

            Spirituelle Grüße
            Euer Robert
            robert.r@online.de

            --
            Möge der wahre Forumsgeist ewig leben!
            1. Tach!

              [SQLite] Im Prinzip ein guter Vorschlag. Aber man muss dann doch wieder escapen.

              Muss man nicht. Man kann PDO mit Prepared Statements verwenden, die sind auch binary-safe.

              Die [serialisierten] Arrays habe ich als Alternative zur gewählten rein seriellen Textdatei vorgeschlagen, weil die binary-safe sind, man sich also keine Gedanken mehr über verbotene Zeichen in den Daten machen muss.

              Das ist nur ein Nachteil, den man damit umgeht. Alle anderen bleiben.

              dedlfix.

              1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                [SQLite] Im Prinzip ein guter Vorschlag. Aber man muss dann doch wieder escapen.

                Muss man nicht. Man kann PDO mit Prepared Statements verwenden, die sind auch binary-safe.

                In der Beschreibung von file() las ich, das sei nun auch binary safe. Wie kann ich mir das denn vorstellen? Eine formatfreie Textdatei mit Line Endings (also die EoL sind die einzige Formatvorgabe), wie kann die eine binary safe Lesefunktion haben? In Bildern kommen durchaus 0Dh und 0Ah vor.

                Spirituelle Grüße
                Euer Robert
                robert.r@online.de

                --
                Möge der wahre Forumsgeist ewig leben!
                1. Tach!

                  In der Beschreibung von file() las ich, das sei nun auch binary safe. Wie kann ich mir das denn vorstellen? Eine formatfreie Textdatei mit Line Endings (also die EoL sind die einzige Formatvorgabe), wie kann die eine binary safe Lesefunktion haben? In Bildern kommen durchaus 0Dh und 0Ah vor.

                  Darum geht es nicht. Zum Beispiel ist der Container als solcher wasserdicht. Wenn er in s Wasser fällt, bleibt der Inhalt trocken. Wenn du darin aber kaputtgegangene Wasserflaschen und wasserempfindliches Zeug transportierst, nützt dir die äußere Wasserundurchlässigkeit auch nichts mehr.

                  file() kann problemlos alle übergebenen Bytes von 0 bis 255 lesen. Es gibt ja einige Bytes/Zeichen, die haben in bestimmten Umgebungen eine Sonderbedeutung: 0x00 - Stringende, 0x1A Dateiende. Unter solchen Bedingungen kann man keine Binärdaten verarbeiten, wenn darin diese Bytes vorkommen, weil sonst ein Ende erkannt wird und der Rest verlorengeht.

                  Das Problem allerdings ist, dass Bytes für Zeilenumbruchszeichen weiterhin als solche erkannt werden und daraufhin eine neuer Eintrag im Array entsteht. Das ist gemäß der Aufgabenbeschreibung von file() auch richtig so. Die Bytes der Zeilenumbruchszeichen sind somit nicht als Bestandteil der Daten verwendbar, wenn das kein Zeilenumbruch darstellen soll. file() ist auch keine geeignete Funktion, um serialize()te Daten zu lesen. (file_get_contents() geht aber.)

                  CSV ist in dem Fall ein geeigneteres Format. Das kennt entsprechende Maskierregeln, auch um Felder in Datensätzen sicher wiederzuerkennen, nicht nur Zeilen. PHPs fgetcsv/fputcsv-Funktionen arbeiten aber weiterhin mit Dateisystemfunktionen zusammen und ersparen einem nicht das File-Locking.

                  dedlfix.

  2. Moin!

    Hi,

    Ich will meine Pagination-Code mit Kategorien erweitern. Wie und wo muss ich den Kategorie-Code einzufügen, dass es auch zusammen mit der Pagination funktioniert?

    Code für KategorieTags:

    if $_GET['tag'] == $elemente[4] { 
    ...
    }
    

    Flatfile:

    text0|text1|text2|text3|KategorieTag
    

    Ausgabe der Artikel mit Pagination:

    ##
    # Konfiguration:
    $perpage = 5; #This number specified how many lines to show on a page.
    
    ##
    # Programm:
    $data=array(); # neu
    $_GET['kategorie']=trim($_GET['kategorie']);
    
    $lines = file($_SERVER['DOCUMENT_ROOT']."/posts/".date("Y").".txt");  # This is your text file.
    foreach ($lines as $line) {
      $line=trim($line);
      if ( $line and '#' != $line{0} ) {
        $data=explode("|", $lines[$i], 5);
      }
    }
    foreach ($data as $tupel) {
        if ($tupel[5])==$_GET['kategorie']) {
           echo '<div class="post-preview">',
           '<a href="post.html?q=',
           urlencode($tupel[1]),
           '&title=', urlencode($tupel[2]),
           '&sub=', urlencode($tupel[3]),
           '&date=', urlencode($elemente[0]),
           '"><h2 class="post-title">,
           '.urldecode($elemente[2]), 
           '</h2></a>',
           '<h3 class="post-subtitle">', urldecode($elemente[3]), '</h3>',
           '<p class="post-meta">Posted by <a href="#">Me</a> on '.urldecode($elemente[0]), '</p>',
           '</div>',
           '<hr />';
        }
    }
    

    Offenkundig sind Deine PHP-Kenntnissse noch gering.

    Zunächst wird die Datei in einen Array ($lines) gelesen. Dann werden die Zeilen getrimmt und darauf untersucht, ob es ein Kommentar ist. Falls nicht werden die einzelenen Elemente des Daten-Tupels mit Explode geholt. und der Tupel das Array data geschrieben. Was bei Deinem Code danach kam war schlicht grausig, das war BASIC auf dem Stand von 1990, aber kein PHP. Einen solchen Array (Du hattest auch einen) kann man mit foreach durchgehen.

    Alles, was Konfiguration ist, gehört an den Anfang des Skriptes und nicht in die Mitte!

    Auch diese vielen, seriellen echos sind Unsinn, eines genügt. Dann ist es Unsinn, die Strings zusammenzusetzen, denn echo kann eine Liste kommagetrennter Strings ausgeben.

    Den Rest repariere selbst.

    Jörg Reinholz

    1. Tach!

      Auch diese vielen, seriellen echos sind Unsinn, eines genügt. Dann ist es Unsinn, die Strings zusammenzusetzen, denn echo kann eine Liste kommagetrennter Strings ausgeben.

      Man kann auch PHPs eingebaute Template-Funktionalität verwenden.

      Beispiel:

      <h1>Anwender</h1>
      <?php if(count($users) > 0): ?>
          <table>
              <thead>
                  <tr>
                      <th>Id</th>
                      <th>Vorname</th>
                      <th>Nachname</th>
                  </tr>
              </thead>
              <tbody>
      <?php foreach($users as $user): ?>
                  <tr>
                      <td><?= htmlspecialchars($user->Id); ?></td>
                      <td><?= htmlspecialchars($user->FirstName); ?></td>
                      <td><?= htmlspecialchars($user->LastName); ?></td>
                  </tr>
      <?php endforeach; ?>
              </tbody>
          </table>
      <?php else: ?>
          <p>Keine Daten gefunden.</p>
      <?php endif; ?>
      

      Und vor allem sollte man den Kontextwechsel beachten. In dem Fall die HTML-gerechte Behandlung der in HTML einzufügenden Daten.

      dedlfix.

    2. Hi,

      danke für die Hilfe. Ich habe den Code mal getestet. Es wird überhaupt kein Artikel angezeigt. Pagination und Kategorien-Sortierung demzufolge auch nicht. Irgendwo muss da wohl noch ein Fehler stecken.

      Gruss, Nicki

      
      ##
      # Konfiguration:
      $perpage = 5; #This number specified how many lines to show on a page.
      
      ##
      # Programm:
      $data=array(); # neu
      $_GET['tg']=trim($_GET['tg']);
      
      $lines = file($_SERVER['DOCUMENT_ROOT']."/posts/".date("Y").".txt");  # This is your text file.
      foreach ($lines as $line) {
        $line=trim($line);
        if ( $line and '#' != $line{0} ) {
          $data=explode("|", $lines[$i], 5);
        }
      }
      foreach ($data as $tupel) {
          if ($tupel[4]==$_GET['tg']) {
             echo '<div class="post-preview">',
             '<a href="post.html?q=',
             urlencode($tupel[1]),
             '&title=', urlencode($tupel[2]),
             '&sub=', urlencode($tupel[3]),
             '&date=', urlencode($tupel[0]),
             '"><h2 class="post-title">,
             '.urldecode($tupel[2]),
             '</h2></a>',
             '<h3 class="post-subtitle">', urldecode($tupel[3]), '</h3>',
             '<p class="post-meta">Posted by <a href="#">Me</a> on '.urldecode($tupel[0]), '</p>',
             '</div>',
             '<hr />';
          }
      }
      
      $total_pages = $line_amount/$perpage;
      if($line_amount % $perpage != 0){
          $total_pages = $total_pages + 1;
      }
      
      if($p <= $total_pages - 1){
          $next_page=$p+1;
          echo "<ul class=\"pager\">";
          echo "<li class=\"next\">";
          echo "<a rel='next' href='?p=$next_page'>Next</a>";
          echo "</li>";
          echo "</ul>";
      }
      
      if($p!=1)
      {
        $back_page=$p-1;
          echo "<ul class=\"pager\">";
          echo "<li class=\"next\">";
          echo "<a rel='prev' href='?p=$back_page'>Back</a>";
          echo "</li>";
          echo "</ul>";
      }
      
      1. Moin!

        wenn Du wüsstest, wie man das error_reporting einschaltet, dann hättest Du gesehen das diese Zeile noch einen alten Rest enthält:

        $data=explode("|", $lines[$i], 5);
        

        Und wenn Du für 10 Cent Talent zum Programmieren hast, dann wirst Du auch erkennen, was da stehen muss.

        Jörg Reinholz

        1. Moin!

          wenn Du wüsstest, wie man das error_reporting einschaltet, dann hättest Du gesehen das diese Zeile noch einen alten Rest enthält:

          Und wenn Du für 10 Cent Talent zum Programmieren hast, dann wirst Du auch erkennen, was da stehen muss.

          Deine Bemerkungen sind weder konstruktiv noch zielführend. Ich glaube dir, dass du besser im programmieren bist. Wenn du helfen willst, hilf einfach wertungsfrei oder lass es.

          Gruss, Nicki

          1. Moin!

            Deine Bemerkungen sind weder konstruktiv noch zielführend.

            Das sind sie wohl. Immerhin habe ich Dir sehr konkret gezeigt, wo der erste erkennbare Fehler liegt (zielführend) und wie Du darauf gekommen wärst (konstruktiv). Einer Deiner weiteren Fehler ist - und deswegen denke ich, Du hast kein Talent zum Programmieren - dass Du offenbar nicht die Geduld zum Debuggen aufwendest, Dich scheinbar gar nicht selbst durchbeißen willst. Den Code, den Du gezeigt hast, hast Du ganz offensichtlich irgendwo abgeschrieben - ohne ihn zu verstehen.

            Jörg Reinholz

            1. Für deine Hilfe danke ich dir. Aber um die ging es nicht. Es ging um deine Bemerkungen, welche du zusammen mit deiner Hilfe stets loswerden musstest. Diese waren weder konstruktiv noch zielführend. Da du mich nicht kennst, kannst du dir wohl kein Urteil darüber erlauben, ob ich mich durchbeißen kann oder nicht. Du selbst solltest dir vielleicht etwas mehr Geduld beim lehren angewöhnen und Lernende weniger herablassend behandeln.

              Einen schönen Abend, Nicki