PHP Dateizeiger ändern

david19

Cadet 1st Year
Registriert
Mai 2013
Beiträge
10
Huhu Forum. Ich habe mit
Code:
file_put_contents('myfile.txt', array($component1,PHP_EOL,$component2));
ein myfile.txt erstellt. In diesem File sind jetzt 2 Componenten drin.
Code:
hund
katze

Ich kann die erste Zeile so auslesen:

Code:
'COMPONENT1' => fgets(fopen('myfile.txt','r')),
Das ergibt: "hund"

Jetzt möchte ich aber nur die zweite Zeile auslesen. Also ohne eine "while" oder "for" Schleife.
Das 'r' sorgt dafür, dass der Dateizeiger immer zum Anfang springt und deshalb klappt das nicht.
Ich habe gelesen das ich mit dem "offset"(Dateizeiger) rum spielen kann, aber ich bekomme es nicht hin:(
Schon den ganzen Tag versuche ich das zu lösen. Habe es auch schon mit einer "json" versucht, leider ohne Erfolg.
 
Sowas ist grundsätzlich nicht möglich. fopen geht direkt ans Betriebssystem und gibt dir ein Filehandle. Der interne Zeiger steht auf dem Anfang der Datei, du kannst mit fseek auch zu einem beliebigen anderen Byte in der Datei springen.

Nicht möglich ist es eine bestimmte Zeile vom Betriebssystem zu verlangen. Das ist dem Betriebssystem völlig egal was für ein Inhalt in deiner Datei steht. Eine "Zeile" ist erstmal nichts besonderes außer das sie durch ein bestimmtes Byte (\n) getrennt sind. Das Dateisystem müsste Buch darüber führen bei welchem Byte welche Zeile anfängt, das wäre Firlefanz, weil die meisten Dateien ja gar keinen Text und somit auch keine Zeilen enthalten.

fgets ist so implementiert dass es so lange bytes in einen string kopiert bis es ein \n (LF) Zeichen findet. Wenn du fgets auf dem gleichen Filehandle nochmal aufrufst bekommst du eine weitere Zeile, u.s.w.

Alternativ auf einen Schlag komplett einlesen und in ein Array umwandeln:
PHP:
$lines = explode("\n", file_get_contents("myfile.txt"));
Dann kannst du auf die einzelnen Zeilen per index zugreifen.
 
  • Gefällt mir
Reaktionen: david19
Hi,

oder man nutzt - wenn man Daten strukturiert ablegen will - ein dafür designiertes Konstrukt wie eine Datenbank.

VG,
Mad
 
  • Gefällt mir
Reaktionen: kim88, Lawnmower, david19 und eine weitere Person
Danke, euch beiden für die Antworten.
@Marco01_809 Ich versuche das mal, besten dank.
@Madman1209 Ich verwende deshalb keine Datenbank, weil es zu viele Querys werden. Da es im Backend ist, kann ich kein Cache verwenden. Es ist ein kleiner Page Builder mit PHP bzw. Laravel und VUE.JS. Durch File_put_content kann ich eine Form verschicken, mit allen Layouts drin. Anschließend wird das .txt File noch in der Config.php verlinkt. Mit dieser Methode hatte ich mir letzes Jahr einen kleinen "Theme Switcher" gebaut. Einfach auf "Submit" geklickt, und schon war das neue Design da :) Sobald die Schnittstelle in der Config.php drin, funzt es :)
Falls es nicht klappt, gibt es noch die Möglichkeit wie du schon sagst "Datenbank". STORE Arrays & JSON. Aber das frisst bestimmt viel Ladezeit. Aber ich weiß es nicht, muss erst noch testen.
Diese Ganzen Spielerein sind mega geil zum lernen :D
 
Zuletzt bearbeitet:
Hi,

wieso sollten es mehr Queries werden als du jetzt auch schon nutzt? Ob du auf eine Datei zugreifst oder dir einen Datensatz holst ist doch beides eine Query. Mit dem Unterschied, dass du nicht auf Dateisystemebene immer die komplette Datei öffnen und durchsuchen musst, sondern dir gezielt in der Datenbank das holen kannst was du möchstest.

Dateien gehören in ein Dateisystem, Daten in eine Datenbank. Beide haben ihre Daseinsberechtigung und beide haben massiv ihren Sinn.

Daten in einer Datei abzulegen und die dann zu parsen ist - mit Verlaub - Steinzeit und in keiner Weise eine optimierte herangehensweise.

Ich sehe in deinem oben aufgeführten Beispiel nichts, was mit einer Datenbank nicht klappen würde - warum auch? Du benutzt die Dateien ja wie eine Datenbank, aber eben mit allen Nachteilen, die Dateien dafür mitbringen.

VG,
Mad
 
  • Gefällt mir
Reaktionen: david19 und DubZ
david19 schrieb:
@Madman1209 Ich verwende deshalb keine Datenbank, weil es zu viele Querys werden.
Ich dachte genau aus dem Grund nutzt man eine Datenbank.

Da es im Backend ist, kann ich kein Cache verwenden.
Wie meinst du das? Was im Backend ist, wo soll dein Cache sein?
Also die Datenbank im Backend hat vermutlich selbst einen Cache...

Falls es nicht klappt, gibt es noch die Möglichkeit wie du schon sagst "Datenbank". STORE Arrays & JSON. Aber das frisst bestimmt viel Ladezeit. Aber ich weiß es nicht, muss erst noch testen.
Und deine Datei-Operationen nicht? Die kann das Betriebssystem zwar auch Cachen, aber das dürfte dabei deutlich weniger intelligent vorgehen als die Datenbank. Und wenn du eine Entscheidung rein aufgrund erwarteter Performance triffst, hilft nichts außer messen.

Diese Ganzen Spielerein sind mega geil zum lernen :D
Und was lernst du, wenn du umständlich mit den Dateien rumhantierst? Ist zwar nett, hab ich auch schon mal vor 20 Jahren alles irgendwie so gemacht, aber es gibt denke ich wertvolleres, was man lernen kann.
 
  • Gefällt mir
Reaktionen: david19
Ihr habt recht mit der Datenbank. Vielleicht mache ich wieder alles nur zu komplizert. By the way, ich weiß gar nicht wie das die großen Pagebuilder machen. Ich glaube die speichern auch alle Values in der Datenbank bzw eine Spalte mit Json.
tollertyp schrieb:
Wie meinst du das? Was im Backend ist, wo soll dein Cache sein?
Also die Datenbank im Backend hat vermutlich selbst einen Cache...
Das Backend wird nicht gechached, nur das Frontend. Das hatte ich gemeint. Entweder File Cache, oder Memory Cache mit Redis. :)
Ich verstehe nicht wieso meine Beiträge immer freigeschaltet werden müssen. Bin doch kein Spammer :D
 
Zurück
Oben