Dateien auslesen/abfangen

  • Hey zusammen,

    ich habe nun ein kleines php skript geschrieben mit dem ich mit $_POST die einzelnen Sachen aus meinem Bestellformular nach dem absenden , abfange/auslese und diese in ein externes txt dokument gespeichert wird.

    Nun meine Frage. ich habe jetzt 4 Angebote. Ich habe für jedes Angebot einzelt eine variable erstellt. Nun wenn ich nur eins klicke kommt dann immer undefined angebot.. ich weiß ja auch warum. Weil ich alle auslese aber dieses zum auslesen nicht geklickt ist und dann dieser Wert fehlt.

    Wie macht man das, das diese 4 Angebote je aufgeteilt sind, also wenn angebot 1 ist geklickt tuh nur angebot 1 abfragen, wenn 2 angebote geklickt sind von 4 tuh nur die 2 abfragen usw..

    Mein HTML & PHP:

    Kann es sein das man das mit if else macht ?

    Gruß,
    Stef

    • Offizieller Beitrag

    Hallo,

    Checkboxen und Radiobuttons werden nur übertragen, wenn sie ausgewählt sind.
    Sind sie nicht ausgewählt, werden sie nicht übertragen und existieren somit auch nicht in $_POST.

    Die Meldung, die Du meinst, heißt vermutlich konkret: "undefined index angebot1...", was genau das Verhalten beschreibt.
    Allgemein zur Info: http://www.php-rocks.de/thema/66-undef…in-on-line.html

  • Hey,

    habe es nun angewendet. Und die Ausgabe der Bestellung geht jetzt. Danke.

    Jedoch habe ich ja diese angebote auch in einer variable und in der ausgabe variable gespeichert. Und dazu kommen diese fehlermeldungen wenn welche nicht angeklickt sind:

    Notice: Undefined index: angebot1 in E:\Privat\XAMPP\htdocs\meintest\bestellformular-auswertung.php on line 51

    Notice: Undefined index: angebot2 in E:\Privat\XAMPP\htdocs\meintest\bestellformular-auswertung.php on line 52

    Notice: Undefined index: angebot3 in E:\Privat\XAMPP\htdocs\meintest\bestellformular-auswertung.php on line 53

    Notice: Undefined index: angebot4 in E:\Privat\XAMPP\htdocs\meintest\bestellformular-auswertung.php on line 54

    Wie tut man dies verhindern?

    Stef

  • Zugriff auf Variablen:

    PHP
    $angebot1 = $_POST['angebot1'];
    $angebot2 = $_POST['angebot2'];
    $angebot3 = $_POST['angebot3'];
    $angebot4 = $_POST['angebot4'];

    Und erst einige Zeilen später wird mit isset geprüft, da ist es doch logisch, dass Warnings kommen

  • Hey,

    habe deins ausprobiert. Aber immer kommt diese Notiz weiter.
    Habe dann es so getestet:

    Da habe ich ja die angebote einzelt mit isset geprüft. Nun kommt dies:

    Notice: Undefined index: angebot2 in E:\Stefan\Privat\XAMPP\htdocs\meintest\bestellformular-auswertung.php on line 76


    Das ist diese Zeile:

    PHP
    $ausgabe = $vorname ."\r\n".$nachname . "\r\n" .$alter . "\r\n" .$email.   "\r\n" . $angebot1. "\r\n" .$angebot2. "\r\n".$angebot3. "\r\n"   .$angebot4 ."\r\n";

    Hier werden ja diese einzelnen angebote in der $ausgabe gespeichert. und ich habe doch die angebote geprüft warum kommt dann die notiz ?

    Habe die mal die einzelnen angebote gelöscht nun funktioniert alles.

    Aber ich möchte auch das diese mitabgespeichert werden in der var $ausgabe. Wie ist dies möglich ohne eine Notiz zu bekomme oder sogar nem error ?

    Stef

    2 Mal editiert, zuletzt von Stef (4. Juli 2016 um 16:34)

  • Hey,

    ich habe deinen Link und dein Tut schon mehrmals angeschaut.
    Habe es ja auch nach dem probiert. Aber irgenwie versteh ichs ned.. :???:

    Soll dass isset vor dem Formular ?

    Nach deinem Tut würde ich es so machen :

    Ich habe lust aber irgendwie komm ich da nicht weiter...

  • Zu Beginn der Verarbeitung überprüfst du ob die Variable

    PHP
    $_POST['submitted']

    gesetzt ist.

    Wenn dem so ist kannst du mit deinem Code fortfahren, sonst passiert halt nichts oder du erzeugst eine andere Ausgabe.

    Müsste dann also in etwa so aussehen:

    PHP
    if(isset($_POST['submitted'])){
        $angebot1 = $_POST['angebot1'];
        // dein restlicher Code
    }
    else{
        // Das passiert wenn das Formular nicht abgesendet wurde
    }

    Genau wie es in dem von Arne Drews geposteten Link erklärt wurde.

    3 Mal editiert, zuletzt von eT18 (4. Juli 2016 um 19:54)

  • Hey,

    ok vielen Dank.

    Nach nochmals mehrerem durchlesen/überfliegen seines tuts finde ich nichts mit "if-else".

    Da steht nur :

    Um das Problem zu beheben, müssen wir einfach nur abfragen, ob das Formular überhaupt gesendet wurde, bzw. Daten im POST-Kanal vorhanden sind.
    Dazu bedienen wir uns - um nicht bei der Abfrage eine ähnliche Notice zu erhalten - der Funktion isset():
    PHP-Code:


    PHP
    if ( isset($_POST['submitted']) ) {
    
    
        echo $_POST['sometext'];
    
    
    }

    Habe es nun so gemacht.:

    Trotzdem kommt die Notiz.


    Stef

    Einmal editiert, zuletzt von Stef (4. Juli 2016 um 20:25)

  • ???

    Du hast doch gerade das Beispiel zitiert.

    • Offizieller Beitrag

    Hallo,

    Du fragst zwar ab, ob $_POST['angebot1'] existiert, aber wenn nicht, wird ja auch nie $angebot1 gesetzt, trotzdem verwendest Du es für $ausgabe.
    Das ist dann wieder ein klassischer Fall von "undefined var".

    Ich würde das Konzept mit den Angeboten auch eher auf Array-Basis lösen, denn wenn Du mal ein Angebot mehr hast, musst Du Deinen kompletten Code anpassen.
    Am besten, Du sorgst schon im Formular dafür, dass Deine Angebote als Array übertragen werden.

    Nur mal als Ansatz, wie das Formular und die Verarbeitung etwas optimiert aussehen könnte:


    Ein Vorteil dieser Vorgehensweise ist, dass Du Deine Angebote im HTML-Formular beliebig erweitern kannst, aber den PHP-Part nie dafür anzufassen brauchst.

  • Hey,

    vielen Dank für dein Script, könntest du es bitte erklären dass auch ich es verstehen kann. Danke.

    ich habe nochmal alles überprüft und jetzt kommt keine Notiz mehr. Der fehler war der, das ich zu jedem isset() kein else mit Anweisung hinzugefügt habe.

    Stef

    • Offizieller Beitrag
    Zitat von Stef

    Der fehler war der, das ich zu jedem isset() kein else mit Anweisung hinzugefügt habe.

    Logische Schlussfolgerung aus bspw. dem hier:

    Zitat von Arne Drews

    Du fragst zwar ab, ob $_POST['angebot1'] existiert, aber wenn nicht, wird ja auch nie $angebot1 gesetzt, trotzdem verwendest Du es für $ausgabe.

    Zitat von Stef

    vielen Dank für dein Script, könntest du es bitte erklären dass auch ich es verstehen kann. Danke.

    Was genau? Ich denke der HTML-Bereich ist verständlich, daher erkläre ich nur mal die relevanten Stellen im PHP-Teil:

    Als erstes ermittel ich natürlich, ob überhaupt Formulardaten angekommen sind, indem ich die Existenz des Submit-Buttons abfrage:

    PHP
    if ( isset($_POST['submitted']) ) {
    
    
        // ...Formulardaten sind vorhanden
    
    
    }

    Bei den reinen Textfeldern unterstelle ich mal, dass die da sind und übernehme die Werte ungeprüft dessen über eine Filterung, hier als Beispiel mit htmlspecialchars() ( je nach Verwendung der Daten sollte eine abweichende Filterung angewendet werden ):

    PHP
    $sFirstName = htmlspecialchars( $_POST['name'] );
    $sLastName = htmlspecialchars( $_POST['nachname'] );
    $sEmail = htmlspecialchars( $_POST['email'] );


    Aus Bequemlichkeit habe ich die Parameter $flag und $encoding weggelassen, korrekterweise sollte man es so nutzen:

    PHP
    htmlspecialchars( $string, ENT_COMPAT, 'UTF-8' );

    Bei der Altersangabe haben wir wieder - ähnlich wie bei Checkboxen - das Problem, dass diese nicht übertragen werden, wenn sie nicht geklickt wurden. Auch wenn das Feld als requierd definiert ist, gehe ich auf Nummer sicher und prüfe das mit isset(). Wurde es übertragen, entnehme ich dessen Wert, ansonsten setze ich "-18" fest:

    PHP
    $sAge = isset( $_POST['alter18'] )? $_POST['alter18']: '-18';


    Das nennt sich Trinitäts- bzw. Ternärer Operator und ist lediglich die Kurzform von dem hier:

    Jetzt fehlen nur noch die geklickten Angebote.
    Dadurch, dass die Angebote im Formular quasi als Array definiert wurden, können wir diese in PHP auch so behandeln!

    Nehmen wir an, der User klickt nur Angebot 2 und 4 an, dann hätten wir folgendes Array:

    Code
    // Inhalt von $_POST['angebot']:
    
    
    Array (
        [2] => 30.99€
        [4] => 10.99€
    )

    Da die Array-Schlüssel unsere Angebotsnummern sind, können wir dies über eine Schleife lösen. Da ich persönlich - und das ist jetzt keine fachliche Meinung - nicht so der foreach-Fan bin, lasse ich das lieber die implementierten Array-Funktionen erledigen. Diese sind in C geschrieben und iterieren in vielen ( nicht allen! ) Fällen schneller, wie foreach. An dieser Stelle bietet sich für meinen Geschmack array_map() an:


    array_keys() liefert alle Schlüssel des übergebenen Array in gleicher Reihenfolge.

    Durch diese Vorgehensweise ist es nun egal, wieviele Angebote sich im HTML-Formular befinden, es werden immer alle angeklickten an dieser Stelle erfasst und ausgewertet.
    Man braucht diesen Code-Teil nie wieder anzupassen!

    Keine Mystic, keine Hexerei, nur erstmal neu... ;)


    EDIT: Ach ja, file_put_contents() ersetzt übrigens das fopen-/fwrite-/fclose-Gedöns. Technisch gesehen basiert es zwar auch darauf, aber es ist die elegantere Lösung, wie ich finde.
    Da hatte sich übrigens auch ein Fehler eingeschlichen, den ich im oberen Beitrag korrigiert habe, die Zeile muss lauten:

    PHP
    file_put_contents( 'auswertung.txt', $sOrderData, FILE_APPEND );

    Gruß Arne

  • Ich habe jetzt nicht alles genau gelesen. Leere Variablen kannst du mit value eine Wert geben, z.B. Null oder irgendeinen String. Danach fragst du ab. Dann dürften schon mal keine Fehlermeldungen wegen leerer Inhalte kommen.

    Gegen Mods kommt man nicht an, die haben immer Recht. Sind scheinbar nicht kritikfähig.

  • In Verbindung von value mit checked sollte es gehen. Die Frage ist nur, ob das Formular an der Stelle einen Wert haben soll, oder ob, wenn nichts gewählt wurde alles leer sein soll. Das muss man definieren und halt abfragen.

    Gegen Mods kommt man nicht an, die haben immer Recht. Sind scheinbar nicht kritikfähig.

    • Offizieller Beitrag

    Das hat er ja schon mit seinem IF/ELSE gemacht, die Problematik besteht ja so gar nicht mehr...
    Ich denke auch nicht, dass man da großartig etwas definieren muss. Per Definition werden nicht gecheckte Boxen und Radio-Buttons nicht übermittelt, that's it.
    Das abzufragen macht er ja mit isset(), reicht also vollkommen aus...