2 Dimensionales Array an php-skript übergeben



  • Hi Leute,
    Ich hab hier ein kleines Problem:
    Ich lese in einem PHP-Skript eine Datei aus, die der User angegeben hat. Diese ist folgendermaßen aufgebaut:
    Wert1a;Wert2a;Wert3a;Wert4a
    Wert1b;Wert2b;Wert3b;Wert4b

    Also ein Excelfile welches in eine Textdatei exportiert wurde.

    OK, mein Skript liest also diese Datei aus und zeigt das alles schön formatiert an. Der User soll jetzt die Möglichkeit besitzen die einzelnen Datensätze zu löschen oder zu bearbeiten. Dazu habe ich hinter jedem Datensatz zwei Links. Nur was muss ich mit diesen Links jetzt machen? Wenn ich dort ein weiteres PHP-Skript aufrufe, habe ich das Problem, dass ich nicht an die eingelesenen Daten komme ... Und eine andere Möglichkeit fällt mir nicht ein.
    Ich komme deshalb nicht an die Daten, weil ich kein 2D-Array ohne weiteres übergeben kann. Eine andere Möglichkeit, welche ich mir überlegt habe, wäre, die Daten einfach wieder in die Datei zu schreiben. Das funktioniert aber nicht, da die Datei nur temporär auf dem Server ist und wieder gelöscht wird, wenn die Seite verlassen wird (oder sogar schon früher?). Eine eigene temporäre Datei anlegen, die ich selbst löschen muss, ist auch keine alternative, weil ich nicht weiss, wann ich die löschen muss. Der Benutzer kann die Website ja einfach schliessen ...
    Ich hoffe, ihr könnt mir bei diesem Problem weiterhelfen. Danke



  • Die sinnvollste und eleganteste Möglichkeit wäre, im Link die "Koordinaten" (also Zeilen- und Spaltenindex) des zu löschenden Eintrages zu übergeben. Dann kann dein Script beim nächsten Aufruf die Datei öffnen, einlesen, den entsprechenden Eintrag öffnen und die Datei wieder speichern.

    Ich würde davon abraten, immer alle Daten komplett wieder 'zurückzuübergeben', da dies unnötigen Traffic bedeutet.



  • Das geht leider nicht, habe ich oben schon geschrieben. Die Datei gibt es nicht mehr, weil sie doch temporär ist.



  • Was nützt es dann aber dem Nutzer, die Daten zu verändern, wenn dies sowieso nicht von Dauer ist. Aber wenn du die Daten aufbereitest, sollte es dir doch auch möglich sein, sie auf dem Server zu speichern.

    Letzte Möglichkeit wäre, zwei Delimiter einzusetzen, also z.B. ';' um die Spalten voneinander zu trennen und '|' für die Zeilen.



  • ok, ich versuche es nochmals zu erklären:
    Der User wählt eine Datei aus (<inpute type = "file">), diese wird automatisch hochgeladen, wenn er den submit-button drückt (enctype="multipart/form-data" im form-tag). Allerdings ist das eine temporäre Datei! Ich lese diese Datei im nächsten Skript aus, bereite die Daten auf (stelle sie in einer Tabelle dar) und setze hinter jede Zeile zwei Links zum bearbeiten und zum löschen. Und unten kommt dann ein Button "In Datenbank übernehmen". Der User hat also schon die Möglichkeit die Daten zu speichern, aber bis er sich dazu entschieden hat, liegen die Daten nur im Speicher vor, da die temporäre Datei nach dem Auslesen wieder gelöscht wird. Diese gesamten Daten in einen String mit zwei Delimitern zu schreiben ist absolut keine Option, da das gut und gerne mehrere (hundert) Kilobyte sein können.
    Es wäre mir natürlich ein leichtes, diese von PHP angelegte temporäre Datei auf dem Server zu speichern, so dass sie auch bleibt, nachdem ich sie ausgelesen habe. Hierbei ergibt sich aber das Problem, dass der User die Website einfach verlassen kann (Browser schließen, andere Seite öffnen) und ich dann diese Datei auf meinem Server habe, obwohl sie garnicht mehr benötigt wird.

    Gibt es denn die Möglichkeit globale Variablen anzulegen, die unabhängig von der PHP-Datei sind? Die globalen Variablen, die ich kenne, sind nur in einer php-Datei verfügbar, wenn ich diese Datei jetzt z.b. neu lade, werden die Variablen wieder zurückgesetzt...



  • dEUs schrieb:

    Es wäre mir natürlich ein leichtes, diese von PHP angelegte temporäre Datei auf dem Server zu speichern, so dass sie auch bleibt, nachdem ich sie ausgelesen habe.

    Genau das dürfte aber deine einzige Chance sein. Von mir aus auch in einer MySQL-Datenbank. Um am Ende nicht durch Datenmüll zu sterben, solltest du eine Art Timeout einbauen, also Dateien, die z.B. älter als eine Stunde sind wieder löschen.

    dEUs schrieb:

    Gibt es denn die Möglichkeit globale Variablen anzulegen, die unabhängig von der PHP-Datei sind?

    Meines Erachtens nach nicht. Du könntest es höchstens mit Hilfe von Sessions versuchen. Aber da werden am Ende auch nur Textdateien auf dem Server angelegt. Kannst dir aber dann das ganze Management sparen. Cookies sind keine Alternative, weil da ja auch die Daten immer wieder neu übertragen werden müssen.

    Also kurz zusammengefasst: Entweder Sessions oder doch eine eigene Textdatei.



  • Danke für deine Vorschläge. Ich hatte ja gehofft, dass ich mit meinen 2 Tagen PHP-Erfahrung was übersehen habe *g* scheint aber nicht der Fall zu sein. Dann werde ich vermutlich das mit der eigenen temporären Datei und dem TimeOut machen.

    Falls doch noch jemand weiss, wie ich die Daten einfach im Speicher behalten kann, wäre ich sehr dankbar, dieses ständige ein- und auslesen und parsen der Datei ist nämlich extrem unperformant ...



  • es geht.

    Du musst ne Session machen.
    Und falls du kannst, bau dir ne klasse die die Daten
    reihen übernimmt. in einer 2. Klasse speicherst
    du dann ein array der ersten. du hast also deine Daten
    in dieser 2. Klasse liegen. Diese schiebst du
    nun in eine Session, von da aus kannst du in der
    im nächsten Skript daraufzugreifen, und diese anzeigen etc.

    Devil



  • Kannst du das mal bitte so erklären, dass ich's auch kapier? 🙂 🙂



  • dEUs schrieb:

    Kannst du das mal bitte so erklären, dass ich's auch kapier? 🙂 🙂

    Gerne.
    Also, du baust dir ne php klasse:

    class row
    {
    var feld1;
    var feld2;
    function row($feld1,$feld2,...)//konstruktor
    {
     $this->feld1 = $feld1; //usw
    } ...
    }
    

    Die Dient jetzt als Container für deine Excel tabelle,
    bzw. nimmt jeweils ne Zeile davon auf.

    Dann machst du dir ne 2.Klasse:

    class dataholder
    {
    var myarray = array();
    function dataholder()
    {/*tu was sinnvolles im konstruktor ;) */}
    function insert($value)
    {
    myarray[]=$value;
    }
    }
    

    Jetzt hast du in dataholder ein array aus row objekten, welche jeweils
    die Daten aus einer zeile in der excel tabelle halten.
    Jetzt musst du das nur noch in ne Session packen... 😉

    session_start();
    if(!isset("filename"))
    {//session existiert noch nicht
       $_SESSION["filename"]=new dataholder();
       $_SESSION["filename"]->insert(new row("feld1",usw.));
    }
    

    so, das ist jetzt erstmal so aus dem Kopf, keine garantie dafür,
    ich hab aber gerade so ein Menu in PHP realisiert, wo ich
    auch von mehreren Skripten darauf zugreife, müsste also umsetzbar sein.

    evtl. hilft dir auch www.php.net/suchbegriff weiter.

    Devil



  • Und um das Löschen muss ich mich überhaupt nicht kümmern? Muss ich in der URL irgendeine SessionID mitliefern? Oder kann ich für filename zb die ID des Users verwenden und mir somit das übermitteln der SessionID sparen?



  • normal wird die SessionID als Cookie gespeichert (start_session muss vor der ersten Ausgabe stehen (auch keine Leerzeichen vorher ausgeben)). Allerdings akzeptieren nicht alle Benutzer Cookies, weshalb es dann zwei Möglichkeiten gibt. Wurde der PHP Server entsprechend konfiguriert, hängt er die SessionID automatisch an jeden internen Link ran. Wenn nicht, muss du das manuell machen.

    dazu: http://de3.php.net/manual/de/ref.session.php#session.idpassing



  • Tut super mit Sessions 🙂 Danke!


Log in to reply