• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

array_push in PHP

stonie10

Welscher Taubenapfel
Registriert
31.10.05
Beiträge
760
Hallo zusammen :)

Ich bin dabei, ein kleines Script in PHP zu schreiben und habe jetzt ein kleines Problem:
Ich habe in Datei 1 ein Array:
Code:
$test=array(1=>"a", "b", "c");

So, über ein Formular möchte ich diesem Array nun einen Wert (z.B. "d") hinzufügen. Also setze ich die Funktion array_push ein:
Code:
include "file1.php";
array_push($test, "d");

Über ein echo $test[4] kann ich diesen (hinzugefügten) Wert dann auch erfolgreich ausgeben lassen. Soo, und jetzt kommt meine Frage ;)

Diesen Wert "d" scheint PHP nur für die aktuelle Runtime dem Array hinzuzufügen, ich hätte aber gerne, dass in die Datei (file1.php, welches das Array beinhaltet), der neue Wert geschrieben wird. Versteht ihr was ich meine? :eek:

Der Inhalt der Datei file1.php soll nach dem Aufruf des array_push so aussehen:
Code:
$test=array(1=>"a", "b", "c", [B]"d"[/B]);

Hat vielleicht jemand eine (möglichst einfache ;)) Lösung parat?

Schonmal Danke im Voraus :-*

Grüße,
stonie10
 

Hobbes_

Gast
Das ist nicht erstaunlich. Alle Variablen werden nur zur runtime aufrechterhalten.

Es gibt verschiedene Lösungsmöglichkeiten, wie Du die Daten speichern kannst (je nach Verwendungszweck und Kenntnissen aufwendiger oder weniger).

Eine einfache Variante wäre das speichern und laden des Arrays in einer einfachen Textdatei. Dazu benötigst Du im angegebenen Ordner jedoch Schreibrechte. Eine grundsätzlich praktische Funktion für beliebige Variablen (also auch Objekte oder Arrays) stellt serialize() mit dem Compagnon unserialize() dar.

Ein Beispiel gar für ein fixfertiges counter-Objekt ist auf php.net dargestellt (Link), wobei es dort m.E. noch einige kleine Fehler drin hat.

Eine einfache Variante zum testen (aus obgenanntem Grund ohne Objekt):
Code:
<?
// start --> load array
$array_filename ="dummy.txt";
if file_exists($array_filename)
{
  $test=unserialize(file_get_contents($array_filename));
}
else
{
  $test=array(); // set your presets here in this line
}


// work

// use your array $test as you like


// end --> save array
if($f = @fopen($array_filename,"w"))
{
  if(!@fwrite($f, serialize($test)))
  {
     die("Could not write to file ".$array_filename);
  }
  @fclose($f);
}
else die("Could not open file ".$this->filename." for writing");
?>

Tja, soweit ein rascher Vorschlag. Kann es im Moment gerade nicht testen --> Anpassung des Codes gem. Feedback. Denke daran, dass Du den Filenamen passend definierst (meist optimal absolute Adressierung mit ebenso Einschluss des Pfades zu Deinem www-Bereich) und dass das angegebene Verzeichnis für Schreibrechte freigegeben ist.
 
Zuletzt bearbeitet von einem Moderator:

stonie10

Welscher Taubenapfel
Registriert
31.10.05
Beiträge
760
So, ich habs jetzt hinbekommen :)
Dein Skript funktioniert wunderbar, ich kann Werte in das Array hineinschreiben und auch wieder auslesen. Perfekt :-D

Ich hätte da nur noch eine kleine Frage: Das Array, welches sich in der Textdatei befindet, sieht etwas "seltsam" aus:

Code:
a:3:{i:0;s:9:[B]"Eintrag 1"[/B];i:1;s:15:[B]"zweiter Eintrag"[/B];i:2;s:20:[B]"und noch ein Eintrag"[/B];}

Diese Art von Array habe ich bisher noch nie gesehen. Es gibt nicht zufällig eine Möglichkeit, ein Array alà array("1","2"); da reinzuschreiben oder?
Nicht, dass das jetzt unbedingt notwendig wäre, mein (bzw. dein) Skript funktioniert ja auch so, es würde anders eben nur ein wenig schöner aussehen ;) (und es wäre einfacher für mich, Werte von Hand einzutragen)

Grüße,
stonie10
 

southpole2004

Gast
a:3:{i:0;s:9:"Eintrag 1";i:1;s:15:"zweiter Eintrag";i:2;s:20:"und noch ein Eintrag";}
die bedeutung ist ganz einfach:

a:3: dein Array hat 3 einträge
i:0;s9: dein Eintrag 0 ist 9 Zeichen lang
"Eintrag 1" ist dein Wert

der Rest klärt sich von selbst. Dein Array (a:3) ist mit { } eingeklammert.
Es ist halt nur eine andere Darstellung eines arrays. serelize ist eine sehr schöne PHP-funktion, mit der man viele sinnvolle dinge machen kann.

MFG

Marcel
 

Hobbes_

Gast
So, ich habs jetzt hinbekommen :)
Dein Skript funktioniert wunderbar, ich kann Werte in das Array hineinschreiben und auch wieder auslesen. Perfekt :-D

Ich hätte da nur noch eine kleine Frage: Das Array, welches sich in der Textdatei befindet, sieht etwas "seltsam" aus

Ich freue mich, dass es funktioniert. Hatte eben keine Möglichkeit es vorher zu testen.

Du hast schon Recht. Die Datei sieht etwas ungewohnt aus und wurde bereits durch southpole2004 erklärt. Das liegt an der Funktion serialize(). Diese ist mit dem einfachen Speichern eines Arrays eigentlich unterfordert. Mit ihr kannst Du wesentlich kompliziertere Konstruktionen und auch Objekte speichern und dann wieder laden. Deshalb sind einige Meta-Informationen in der Datei gespeichert, die Du beim Lesen der Textdatei siehst.

Wie oben bereits beschrieben gibt es verschiedene Möglichkeiten, die Daten zu speichern. Aufgrund der von Dir angegebenen Spezifikationen habe ich die einfachste und auch sehr flexible Variante mit serialize() gewählt. Andere Optionen sind
  • Manuelles Speichern des Arrays als Liste (Text): Bau beim Lesen und Speichern eine einfache Schleife ein, die entweder das Array ausliest und in eine Datei schreibt (Vorschlag 1 Item pro Zeile) und beim Lesen wieder in ein Array umwandelt. Alternativ kannst Du auch die Funktionen implode() und explode() interessant sein :) Probier mal folgende Ersetzungen (ach ja, dazu solltest Du einen neuen Dateinamen verwenden, da die beiden Dateitypen inkompatibel sind):
    Code:
    $test=unserialize(file_get_contents($array_filename));
    // dadurch ersetzen
    $test=explode("\n", file_get_contents($array_filename));
    
    //---------
    
    if(!@fwrite($f, serialize($test)))
    // dadurch ersetzen
    if(!@fwrite($f, implode("\n", $test)))
  • Gerade wenn du jedoch grösseres mit diesen Daten vorhast und sie später evtl noch sortieren oder andersweitig bearbeiten möchtest, empfehle ich eine frühzeitige Beschäftigung mit einer Datenbank (v.a. MySQL, die ebenso wunderbar aus PHP bedienbar ist). Damit machst Du gleich Nägel mit Köpfen, ohne später mühsam die Dateien umschreiben zu müssen oder andere probleme immer von Hand zu lösen (siehe unten).
Bsp: je nach Workload Deiner Webseite könnte das Speichern und Lesen dieser Parameterdatei wie mit serialize() oder manuellem Array ein Problem darstellen. Ab einem gewissen Workload kann die Datei nicht mehr einfach so zum schreiben geöffnet werden, da sie durch einen anderen Aufruf des PHP-files gerade selbst geschrieben wird oder gelesen wird. Dann kommt es zu nicht immer voraussehbarem Verhalten der Seite und zu Datenverlust. Solche Dinge können Dir mit einer sauberen Datenbankimplementation nicht passieren. Alternativ kannst Du ein Lock/Unlock-System implementieren, wie es auch von Multitasking-Systemen angewandt wird :)

Ein anderes Problem bei jeder Datenspeicherung ist die Sicherheit, die es zu beachten gilt: Wenn Du Benutzereingaben in irgendwelcher Form speicherst, so musst Du sicherstellen, dass sie weder für Deinen Server noch später für den Client bei der Ausgabe gefährlich sein können. Ein Lesen der Sicherheitsseiten auf php.net und einschlägigen Webseiten lohnt sich. eines der Stichworte ist das escapen von unerwünschten Zeichen :)

Deshalb: Der obenstehende Vorschlag war nur ein kurzer funktionierender Start in die Welt des interaktiven Web-Projekts. Einiges - doch interessantes - kommt noch auf Dich zu... Viel Erfolg!
 
Zuletzt bearbeitet von einem Moderator:

stonie10

Welscher Taubenapfel
Registriert
31.10.05
Beiträge
760
Danke euch beiden, soutphole2004 und psc :)

@psc
Wow, was soll ich sagen... geil :-D
Ich werde mir deine Tipps zu Herzen nehmen und mal ein wenig damit "experimentieren" ;) Das mit dem multiplen Zugriff auf eine Datei dürfte bei meinem Skript im Moment noch kein Problem darstellen, da es wirklich nur ein Mini-Skript ist und das Array lediglich ein paar Zahlen beinhaltet :)

Im Moment stehe ich aber noch recht am Anfang, was PHP angeht. Ich werde auf jeden Fall einmal versuchen, das ganze mit MySQL zu realisieren (zumal ich lokal alle notwendigen Komponenten besitze und auch ein PHP+MySQL Buch hier rumliegen habe). ;)

Nochmal vielen Dank psc! :)

Grüße,
stonie10