kostenloser Webspace werbefrei: lima-city


Hilfe mit Gästebuch!

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sexyteamlp

    sexyteamlp hat kostenlosen Webspace.

    Also, das muss recht schnell gehen. Ich soll ein Gästebuch erstellen und vorerst folgendes tun (PHP):

    wir haben eine Gaestebucheintrag.txt, in der die Kommentare stehen sollen.

    $teststring = file ("Gaestebucheintrag.txt");
    $test = array ();
    $teststring = explode(";", $teststring);

    So lade ich das file und wollte es durch explode trennen, also anstatt

    Dex/qwe@gmx.de/Beitrag

    sollte es

    Dex
    qwe@gmx.de
    Beitrag

    sein.

    Das klappt, solange statt Gaestebucheintrag.txt Dex/qwe@gmx.de/Beitrag steht, aber jetzt nicht mehr.

    Am Schluss kommt noch

    echo "<pre>"; print_r($teststring); echo "</pre>";

    damit man alles sehen kann und es hatte geklappt, nun aber nicht mehr mit der .txt.

    Das hier steht nun in der Textdatei:

    Dex;rathalos94@gmx.de;Testkommentar
    User2;test@test.de;Test Test test und nochmal test
    User56;test@test.de;Lalalal blababab

    Ihr seht, es soll auch nicht nur eine Sache getrennt werden, sondern gleich 3.


    Bitte bitte helft mir :(
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. n******t

    Du solltest die Fehlermeldungen bei dir lokal aktivieren, dann wäre dir aufgefallen, dass explode() einen String erwartet:
    Warning: explode() expects parameter 2 to be string, array given
    Also solltest du statt file() file_get_contents() nehmen oder da irgendwie anders vorgehen. Ich weiß jetzt auch nicht genau wie aber vllt. mit einem Array in einem Array. Ich schau mir das nochmal an vllt. finde ich noch ne Lösung.

    MfG
    Dominic

    Edit:
    <?php
    $teststring = file("gaestebucheintrag.txt");
    // Wir lesen die Datei in ein Array
    
    for ($i=0;$i<count($teststring);$i++){ 
    // Mit count() bekommen wir die Anzahl der Zeilen der Datei
    	$teststring[$i] = explode(";", $teststring[$i]);
    	// So viele Zeilen es gibt, so oft werden wir auch aus den bestehenden Arrayeinträgen neue Arrays machen (also ein Array im Array)
    }
    echo "<pre>"; print_r($teststring); echo "</pre>";
    ?>


    Beitrag zuletzt geändert: 7.8.2012 17:04:54 von naturfit
  4. g****e

    Du kannst die Trennzeichen aufwendiger machen, sodass sie Textfremd sind. Speicher in dem Textfile die Daten mal in solch einem Format:

    Dex{|[:]|}rathalos94@gmx.de{|[:]|}Testkommentar{|[;]|}
    User2{|[:]|}test@test.de{|[:]|}Test Test test und nochmal test{|[;]|}
    User56{|[:]|}test@test.de{|[:]|}Lalalal blababab{|[;]|}

    So, dann mit
    $c = file_get_contents( "guestbook.txt" );
    $inserts = explode( '{|[;]|}' , $c , -1 );
    foreach( $data as $inserts ) {
        $post = explode( '{|[:]|}' , $data );
        echo 'Von: ' . $post[0] . '<br/>';
        echo 'Mail: ' . $post[1] . '<br/>';
        echo 'Content: ' . $post[2] . '<br/>';
    }

    Das ist natürlich nur nen schneller Gedanke und muss noch verbessert werden! So kannst du es allerdings angehen.

    Liebe Grüße
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    @ggame
    Und welchen Sinn sollte diese Aneinanderreihung von Zeichen haben? Wenn du das schon richtig machen wolltest solltest du dir mal das CSV-Dateiformat ansehen...

    @TE
    Eventuell hilft dir auch die Funktion fgetcsv()
  6. n******t

    ggame ich hab mir deinen Code kurz durchgesehen, weils mich selbst interessiert hat.

    Ich hab ein bisschen rumprobiert und hab immer den Fehler $data is not defined bekommen.

    Du musst in deinem foreach( $data as $inserts ) das $data mit dem $inserts austauschen dann klappts.

    Ich hab übrigens die foreach-Schleife nie richtig kapiert (kA wieso aber irgendwie wird das nirgends so erklärt, dass mans versteht wofür das überhaupt da ist :D) jetzt weiß ich endlich was die macht.

    MfG
    Dominic
  7. g****e

    Ah, ja :-D foreach ( array as value ) , danke für die Korrektur.
    foreach ist an sich eine Iterierungsschleife. Du kannst ein Array durchgehen und die Values direkt rausfiltern, oder aber direkt Key und Value filtern, ganz einfach mit
    foreach( $array as $value ) { echo $value; }

    Oder halt mit
    foreach( $array as $key => $value ) { echo $key .' => '. $value; }

    Das macht es leichter über Hashes (also Arrays mit Strings als Key) zu iterieren.

    An CSV hab ich garnicht gedacht, das wäre natürlich die interligenter Wahl.

    Liebe Grüße
  8. Autor dieses Themas

    sexyteamlp

    sexyteamlp hat kostenlosen Webspace.

    So, als Info für jeden: Wir haben nun eine Lösung (wie bereits von jemanden erwähnt) mit $file_get_contents gefunden, hier der Code:

    _

    <?php
    function insertIntoTextFile($data = array()) {

    //open the file and save it into a string
    $file_content = file_get_contents('Gaestebucheintrag.txt');

    //create a new line from the data array
    $new_line = implode(';', $data)."\n";

    //add the new line to the existing content
    $file_content = $file_content.$new_line;

    //write the new content into the file
    file_put_contents('Gaestebucheintrag.txt', $file_content);

    return true;
    }


    insertIntoTextFile($_POST);

    echo "done";
    ?>

    _

    Das File wird geöffnet, steht zum Schreiben bereit und wird geschlossen ($file_get_contents).

    Mit $new_line und implode wird auf einer neuen Linie die eingebenen Daten zusammengeschrieben mit ; als Trennung.

    Mit $file_content = $file_content.$new_line; wird das vorhandene zusammengepresste in eine neue Linie gepackt.

    Mit $file_put_contents('Gaestebucheintrag.txt', $file_content); wird der Text eingefügt, wenn etwas vorhanden ist (durch return true;)

    Mit insertIntoTextFile($_POST);

    echo "done";

    ist gegeben, dass der Text geschrieben steht und done zeigt an, dass der Beitrag gespeichert wurde.


    Vielen Dank für eure Hilfe :)
  9. Hallo

    da es ja sein kann, das im GB Text auch ein ; (Semikolon / Strichpunkt) vorkommt
    würde ich zum Speichern - wenn in CSV - auf jeden Fall einen enclosure machen,
    also um die einzelnen Felder noch ein " Zeichen davor und danach,
    dann kann man auch einen GB Eintrag mit ; schreiben
    ohne enclosure würde ja eine neue Spalte entstehen, und somit die CSV zerrissen

    Wie es aussieht, legst Du nach dem Absenden die POST Variablen in ein $data Array ab

    z.B:
    if ($_POST['absenden'] == 'ok') { 
       $data['user'] = $_POST['username']; 
       $data['mail'] = $_POST['emailadrr']; 
       $data['text'] = $_POST['eintrag']; 
    }


    hierbei solltest Du die Eingaben noch escapen und evtl. "böse" Zeichen raus filtern
    damit keine TAGs, Scripte bzw. Hack-Versuche, etc. in der GB-Speicher-Datei landen
    .... aber das ist anderes Thema

    die Neue Zeile dann so machen (mit enclosure) und mit Zeilenumbruch am Ende !!!

    $umbr = "\n"; 
    $neue_zeile = '"'.$data['user'].'";"'.$data['mail'].'";"'.$data['text'].'"'.$umbr;


    Der Zeilenumbruch am Ende ist wichtig,
    damit der nächste Eintrag dann auch in einen neue Zeile geschrieben wird.


    Speichern kannst Du dann al neue Zeile in auch ohne file_get_contents()
    einfach als neue Zeile unten in 'Gaestebucheintrag.txt' dran hängen

    $filename = 'Gaestebucheintrag.txt'; 
    
    $handle = fopen($filename,"a");
    if (fwrite($handle,$neue_zeile) ) { 
    echo "<br />OK ... neuer Eintrag wurde gespeichert.\n";
    }
    else { 
    echo "<br />Fehler beim Speichern ...\n";
    }
    fclose($handle);



    dann hast Du als .txt Datei sowas:

    "Dex";"rathalos94@gmx.de";"Testkommentar mit ; Semikolon im Text"
    "User2";"test@test.de";"Test Test test und nochmal test"
    "User56";"test@test.de";"Lalalal blababab"




    Das Auslesen geht dann mit fgetcsv am einfachsten
    $handle = fopen($filename, "r");
    
    $rowlen = 1024;     // --- max. länge einer Zeile, wenn 0 (Null) bis Ende 
    $delim = ';';       // --- das Spalten-Trenner-Zeichen, hier ; (Semikolon) 
    
    $rdata = array(); 
    while (($row= fgetcsv($handle, $rowlen, $delim)) !== FALSE) { 
       $rdata[] = $row; 
    }



    als DEBUG-Ausgabe dann so
    print "<pre>\n"; 
    print_r($rdata); 
    print "</pre>\n";


    sollte dann etwa so aussehen

    Array -> (
       [0] -> Array (
                   [0] -> Dex
                   [1] -> rathalos94@gmx.de
                   [2] -> Testkommentar mit ; Semikolon im Text
                 )
       [1] -> Array (
                   [0] -> User2
                   [1] -> test@test.de
                   [2] -> Test Test test und nochmal test
                 )
       [2] -> Array (
                   [0] -> User56
                   [1] -> test@test.de
                   [2] -> Lalalal blababab
                 )
    )


    Ausgabe von PHP zu HTML dann so

    $anzahl = count($rdata); 
    
    echo "<br />Anzahl Gesamt: ".$anzahl."\n"; 
    echo "<br />\n"; 
    
    $n=1; 
    foreach($rdata as $item) { 
       echo "<br />Nr: ".$n."\n"; 
       echo "<br />User: <strong>".$item[0]."</strong>\n"; 
       echo "<br />Mail: <i>".$item[1]."</i>\n"; 
       echo "<br />Text: ".$item[2]."\n"; 
       echo "<br />\n"; 
       $n++; 
    }



    -----> aber jetzt vergiss das alles und mach es lieber gleich mit MySQL
    das hat viele Vorteile gegenüber Speichern in CSV (.txt) Format

    z.B. wenn zwei User genau gleichzeitig in das GB eintragen,
    dann kann es sein, dass die .txt Datei komplett zerstört wird (leer)
    bei MySQL geht dasl "gleichzeitige" Speichern ...

    oder escapen .. bei .txt (CSV Format) musst du Eingaben gut filtern,
    damit die CSV-Struktur nicht zerschossen wird, auch Zeilenumbrüche, etc.
    bei MySQL ist das mit mysql_real_escape_string() relativ einfach

    oder Dateigröße .. wenn Du mal paar hundert GB Einträge hast,
    musst Du aus .txt immer alle ausleen
    bei MySQL kannst du leichter nur die 10 neuesten auslesen

    ... ich würde ja noch ein Feld (Spalte) einführen mit Datum
    dann kann man auch sehen, Wann der GB-Eintrag war :)


    usw. .... also mach es doch gleich mit MySQL, ist viel viel besser !!!
    Wie das geht, findest Du in diversen Tutorials schnell heraus :)


    Beitrag zuletzt geändert: 8.8.2012 11:41:39 von wegreise
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!