Hello,
also "file()" sollte man nur zum reinen Lesen Benutzen. Reines Lesen bedeutet, dass die mit file() ausgelesenen Daten nicht wieder zurückgeschrieben werden dürfen. Ich habe bis heute nicht herausgefunden, ob file() und file_get_contents() mit einem Advisory-Lock auf die Daten arbeiten, da ich den Objectcode irgendwie nicht mehr finde. :-(( Aber man kann das auch durch Test ermitteln. Das werde ich gleich mal tun.
Wenn die Inhalte aber nicht gesichert gelesen werden konnten, dann darf man für die Schreiboperation ausschließlich den (a)-Mode benutzen und mit Exclusive-Lock arbeiten und den Dateizeiger zum Schreiben nicht selbst anfassen. Dann sollte da auch nichts schief gehen. Man darf damit auch nur NEUE INHALTE hinzufügen, also ein "insert" hinter das Ende der Daten durchführen.
Zum Thema Blättern.
Wenn man nun file() zum Lesen nimmt oder auch fget_csv() http://de3.php.net/manual/en/function.fgetcsv.php, dann könnte also bestenfalls der letzte Satz fehlen oder kaputt sein, weil der gerade noch geschrieben wird durch einen anderen Prozess.
Was bedeutet "Blättern"? Blättern heißt, dass X Datensätze auf einer SEITE zusammengefasst werden. X muss also als erste mal festgelegt werden http://de3.php.net/manual/en/function.define.php.
Dann muss man wissen, WELCHE Seite ( <input type="hidden" name="ctrl[pageno]" value="<?php echo $pageno: ?>"> ) angezeigt wird und welche als nächste angezeigt werden soll:
if (isset($_POST['ctrl']['pageno'])) ## fragen, ob überhautpt schon eine Seitennummer
{ ## übertragen wurde im Form
$pageno = intval($_POST['ctrl']['pageno']) ## aktuelle Seitennummer ermitteln
if (isset($_POST['btn']['next'])) ## wenn der "NEXT"-Button gedrückt wurde
{
$pageno++; ## Seitennummer erhöhen
}
elseif (isset($_POST['btn']['prev'])) ## wenn der "PREV"-Button gedrückt wurde
{
$pageno--; ## Seitennummer verringern
}
elseif (isset($_POST['btn']['direct']) ## direkt zur Seite .... springen
{
$pageno = intval(key($_POST['btn']['direct'])); ## Seitennummer zum Direktsprung ermitteln
}
if ($pageno < 0) $pageno = 0; ## wenn einer vor Seite 0 blättern wollte
if ($pageno > $max_pageno) $pageno = $max_pageno; ## wenn einer mehr sehen wollte, als da ist
}
else
{
$pageno = 0; ## wir beginnen die Zählung mit 0
}
Wie wir also die gewünschte Seite ermitteln, wissen wir jetzt.
Jetzt müssen wir mal nachdenken, wie wir $max_pageno ermitteln:
Bei X Datensätzen auf einer Seite gilt:
$max_pageno = intval($count_recs / X)-1;
Schade, Problem nur verlagert, denn $count_recs (Die Anzahl der vorhandenen Sätze) kennen wir noch nicht. Ok, das besorgen wir uns:
$_recs = file($dateiname); ## das Array mit allen Datensätzen
$count_recs = count($_recs); ## Die Anzahl der Elemente im Array
Hinweis bei Verwendung von file():
Die Daten dürfen keine "\r\n" oder so enthalten, sonst kommt das System durcheinander!
Klasse, aber wie erzeugen wir nun die Controls (hidden-Vaiablen) und die Buttons im Formular?
Das machen wir mit einer Funktion:
function make_buttons($pageno, ## aktuelle Seitennummer
$max_pageno, ## Maximale Seitennummer
$generate=5, ## Anzahl der anzuzeigenden Buttons
$gap="\n") ## Zwischenraum der Buttons
{
$btn = "<input type="submit" name="btn[first]" value="|<<=" class="navbtn">$gap";
$btn .= "<input type="submit" name="btn[prev]" value="<--" class="navbtn">$gap";
$start = $pageno - intval($generate/2); ## immer $generate/2 buttons VOR der aktullen Seite
if ($start < 0) $start = 0; ## wenn das erlaubt ist.
$stop = $start + $generate;
if ($stop > $max_pageno) $stop = $max_pageno;
if (($stop - $start) < $generate) $start = $stop - $generate +1;
if ($start < 0) $start = 0;
if ($start > 0) $btn .= "...";
for ($i=$start; $i<=$stop; $i++)
{
$btn .= "<input type="submit" name="btn[direct]" value="Seite ".($i+1)."" class="navbtn">$gap";
}
if ($stop < $max_pages) $btn .= "...";
$btn .= "<input type="submit" name="btn[next]" value="-->" class="navbtn">$gap";
$btn .= "<input type="submit" name="btn[last]" value="=>>|" class="navbtn">";
return $btn;
}
Es wir ein Code generiert, den Du dann später nu an passender Stelle ausgeben musst.
<input type="submit" name="btn[first]" value="|<<=" class="navbtn">
<input type="submit" name="btn[prev]" value="<--" class="navbtn">
...<input type="submit" name="btn[direct][41]" value="Seite 42" class="navbtn">
<input type="submit" name="btn[direct][42]" value="Seite 43" class="navbtn">
<input type="submit" name="btn[direct][43]" value="Seite 44" class="navbtn">
<input type="submit" name="btn[direct][44]" value="Seite 45" class="navbtn">
<input type="submit" name="btn[direct][45]" value="Seite 46" class="navbtn">
<input type="submit" name="btn[next]" value="-->" class="navbtn">
<input type="submit" name="btn[last]" value="=>>|" class="navbtn">
Nicht irritieren lassen, die Funktion zeit für $pageno == 0 "Seite 1" an.
Über sden Trick mit dem Array bekommen wir aber trotzdem den Index 0 geliefert.
Ich denke, dass Du leicht die passenden Datensätze (Zeilennummern) zur geforderten Seite aus dem Array extrahieren kannst, um sie zur Anzeige zu bringen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau