Vereinfachung meines Blättermechanismus
Enrico
- php
0 Metalgurke0 Metalgurke0 tk
0 Tom0 dedlfix
0 Enrico
Hallo und guten Abend,
ich habe mir in php einen Blättermechanismus erstellt.
Ich habe ihn mir deshalb selber erstellt, weil ich mir die Systematik selbst erarbeiten wollte.
Er funktioniert einwandfrei, ist aber sehr, sehr umfangreich geraten.
Hier der Code:
$file_handle = fopen ("../Textdateien/Startseite.txt", "rb");
while (!feof ($file_handle))
{
$Komplette_Zeile [] = fgets ($file_handle);
}
fclose ($file_handle);
$Anzahl_Zeilen = count ($Komplette_Zeile);
$Anzahl_Seiten = ceil ($Anzahl_Zeilen / 10);
$Seite = isset ($_GET ['Seite']) ? $_GET ['Seite'] : 1;
if ($Seite == 1)
{
$Anfang = 0;
if ($Anfang + 10 > $Anzahl_Zeilen)
{
$Ende = $Anzahl_Zeilen;
}
else
{
$Ende = $Anfang + 10;
}
$Link_Anfang = '<div id="Anfang_nicht_verfuegbar"></div>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
if ($Seite == $Anzahl_Seiten)
{
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<div id="Ende_nicht_verfuegbar"></div>';
}
else
if ($Seite + 1 == $Anzahl_Seiten)
{
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<a href="Startseite.php?Seite=' . $Anzahl_Seiten . '"><div id="Ende"></div></a>';
}
else
{
$Link_Vor = '<a href="Startseite.php?Seite=' . ($Seite + 1) . '"><div id="Vor"></div></a>';
$Link_Ende = '<a href="Startseite.php?Seite=' . $Anzahl_Seiten . '"><div id="Ende"></div></a>';
}
}
else
if ($Seite == 2)
{
$Anfang = 10;
if ($Anfang + 10 > $Anzahl_Zeilen)
{
$Ende = $Anzahl_Zeilen;
}
else
{
$Ende = $Anfang + 10;
}
$Link_Anfang = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
if ($Seite + 1 == $Anzahl_Seiten)
{
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<a href="Startseite.php?Seite=' . $Anzahl_Seiten . '"><div id="Ende"></div></a>';
}
else
{
$Link_Vor = '<a href="Startseite.php?Seite=' . ($Seite + 1) . '"><div id="Vor"></div></a>';
$Link_Ende = '<a href="Startseite.php?Seite=' . $Anzahl_Seiten . '"><div id="Ende"></div></a>';
}
}
else
if ($Seite + 1 == $Anzahl_Seiten)
{
$Anfang = ($Seite * 10) - 10;
$Ende = $Anfang + 10;
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<a href="Startseite.php?Seite=' . $Anzahl_Seiten . '"><div id="Ende"></div></a>';
if ($Seite - 1 == 1)
{
$Link_Anfang = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
}
else
{
$Link_Anfang = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a>';
$Link_Zurueck = '<a href="Startseite.php?Seite=' . ($Seite - 1) . '"><div id="Zurueck"></div></a>';
}
}
else
if ($Seite == $Anzahl_Seiten)
{
$Anfang = ($Seite * 10) - 10;
$Ende = $Anzahl_Zeilen;
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<div id="Ende_nicht_verfuegbar"></div>';
if ($Seite - 1 == 1)
{
$Link_Anfang = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
}
else
{
$Link_Anfang = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a>';
$Link_Zurueck = '<a href="Startseite.php?Seite=' . ($Seite - 1) . '"><div id="Zurueck"></div></a>';
}
}
else
{
$Anfang = ($Seite * 10) - 10;
$Ende = $Anfang + 10;
$Link_Anfang = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a>';
$Link_Zurueck = '<a href="Startseite.php?Seite=' . ($Seite - 1) . '"><div id="Zurueck"></div></a>';
$Link_Vor = '<a href="Startseite.php?Seite=' . ($Seite + 1) . '"><div id="Vor"></div></a>';
$Link_Ende = '<a href="Startseite.php?Seite=' . $Anzahl_Seiten . '"><div id="Ende"></div></a>';
}
Wie kann ich den Code schlanker gestalten?
Vielen Dank im Voraus und Gruß
Enrico
Hallo und guten Abend,
ich habe mir in php einen Blättermechanismus erstellt.
Ich habe ihn mir deshalb selber erstellt, weil ich mir die Systematik selbst erarbeiten wollte.
Er funktioniert einwandfrei, ist aber sehr, sehr umfangreich geraten.
...
Wie kann ich den Code schlanker gestalten?
Vielen Dank im Voraus und Gruß
Enrico
Hi Enrico,
schaut doch garnicht so schlecht aus. Klaro, besser geht immer :)
Ich habe mal den Code überarbeitet( und ein paar Variablen umbenannt). Diesen kann man aber sicherlich auch noch weiter optimieren.
Ich habe des weiteren einen Punkt geändert, der mir nicht logisch erschien.
Bei dir erscheint folgendes: Wenn bspw. drei Seiten existieren, und man befindet sich auf Seite zwei, dann ist der "zurück" und "vorwärts"-Link deaktiviert. Das macht aus meiner Sicht keinen Sinn. Wozu gibt es schließlich einen zurück/vorwärts-Link. In meinen Code ist der Link nicht deaktiviert. Ansonsten hat der Code die gleiche Funktionalität (müsste eigentlich klappen, ist aber schon spät :) ).
/****************** editierbar *******************/
$zeilen_pro_seite = 10;
$dateiname = 'text.txt';
/*************************************************/
$komplette_zeile = Array();
$max_anzahl_seiten = 0;
$ausgabe = "";
$act_seite = isset($_GET['Seite']) ? (int)$_GET['Seite'] : 1;
$file_handle = fopen($dateiname, 'r');
while (!feof ($file_handle))
{
$komplette_zeile[] = fgets($file_handle);
}
fclose ($file_handle);
$max_anzahl_seiten = ceil(count($komplette_zeile) / $zeilen_pro_seite);
if($act_seite == 1 && $max_anzahl_seiten == 1)
{
$ausgabe = '<div id="Anfang_nicht_verfuegbar"></div><div id="Zurueck_nicht_verfuegbar"></div><div id="Vor_nicht_verfuegbar"></div><div id="Ende_nicht_verfuegbar"></div>';
}
else if($act_seite == 1 && $max_anzahl_seiten > 1)
{
$ausgabe = '<div id="Anfang_nicht_verfuegbar"></div><div id="Zurueck_nicht_verfuegbar"></div><a href="Startseite.php?Seite=2"><div id="Vor"></div></a><a href="Startseite.php?Seite=' . $max_anzahl_seiten . '"><div id="Ende"></div></a>';
}
else if($act_seite != 1 && $max_anzahl_seiten > $act_seite)
{
$ausgabe = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a><a href="Startseite.php?Seite=' . ($act_seite - 1) . '"><div id="Zurueck"></div></a><a href="Startseite.php?Seite=' . ($act_seite + 1) . '"><div id="Vor"></div></a><a href="Startseite.php?Seite=' . $max_anzahl_seiten . '"><div id="Ende"></div></a>';
}
else if($max_anzahl_seiten == $act_seite)
{
$ausgabe = '<a href="Startseite.php?Seite=1"><div id="Anfang"></div></a><a href="Startseite.php?Seite=' . ($act_seite - 1) . '"><div id="Zurueck"></div></a><div id="Vor_nicht_verfuegbar"></div><div id="Ende_nicht_verfuegbar"></div>';
}
//Ausgabe der Links
echo $ausgabe;
PS. Kleine Korrektur. Dann ist das Ding auch ganz sicher.
tausche folgende Zeile:
else if($act_seite != 1 && $max_anzahl_seiten > $act_seite)
gegen
else if($act_seite > 1 && $max_anzahl_seiten > $act_seite)
aus. Jetzt ist das Ding auch gegen Usereingabgen wie bspw. Seite=-3 etc. geschützt. Bei Manipulation bzw. nicht existierenden(fiktivien) Seitenzahlen, werden die Links nicht mehr angezeigt.
Hallo,
Ansonsten hat der Code die gleiche Funktionalität (müsste eigentlich klappen, ist aber schon spät :) ).
merkt man - du hast nämlich übersehen dass das:
$ausgabe = '<div id="Anfang_nicht_verfuegbar"></div><div id="Zurueck_nicht_verfuegbar"></div><a href="Startseite.php?Seite=2"><div id="Vor"></div></a><a href="Startseite.php?Seite=' . $max_anzahl_seiten . '"><div id="Ende"></div></a>';
ungültiges HTML ergibt (<div> darf nicht innerhalb von <a> vorkommen) :-)
Gruß,
Tobias
ungültiges HTML ergibt (<div> darf nicht innerhalb von <a> vorkommen) :-)
Hi Tobias,
da hast du natürlich recht, ein BlockElement sollte nicht in einem InlineElement stehen, sondern umgekehrt. :)
@Enrico
Ganz generell: Ich würde dir den W3C Validator empfehlen um deine WebSeite checken zu lassen.
Hello Enrico,
Du solltest konsequent versuchen, die Steuerung, die Datenbeschaffung und die Datanaufbereitung für die Ausgabe zu trennen.
Also lege fest, welche Seite Du sehen willst.
Aus der Datei holst Du dann nur diejenigen Daten, die auch zur Anzeige kommen sollen.
Da es sich um eine sequentielle Datei zu handeln scheint, spulst Du an den anderen "Zeilen" einfach zählenderweise vorbei, ohne die Daten aber im Array abzuspeichern. Das schützt Dich bei sehr großen Dateien vor einem Speicherüberlauf.
Außerdem sollte man bei derartigen Konstrukten (große Dateien) auch beim Lesen mit einer Konkurrenzsperre arbeiten. Siehe hierzu den Fachartikel von Christian Seiler, den ich leider im Moment nicht verlinken kann, weil de.selfhtml.org nicht antwortet.
$file_handle = fopen ("../Textdateien/Startseite.txt", "rb");
while (!feof ($file_handle))
{
$Komplette_Zeile [] = fgets ($file_handle);
}fclose ($file_handle);
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Aus der Datei holst Du dann nur diejenigen Daten, die auch zur Anzeige kommen sollen.
Jein, holen muss er schon alle, denn er braucht auch die Anzahl der Zeilen. Zu merken braucht er sich aber nur die Zeilen der aktuellen Seite. Von wo bis wo die gehen müssten, kann man vorab berechnen, ohne die Anzahl zu kennen. Allerdings hat man nun ein kleines Problem mit einer zu hoch übergebenen Seitenzahl. Entweder bringt man dann einfach kein Ergebnis - man kann schließlich nicht erwarten, bei falschen Angaben irgendwas Richtiges zu bekommen - oder merkt sich beim "Vorbeiblättern" der zuvor liegenden Seiten immer eine Seite, bis feststeht, dass es einen weitere gibt.
$file_handle = fopen ("../Textdateien/Startseite.txt", "rb");
while (!feof ($file_handle))
{
$Komplette_Zeile [] = fgets ($file_handle);
}fclose ($file_handle);
Wenn wirklich alles komplett eingelesen werden soll, dann wäre das ganze Konstrukt mit file() einfacher zu haben.
Lo!
Hallo,
danke für eure zahlreichen Antworten, wenn ich auch der einen oder anderen nicht ganz folgen kann ;-)
Dennoch hoffe ich, das eine oder andere umsetzen zu können.
Gruß
Enrico
Hi!
danke für eure zahlreichen Antworten, wenn ich auch der einen oder anderen nicht ganz folgen kann ;-)
Wenn du deine Verständnisschwierigkeiten noch ausgeräumt haben möchtest, solltest du sie benennen.
Lo!
Hallo dedlfix,
beispielsweise die konsequente Trennung von Steuerung, Datenbeschaffung und Datanaufbereitung, so wie es Tom angeschnitten hat.
Ich vermute, er meint, dass Tom meint, anhand einer übergebenen Seite die entsprechenden Zeilen auslese, separat die Steuerung und wieder separat die Ausgabe aufbereite.
Tobias meinte, dass kein <div>-Tag innerhalb eines <a>-Tags sein dürfe, was meine Systematik wiederum über den Haufen wirft.
Und schließlich Deine Antwort bzgl. des "Vorbeiblättern" etc.
Gruß
Enrico
hi Enrico,
beispielsweise die konsequente Trennung von Steuerung, Datenbeschaffung und Datanaufbereitung, so wie es Tom angeschnitten hat.
Das kann ich nur unterstreichen ;)
Ich vermute, er meint, dass Tom meint, anhand einer übergebenen Seite die entsprechenden Zeilen auslese, separat die Steuerung und wieder separat die Ausgabe aufbereite.
Ja, im Prinzip: Die Anwendung/Dein Script bekommt die Daten aus bestimmten Strukturen oder verwendet bestimmte Methoden. Wo die Daten herkommen, ist egal, das kann mysql sein oder eine Datei. In der Anwendung selbst stehen keine SQL-Statements und auch keine Datei-Lese-Schreib-Funktionen, sondern es werden nur Funktionen/Methoden eines abstract Layers benutzt, Methoden eines abstract Layers, der die Verbindung zu einer DB oder zu einer Datei herstellt.
Das bringt einige Vorzüge, auch für einen Paginator. Mal angenommen, der Abstract Layer ist eine Klasse, wofür in Deiner Anwendung ein Objekt erstellt wird. Dem Konstruktor wird bspw. mitgegeben, wieviele Records per Page zu sehen sein sollen und ggf. ein Sortier- oder anderes Filterkriterium.
Dann gäbe es eine Methode, die aus der Datenhaltung ein Array fischt, diese Methode kriegt dann nur noch die Nummer der gewünschten Seite.
Natürlich kann der abstract Layer auch eine prozedural arbeitende Library sein.
In Perl, meiner bevorzugten Scriptsprache, sind diese abstract Layer meistens Tie-Klassen, die einen Hash, ein Array oder eine Referenz binden. In der Anwendung wird dann nur mit diesen Datenstrukturen gearbeitet, Beispiel in Perl:
344: tie %obj, 'ORM', %opts; # Tie-Klasse als abstract Layer zur DB
345: $obj{'/impressum'){title} = 'Ein neuer Titel für das Impressum';
Mit der Wertzuweisung in Zeile 345 läuft im Hintergrund ein Insert/Update-Statement, ohne dass im Code der Anwendung SQL-Statements notiert sind.
So ungefähr sähe dann die Anwendung eines Paginators aus, der aus einer Kladde die Seite 33 zeigen soll:
my $ref = $dbo->show_kladde( page => 33 );
Wo bspw. vorher, bei der Objekterstellung $dbo mitgeteilt wurde, dass jede Seite 10 Records beinhalten soll.
Hotti
Hi!
beispielsweise die konsequente Trennung von Steuerung, Datenbeschaffung und Datanaufbereitung, so wie es Tom angeschnitten hat.
Wenn man alle Programmbestandteile mischt, hat man es schwerer, die Übersicht zu behalten und vor allem Fehler zu suchen. Stattdessen ist es von Vorteil, seinen Anwendungsfall sorgfältig zu planen und Aufgaben in Teilaufgaben runterzubrechen. Diese Teilaufgaben sollten klar voneinander abgrenzbar sein, und das sollte sich auch im Code widerspiegeln. So hat man es später einfacher diese Teilaufgaben in Funktionen auszulagern, falls man solche nicht sowieso schon von Anfang an erstellt.
Ich vermute, er meint, dass Tom meint, anhand einer übergebenen Seite die entsprechenden Zeilen auslese, separat die Steuerung und wieder separat die Ausgabe aufbereite.
Die Ausgabe sollte nicht mehr entscheiden müssen, ob anhand der Daten bestimmte Elemente ausgeblendet werden sollen. Stattdessen kann man diese Information im Hauptteil berechnen und nur noch Flags an den Ausgabeteil reichen, am besten als Array (oder Objekt), damit nicht so viele einzelne Variablen herumliegen. Wobei hier nicht die Anzahl als solche ein Problem darstellt, sondern die Ordnung. In einem Array/Objekt sind sie alle schön beieinander.
Tobias meinte, dass kein <div>-Tag innerhalb eines <a>-Tags sein dürfe, was meine Systematik wiederum über den Haufen wirft.
Es gibt grob gesagt zwei Arten von HTML-Elementen: Block-Elemente und Inline-Elemente. Block-Elemente haben die Eigenschaft, eine neue Box auf neuer Zeile zu erstellen. Inline-Elemente setzen den Textfluss fort. Block-Elemente strukturieren im Groben, Inline-Elemente formatieren einzelne Textstücke - sag ich jetzt einfach mal so vereinfachend. Für die eigentliche Formatierung ist CSS zuständig, und man kann damit auch Blöcke zu Inlineren umformatieren und umgekehrt, aber tun wir mal so, als ob es CSS nicht gäbe. Jedes HTML-Element hat eine Grundformatierung gemäß seiner Aufgabe. Wenn nun ein Inline-Element mitten im Text steht und darin ein Block-Element notiert wird, so würde das Block-Element den Fluss, in dem sich der Inliner befindet, sprengen, weil es eine neue Zeile beginnt. Und in der Tat ist es so, dass Browser beim Auftreten von Blockelementen in Inlinern, letzteres einfach schließen und einen neuen Block anfangen - oder auch nicht. Bis HTML 4 war das Verhalten bei solchen Schachtlungsfehlern nicht definiert und die Browser konnten damit machen was sie wollen. In der HTML-Referenz steht zu jedem Element, worin es in welcher HTML-Version stehen und was es enthalten darf. Es steht allerdings nicht dabei, ob es ein Block- oder Inline-Element ist. Das ist nämlich nicht explizit festgelegt, sondern ergibt sich aus den HTML-DTDs. Eine DTD ist quasi ein technisch auswertbares Gesetz zur Strukturierung von HTML-Dokumenten (ist jetzt nicht exakt formuliert, aber das stört jetzt für das Verständnis nicht). Anhand der DTDs sind auch die Referenz-Seiten zu HTML entstanden. Deswegen lesen die sich auch ziemlich technisch. Wenn du dir jedoch mal das div anschaust, siehst du darin im Abschnitt Kindelemente eine ausklappbare Zusammenfassung von Block- und Inline-Elementen.
In deinem Fall brauchst du eigentlich nur das div um das a zu legen und nicht umgekehrt. Aber ... Dann kommt auch noch die Semantik ins Spiel, wenn man genau sein will. Deine Blätter-Elemente bilden eigentlich eine Liste. Du brauchst sie nicht mit dem Universalelement div auszuzeichnen, wenn du eine ungeordnete Liste nimmst, also ein ul um's Ganze und die einzelnen Elemente sind li. Wenn verlinkt steht darin noch ein a und darin der Linktext, ansonsten nur das nackige li mit Nicht-Link-Text. Fertig - zumindest der HTML-Teil. Formatiert wird das ganze mit CSS, indem die Anstriche und Abstände gegebenenfalls entfernt werden, und so weiter. Die Browser haben eingebaute oder nachrüstbare Werkzeuge, mit denen man sich die aktuelle Formatierung inklusive der Default-Werte anzeigen lassen kann, um so herauszufinden, was man alles ändern muss.
Und schließlich Deine Antwort bzgl. des "Vorbeiblättern" etc.
Du willst ja immer nur einen Teil anzeigen lassen. Dazu musst du eigentlich auch nur den anzuzeigenden Teil der Datei einlesen. Das geht bei einer Datenbankabfrage zum Beispiel mit LIMIT recht bequem. Zudem braucht man eine zweite Abfrage, die die Gesamtzahl Datensätze ermittelt. Textdateien bieten diesen Luxus nicht. Wenn du die Zeilenanzahl haben willst, musst du die Datei vollständig durchlaufen und die Zeilenenden zählen (oder zeilenweise einlesen und diese Zeilen zählen). Die Anzahl lässt sich nicht aus der Dateigröße berechnen, weil jede Zeile unterschiedlich lang sein kann. Ansonsten brauchst du jedoch nur den Teil der Zeilen aufzuheben, der wirklich angezeigt werden soll und nicht komplett alle Zeilen. Wenn du schon eine Blätterfunktion haben willst, dann doch sicher, weil die Daten einerseits zu umfangreich zum Anzeigen geworden sind und andererseits sie auch nur unnötig Speicher belegen, wenn du große Teile gar nicht haben willst.
Tom schlug daraufhin vor, die unnötigen Zeilen am Anfang zu überspringen und die x Zeilen der anzuzeigenden Seite zu lesen und zu merken und dann das Auslesen zu stoppen. Damit kommst du aber nicht zur Gesamtzahl der Zeilen. Du musst also weiter bis zum Ende lesen, brauchst aber diese Zeilen auch nicht abzuspeichern. Soweit erstmal so einfach, doch der Teufel steckt im Detail. Jemand übergibt als Parameter, dass er Seite n+m haben will, aber du hast nur Daten für maximal n Seiten. Die Gesamtzahl weißt du noch nicht, die ergibt sich erst beim Auslesen. Aber du musst vorher schon berechnen, von wo bis wo du die Zeilen aufheben willst. Erkennst du das Problem? Wir wollen effizient mit dem Speicher umgehen, müssen aber auch Fehlerfälle beachten, die wir nicht durch Vorabberechnungen erkennen können.
Das Problem besteht natürlich nicht, wenn du die Datei im Ganzen einliest und dann erst rechnest, wobei der Speicherverbrauch aber nicht optimal ist. Wenn du dir für den Anfang die genannten Schwierigkeiten ersparen willst, kannst du ja erstmal die ineffiziente Variante nehmen. Doch je mehr Daten du hast, desto mehr kostet dich das Ressourcen. Dass du immer die gesamte Datei durchlaufen musst, bleibt dir jedoch in keinem Fall erspart. Wenn das zunehmend zum Problem zu werden droht, solltest du dir über eine andere Datenhaltung Gedanken machen, beispielsweise eine Datenbank. Die bekommt die Gesamtzahlberechnung deutlich einfacher hin, und auch die Auswhl der Daten für die aktuelle Seite.
Lo!
Hello,
Das Problem besteht natürlich nicht, wenn du die Datei im Ganzen einliest und dann erst rechnest, wobei der Speicherverbrauch aber nicht optimal ist. Wenn du dir für den Anfang die genannten Schwierigkeiten ersparen willst, kannst du ja erstmal die ineffiziente Variante nehmen. Doch je mehr Daten du hast, desto mehr kostet dich das Ressourcen. Dass du immer die gesamte Datei durchlaufen musst, bleibt dir jedoch in keinem Fall erspart. Wenn das zunehmend zum Problem zu werden droht, solltest du dir über eine andere Datenhaltung Gedanken machen, beispielsweise eine Datenbank.
... oder eine feste Satzgröße festlegen, als eine sogenannte "Random Access Datei" benutzen.
Innerhalb des Datensatzes könnte man dann sogar noch die Feldgrößen variieren, Hauptsache, die Satzgröße bleibt gleich. Dann lässt sich der Datensatz in der Datei durch Berechnung finden und die Anzahl der Datensätze in der Datei aus der Dateigröße ermitteln.
So etwas habe ich in http://selfhtml.bitworks.de/artikel_locking/adressen.php gemacht, allerdings mit fester Satzstruktur, also auch die Datenfelder sind alle fix lang.
Allerdings kostet das dann eine Menge ungenutzten Speicherplatz auf der Festplatte, was aber heutzutage nicht mehr ganz so schlimm ist...
Aus diesen Überlegungen heraus sind dann schließlich mal die Datenbanksysteme entstanden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
... oder eine feste Satzgröße festlegen, also eine sogenannte "Random Access Datei" benutzen.
So etwas habe ich in http://selfhtml.bitworks.de/artikel_locking/adressen.php gemacht, allerdings mit fester Satzstruktur, also auch die Datenfelder sind alle fix lang.
Für den Quelltext einfach ein ".txt" an die URL dranhängen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
... oder eine feste Satzgröße festlegen, also eine sogenannte "Random Access Datei" benutzen.
So etwas habe ich in http://selfhtml.bitworks.de/artikel_locking/adressen.php gemacht, allerdings mit fester Satzstruktur, also auch die Datenfelder sind alle fix lang.
Für den Quelltext einfach ein ".txt" an die URL dranhängen.
Ist doch immer wieder interessant, mit was fürn Zeugs sich die Anderen so rumquälen ;)
Btw., hab heute auch einen Paginator verbaut
Omega
Eine Klasse 'Unicode' macht die Anwendung recht einfach (Unicode::find):
($ref, $pages) = $dbo->find($self->{QUERY}, $pg);
D.h., der Methode wird die gewünschte Seiten# mitgegeben, zurück kommt ein Array als Referenz und die Anzahl der Seiten insgesamt.
Bissl tricky ist der Bau einer Liste zum Blättern, href sollte für den Link zur aktuellen Seite ausgeblendet sein und der bisherige QUERY_STRING ist mitzuschleifen. Alles machbar ;)
Hotti
Hallo,
ich habe jetzt versucht, die verschiedenen Parts zu trennen, das Resultat ist nun folgendes:
$Ausgabe = '';
$Seite = isset ($_GET ['Seite']) ? (int) $_GET ['Seite'] : 1;
$Dateizeiger = fopen ('../Textdateien/Startseite.txt', 'r');
while (!feof ($Dateizeiger))
{
$Zeile[] = fgets($Dateizeiger);
}
fclose ($Dateizeiger);
$Anzahl_Zeilen = count ($Zeile);
$Anzahl_Seiten = ceil ($Anzahl_Zeilen / 10);
if ($Seite == 1 && $Anzahl_Seiten == 1)
{
$Link_Anfang = '<div id="Anfang_nicht_verfuegbar"></div>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<div id="Ende_nicht_verfuegbar"></div>';
}
else
if ($Seite == 1 && $Anzahl_Seiten == 2)
{
$Link_Anfang = '<div id="Anfang_nicht_verfuegbar"></div>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<a id="Ende" href="Startseite.php?Seite=2"></a>';
}
else
if ($Seite == 1 && $Anzahl_Seiten > 2)
{
$Link_Anfang = '<div id="Anfang_nicht_verfuegbar"></div>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
$Link_Vor = '<a id="Vor" href="Startseite.php?Seite=' . ($Seite + 1) . '"></a>';
$Link_Ende = '<a id="Ende" href="Startseite.php?Seite=' . $Anzahl_Seiten . '"></a>';
}
else
if ($Seite == 2 && $Anzahl_Seiten == 3)
{
$Link_Anfang = '<a id="Anfang" href="Startseite.php?Seite=1"></a>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<a id="Ende" href="Startseite.php?Seite=' . $Anzahl_Seiten . '"></a>';
}
else
if ($Seite == 2 && $Anzahl_Seiten > 3)
{
$Link_Anfang = '<a id="Anfang" href="Startseite.php?Seite=1"></a>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
$Link_Vor = '<a id="Vor" href="Startseite.php?Seite=' . ($Seite + 1) . '"></a>';
$Link_Ende = '<a id="Ende" href="Startseite.php?Seite=' . $Anzahl_Seiten . '"></a>';
}
else
if ($Seite == $Anzahl_Seiten - 1)
{
$Link_Anfang = '<a id="Anfang" href="Startseite.php?Seite=1"></a>';
$Link_Zurueck = '<a id="Zurueck" href="Startseite.php?Seite=' . ($Seite - 1) . '"></a>';
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<a id="Ende" href="Startseite.php?Seite=' . $Anzahl_Seiten . '"></a>';
}
else
if ($Seite == $Anzahl_Seiten)
{
$Link_Anfang = '<a id="Anfang" href="Startseite.php?Seite=1"></a>';
$Link_Zurueck = '<a id="Zurueck" href="Startseite.php?Seite=' . ($Seite - 1) . '"></a>';
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<div id="Ende_nicht_verfuegbar"></div>';
}
else
{
$Link_Anfang = '<a id="Anfang" href="Startseite.php?Seite=1"></a>';
$Link_Zurueck = '<a id="Zurueck" href="Startseite.php?Seite=' . ($Seite - 1) . '"></a>';
$Link_Vor = '<a id="Vor" href="Startseite.php?Seite=' . ($Seite + 1) . '"></a>';
$Link_Ende = '<a id="Ende" href="Startseite.php?Seite=' . $Anzahl_Seiten . '"></a>';
}
$Steuerung = $Link_Anfang . $Link_Zurueck . $Link_Vor . $Link_Ende;
if ($Seite == 1 && $Anzahl_Seiten == 1)
{
$Anfang = 0;
$Ende = $Anzahl_Zeilen;
}
else
if ($Seite == 1 && (($Anzahl_Seiten == 2) or ($Anzahl_Seiten > 2)))
{
$Anfang = 0;
$Ende = 10;
}
else
if ($Seite == $Anzahl_Seiten)
{
$Anfang = ($Seite * 10) - 10;
$Ende = $Anzahl_Zeilen;
}
else
{
$Anfang = ($Seite * 10) - 10;
$Ende = $Anfang + 10;
}
for ($i = $Anfang; $i < $Ende; $i++)
{
$Spalte = explode ("|", $Zeile [$i]);
$Datum = $Spalte [0];
$Inhalt = $Spalte [1];
$Ausgabe .= '<table>';
$Ausgabe .= '<tr>';
$Ausgabe .= '<td>' . $Datum . '</td>';
$Ausgabe .= '</tr>';
$Ausgabe .= '<tr>';
$Ausgabe .= '<td>' . $Inhalt . '</td>';
$Ausgabe .= '</tr>';
$Ausgabe .= '</table>';
if ($i < $Ende)
{
$Ausgabe .= '<br>';
}
}
Was meint ihr?
Kann man das so lassen?
Gruß
Enrico
Hi!
Was meint ihr?
Kann man das so lassen?
$Dateizeiger = fopen ('../Textdateien/Startseite.txt', 'r');
while (!feof ($Dateizeiger))
{
$Zeile[] = fgets($Dateizeiger);
}
fclose ($Dateizeiger);
Wenn du sowieso alles einliest, nimm file().
if ($Seite == 1 && $Anzahl_Seiten == 1)
{
$Link_Anfang = '<div id="Anfang_nicht_verfuegbar"></div>';
$Link_Zurueck = '<div id="Zurueck_nicht_verfuegbar"></div>';
$Link_Vor = '<div id="Vor_nicht_verfuegbar"></div>';
$Link_Ende = '<div id="Ende_nicht_verfuegbar"></div>';
}
Bei diesen Entscheidungen würde ich nur einfache Flags setzen, ob das Bedienelement verfügbar ist oder nicht. Wenn du hier mal irgendwann was am HTML korrigieren willst, musst du alle Stellen aufsuchen und die Änderung mehrfach vornehmen. Wenn du hingegen die stattdessen hier gesetzten vier booleschen Werte im Anschluss auswertest, hast du den Ent-oder-Weder-HTML-Code nur einmal dastehen.
Lo!
Hello,
ich habe jetzt versucht, die verschiedenen Parts zu trennen, das Resultat ist nun folgendes:
$Ausgabe = '';
$Seite = isset ($_GET ['Seite']) ? (int) $_GET ['Seite'] : 1;
hier stimmt die untere Schranke noch nicht. Es fehlt der Range-Check.
Wenn in Seite 'abc' drinsteht, ergibt (int)$_GET ['Seite'] 0.
Du solltest also entweder die 0 extra behandeln, oder die erste Seite mit 0 benennen und ggf. in der weiteren Verarbeitung (oder der Ausgabe) dann 1 addieren.
Und was ist mit negativen Seitenzahlen?
Der Range-Check sollte allerdings erst durchgeführt werden, wenn die Gesamtseitenzahl ermittelt wurde, ist also ggf. erst Aufgabe der Funktion "hole_anzeigedaten()".
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg