Arrayinhalt in Datei austauschen
xpfreund
- php
Hallo,
Ich wollte fragen, wie man das hier am besten löst:
In einer PHP-Datei steht ein Array
$schmeckt={"Bier","Sekt","Wein"}
Das soll aber in
$schmeckt={"Schnaps","Bier",Wein"}
geändert werden und in die Datei geschrieben werden.
Dabei kann der Arrayinhalt in der Länge und im Inhalt variieren.
Datei öffnen -> klar
strpos findet die Zeile, wo $schmeckt, steht.
Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.
in Datei schreiben und schließen -> auch klar
gruß aus Senftenberg am See
Mahlzeit,
ohne zu fragen, WARUM du das tun willst (erscheint mir auf den ersten Blick ziemlich merkwürdig), würde ich folgendes empfehlen:
Datei öffnen -> klar
Und anschließend die Datei zeilenweise einlesen (z.B. in ner Schleife oder in ein Array mit einer Zeile pro Element oder so).
strpos findet die Zeile, wo $schmeckt, steht.
Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.
Ganz einfach: tausch doch einfach alles hinter "$schmeckt=" bis zum Zeilenende ("\n") gegen das neue Array aus.
MfG,
EKKi
Hallo,
Mahlzeit,
ohne zu fragen, WARUM du das tun willst (erscheint mir auf den ersten Blick ziemlich merkwürdig), würde ich folgendes empfehlen:
Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung. Jetzt wollte ich ein Konfigurationsprogramm schreiben. D. h. Ich lasse sämtliche Menüpunkte in einem Array erstellen und die können dann durch das Programm das Array mit den Menüpunkten verändern.
Datei öffnen -> klar
Und anschließend die Datei zeilenweise einlesen (z.B. in ner Schleife oder in ein Array mit einer Zeile pro Element oder so).
Es wird nur ein zwei Zeilen geben.
strpos findet die Zeile, wo $schmeckt, steht.
Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.Ganz einfach: tausch doch einfach alles hinter "$schmeckt=" bis zum Zeilenende ("\n") gegen das neue Array aus.
Stimmt, dann muss ich nur noch /n dazuschreiben.
gruß aus Senftenberg am See
Hi xpfreund!
Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung.
Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.
scnr,
Benjamin
Hallo,
Hi xpfreund!
Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung.
Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.
Das war eigentlich Wasser zu Wein, aber ist egal, denn Schnaps schmeckt sowieso besser.
gruß aus Senftenberg am See
Hi,
Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.
Das war eigentlich Wasser zu Wein, aber ist egal, denn Schnaps schmeckt sowieso besser.
Jesus war auch aktiv in der Herstellung hochprozentiger Alkoholika involviert. Seine letzten[1] Worte lauten bekanntlich: "Vater, in Deine Hände lege ich meinen Geist!", was als Beweis hinreichen sollte. Später wurde dies in einem bekannten Volkslied verarbeitet: "'Schnaps!', das war sein letztes Wort, dann trugen ihn die Englein fort."
Cheatah
[1] Jaja, "es ist vollbracht", ich weiß. Er war wohl mit dem Ergebnis seiner Destillierung zufrieden gewesen.
Hallo,
Hi,
Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.
Das war eigentlich Wasser zu Wein, aber ist egal, denn Schnaps schmeckt sowieso besser.Jesus war auch aktiv in der Herstellung hochprozentiger Alkoholika involviert. Seine letzten[1] Worte lauten bekanntlich: "Vater, in Deine Hände lege ich meinen Geist!", was als Beweis hinreichen sollte. Später wurde dies in einem bekannten Volkslied verarbeitet: "'Schnaps!', das war sein letztes Wort, dann trugen ihn die Englein fort."
Cheatah
[1] Jaja, "es ist vollbracht", ich weiß. Er war wohl mit dem Ergebnis seiner Destillierung zufrieden gewesen.
Da siehst du, er hat eben auch gern mal einen gehoben.
Abgesehen davon, er hat selbst gepredigt: "Du sollst deine Feinde lieben!"
Der Alkohol war sein Feind. Also von daher...
gruß aus Senftenberg am See
Hi,
Jesus war auch aktiv in der Herstellung hochprozentiger Alkoholika involviert. [...]
Da siehst du, er hat eben auch gern mal einen gehoben.
inklusive sich selbst, aber vermutlich war er nur zu faul zum Schwimmen. Sein Sport war halt eher Basketball.[1]
Abgesehen davon, er hat selbst gepredigt: "Du sollst deine Feinde lieben!"
Der Alkohol war sein Feind. Also von daher...
Ich halte es da eher mit der Bundeswehr[2], die ihre Feinde vernichtet. Und mein ganz persönlicher Erzfeind ist eindeutig Scotch Single Malt. Ich vernichte ihn regelmäßig und mit Genuss!
[1] Ist bekannt, oder? Jesus war der erste Basketball-Spieler: Er nahm das Brot und dunkte.
[2] Die ja auch schon in der Bibel verewigt ist: "Sie trugen seltsame Gewänder und irrten planlos umher."
Cheatah
Hallo,
Da siehst du, er hat eben auch gern mal einen gehoben.
inklusive sich selbst, aber vermutlich war er nur zu faul zum Schwimmen. Ist doch logisch, wäre er sonst übers Wasser gegangen, wenn er nich so faul gewesen wäre?
Hi,
[1] Jaja, "es ist vollbracht", ich weiß. Er war wohl mit dem Ergebnis seiner Destillierung zufrieden gewesen.
Da siehst du, er hat eben auch gern mal einen gehoben.
Abgesehen davon, er hat selbst gepredigt: "Du sollst deine Feinde lieben!"
Der Alkohol war sein Feind. Also von daher...
Mensch, bedenke! Bedenke wohl,
Dein größter Feind ist Alkohol!
Doch in der Bibel steht geschrieben:
Deine Feinde sollst Du lieben!
cu,
Andreas
echo $begrüßung;
Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung. Jetzt wollte ich ein Konfigurationsprogramm schreiben. D. h. Ich lasse sämtliche Menüpunkte in einem Array erstellen und die können dann durch das Programm das Array mit den Menüpunkten verändern.
Für den Zweck würde ich das Array serialisieren und das in einer Datei ablegen. Mit den Umkehrfunktionen (file_get_contents() und unserialize()) hast du wieder ein Array. Noch etwas Fehlerbehandlung drumrum - schließlich kann ja jemand auf die Idee kommen, den Dateiinhalt per Hand zu versau... ähm bearbeiten, was zu einen nicht erfolgreichen unserialize() führen kann - fertig.
echo "$verabschiedung $name";
Hello,
[...] in einer Datei ablegen. Mit den Umkehrfunktionen (file_get_contents() [...]
sind ohne weitere Maßnahmen (Krücken) ungeeignet für die Behandlung konsistenter Daten.
Beides sind namensbasierte Funktionen und unterliegen damit leider nicht den Lockingmechainsmen für mandantory oder advisory Filelocking.
Ich konnte bisher nicht erkennen, dass die PHPler das repariert hätten.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
echo $begrüßung;
[...] in einer Datei ablegen. Mit den Umkehrfunktionen (file_get_contents() [...]
sind ohne weitere Maßnahmen (Krücken) ungeeignet für die Behandlung konsistenter Daten.
Beides sind namensbasierte Funktionen und unterliegen damit leider nicht den Lockingmechainsmen für mandantory oder advisory Filelocking.
Das ist soweit richtig. Die Frage ist nur, wie relevant das für das konkrete Projekt ist. Es scheint sich sich um ein Administrationstool zu handeln. Das heißt, ein Admin wird alle Jubeljahre mal eine Änderung vornehmen wollen. Vielleicht auch öfter, aber wie oft wird es vorkommen, dass zwei Admins zur selben Zeit diesen Vorgang ausführen wollen? Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.
echo "$verabschiedung $name";
Hello,
Das ist soweit richtig. [...] Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.
warum, eine vernünftige und konsequente Impelementation JETZT GLEICH einzuführen, ist doch unwesentlich komplizierter.
Da man aus den fraglichen Abschnitten Funktionen machen kann, die man immer wieder verwenden kann (M$ macht soweas seit 1980), sollte man sich lieber jetzt die Stunde Zeit nehmen, als später 1000fach die 12 bis 25 Minuten für "warum geht das jetzt schief?"...
siehe Thread https://forum.selfhtml.org/?t=160412&m=1043325
Sollte der OP an einer nachhaltigen Umsetzung interessiert sein, können wir die notwendigen Funktionen gerne in diesem Thread gemeinsam entwickeln.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
echo $begrüßung;
Das ist soweit richtig. [...] Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.
Da ich wenig mit Dateien arbeite, gab ich dir recht, ohne das weiter nachzuprüfen. Doch nun begab ich mich nochmel ins Handbuch.
warum, eine vernünftige und konsequente Impelementation JETZT GLEICH einzuführen, ist doch unwesentlich komplizierter.
Was ist eigentlich mit dem Flag LOCK_EX, das man bei file_put_contents() setzen kann?
echo "$verabschiedung $name";
Hello,
Was ist eigentlich mit dem Flag LOCK_EX, das man bei file_put_contents() setzen kann?
Das war mir zwar auch entgangen, dass es das jetzt gibt (seit Version 5.1), aber es nützt hier nichts.
Zum verlustfreien Bearbeiten von Daten muss der gesamte Lese- und Scheibprozess mit einem gemeinsamen EXCLUSIVE LOCK geschützt werden.
Um sicherzustellen, dass keine Überschneidungen mit anderen Prozessen stattfinden, muss zum Zwecke der _sofortigen_ Veränderung nebst Wegschreiben auch der Prozess des Holens im LOCK_EX-Zeitabschnitt stattfinden. Dadurch wird der Prozess der Datenveränderung "Atomar".
Mit file_get_contents() und file_put_contents() ist dies nicht möglich, da sie immer auf zwei Prozesse verteilt bleiben werden. Dies ermöglicht immer einem dritten Prozess das Eindringen in die zeitliche Abfolge.
Anstelle der von mir benutzten Variante mit "a" kann man auch "x" benutzen, muss dann aber den Fehler auswerten.
Im Prinzip ist advisory Locking, dass ja immer mit einem seperaten Lockbefehl nach dem fopen() arbeitet, immer noch eine relativ störanfällige Methode. Mandatory Locking (von System36 / AS400 auf die PCs und ELS2 von NOVELL übertragen), ist wesentlich sicherer.
Hier werden die Anforderungen im OS-Kern für das Filesystem gebündelt. Man fordert also ein fopen gleich mit dem Attribut SINGLE_OPEN (Kompatibility Mode), SHARED, LOCK_SH oder LOCK_EX an, wobei SHARED nur bedeutet, das keine einschränkenden Attribute gesetzt sind.
Es hat also auch KEINEN Sinn,
------
<-----------+
die Datei zu öffen |
mit LOCK_SH zu versehen |
|
auszulesen | Dieser gesamte Bereich ist noch gefährdet,
die Daten zu verändern | dass weitere Prozesse dasselbe beginnen.
|
ein LOCK_EX anzufordern <-----------+
die Daten wegzuschreiben
die Datei zu schließen und zu entsperren
<------------ und dann ggf. erst hier ein eigenes
LOCK_EX anfordern
um Daten zurückzuschreiben
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hallo,
Das ist soweit richtig. Die Frage ist nur, wie relevant das für das konkrete Projekt ist. Es scheint sich sich um ein Administrationstool zu handeln. Das heißt, ein Admin wird alle Jubeljahre mal eine Änderung vornehmen wollen. Vielleicht auch öfter, aber wie oft wird es vorkommen, dass zwei Admins zur selben Zeit diesen Vorgang ausführen wollen? Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.
Du hast es erfasst. Es wird definitiv nur einen Administrator geben und das ist der Kunde selbst. Es geht einfach darum, ihm die einfache Möglichkeit zu geben, über das Tool frei Menüpunkte hinzufügen und entfernen zu können und in dem Zusammenhang auch weitere Seiten hinzufügen kann. Da man bei der Seite getrost auf w3c verzichten kann, werden die Texte einfach von Word als Html includet.
gruß aus Senftenberg am See
Hi xpfreund!
Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.
Ich würde versuchen, mittels Regulären Ausdrücken einfach den Text zwischen { und } zu ersetzen. Sofern ich das richtig verstanden habe, also egal was da steht, es soll mit
"Schnaps","Bier",Wein"
ersetzt werden?
mfG
Benjamin
Hallo,
Hi xpfreund!
Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.
Ich würde versuchen, mittels Regulären Ausdrücken einfach den Text zwischen { und } zu ersetzen. Sofern ich das richtig verstanden habe, also egal was da steht, es soll mit
"Schnaps","Bier",Wein"
ersetzt werden?
Es soll mit irgendwas gefüllt werden. Sozusagen: "Inhalt ungewiss".
Das kommt aus Eingabefeldern.
gruß aus Senftenberg am See
Hello,
Ich wollte fragen, wie man das hier am besten löst:
In einer PHP-Datei steht ein Array
$schmeckt={"Bier","Sekt","Wein"}
Das ist aber ein String, wenn das dort so drinsteht.
Wenn ein Array drinstehen würde, hätte ich es zumindest serialisiert.
Im Folgenden lasse ich die Fehlerkontrollen weg, weise aber darauf hin, dass diese
notwendig sind. Wenn man die Blöcke zu Funktionen vervollständigt kann man sie leicht
einbauen!
Erzeugen:
$_schmeckt = array{"Bier","Sekt","Wein"}; ## Array erzeugen
$stream = serialize($_schmeckt); ## Stream daraus machen
$fh = fopen($dateiname, 'w+'); ## Datei öffen
flock ($fh, LOCK_EX); ## Datei sperren
frite($fh, $stream); ## Datei schreiben
fclose($fh); ## Datei schließen und entsperren
Austauschen:
$fh1 = fopen($dateiname, 'a'); ## Datei erzeugen, falls nicht vorhanden
flock ($fh1, LOCK_SH); ## Datei mit Sperre gegen Schreibsperre belegen
$fh2 = fopen($dateiname, 'r+'); ## Datei zum Lesen und Schreiben öffnen
flock ($fh2, LOCK_SH); ## Ebenfalls Sperre gegen Schreibsperre setzen
fclose($fh1); ## ggf. neu erzeugte Datei frei geben (schließen)
flock ($fh2, LOCK_EX); ## Sperre auf Schreibsperre 'upgraden'
$fsize = filesize($dateiname); ## Dateigröße holen
$stream = fread($fh2, $fsize); ## Datei auslesen
$_schmeckt = unserialize($stream); ## Stream in Array zurückverwandeln
### Manipulationen am Array durchführen ## Hier das Array verändern
$stream = serialize($_schmeckt); ## Array wieder in Stream umwandeln
fseek($fh2, 0, SEEK_SET); ## Datensatzzeiger zurück auf Anfang
fwrite($fh2,$stream); ## verändertes Array wegschreiben
ftruncate($fh, strlen($strem)); ## Dateilänge anpassen auf veränderten Inhalt
fclose($fh); ## Datei schließen und freigeben.
Solange ein Dateihandle ein LOCK_SH hält, kann kein anderes ein LOCK_EX erhalten, aber beliebig viele sich zusätzlich auf das LOCK_SH aufschalten. LOCK_SH ist also eine Sperre gegen die Schreibsperre. Wenn ein Dateihandle als einziges ein LOCK_SH hält, kann es diese zum LOCK_EX (also zur vollwertigen Sperre) erweitern.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom