undefenierter Index und PHP Logik Verständnissfrage

  • Hallo
    alle zusammen,



    Ich
    habe nun erfolgreich mein erstes Kontaktformular mit dem PHP-Kurs
    programmiert. Allerdings habe ich noch ein paar Fragen die ich mir
    selbst nicht beantworten kann.


    1.Ich wollte die Notiz "undefinierter Index" mit isset()
    unterdrücken. Dann brachte er aber bei der Kontrolle (code zeile
    eins bis sieben) "1" raus. Nur bei der Anrede nicht. Der
    "1" Fehler tritt auf wenn man das Formular absendet ohne
    die Felder auszufüllen. Warum schreibt er mir eine "1".
    Kann ich die Variablen auch auf "leer" definieren? Nach
    füllen der Felder und absenden wären sie ja dann nichtmehr leer.


    2.Ich verstehe nicht warum die Klammer der if Funktion in Zeile 34
    umbedingt in der PHP funktion (Zeile 64) liegen muss damit das
    Formular ausgefüllt wird.


    Denn die else Funktion fängt in Zeile 67 an die hat doch mit dem if
    nichts mehr zu schaffen.


    Warum muss die letzt geschweifte klammer der if funktion umbedingt in
    diesem PHP bereich liegen?


    3.Ich verstehe auch nicht warum das Hidden Feld verhindert dass direkt
    am anfang beim öffnen der Seite die Fehlermeldungegen unterdrückt
    werden das nichts ausgefüllt wurde.


    Es funkioniert zwar alles aber das reicht mir nicht :D


    Desweiteren würde mich noch interresieren ob ihr meine Beschriftung und den
    Aufbau des PHP Programmes gut und übersichtlich findet ?


    Vielen
    dank für eure Zeit und die Mühe.


    Lg



    Code:


  • isset() liefert einen Wahrheitswert zurück , und dies ist falls die Variable gesetzt wurde 1.



    Eine Else-Struktur gehört immer zu einer if-Verzweigung und diese gehört eben zu jener aus Zeile 34.
    Diese Struktur bewirkt, dass wenn ein Feld nicht ausgefüllt wurde, das ganze HTML-Formular ausgegeben wird.
    Darum wird auch das if erst nach dem HTML-Bereich geschlossen und dort das HTML definiert.


    Zitat


    [size=10][size=12]
    3.Ich verstehe auch nicht warum das Hidden Feld verhindert dass direkt
    am anfang beim öffnen der Seite die Fehlermeldungegen unterdrückt
    werden das nichts ausgefüllt wurde.

    Zitat

    Zitat



    Lass dir mal via

    PHP
    1. print_r($_GET);


    die übertragenen Werte ausgeben, hier läuft es bei der Überprüfung darauf hinaus das geprüft
    wird ob ein Wert in $_GET['abgesendet'] vorliegt, wenn ja ist das Formular schon aufgerufen
    worden oder die URL entsprechend manipuliert worden.



    Zitat


    [size=10][size=12]Desweiteren würde mich noch interresieren ob ihr meine Beschriftung und den
    Aufbau des PHP Programmes gut und übersichtlich findet ?

    Zitat

    Zitat


    Nein,


    da du mit dem @ Zeichen Fehlermeldungen bewusst unterdrückst, was man vor allem während dem Entwickeln
    nie verwenden sollte. Du solltest lieber am Anfang der Datei


    PHP
    1. error_reporting(-1);
    2. ini_set('display_errors', 1);


    schreiben um ein besseres Debugging zu ermöglichen.


    Zudem behandelst du Kontexwechsel überhaupt nicht, Usereingaben darfst du nie ohne entsprechende Behandlung
    http://php.net/manual/en/function.htmlspecialchars.php
    ausgeben. Gib mal probehalber in einem Feld <script>alert('Hackalarm');</script> ein und du versteht was dahintersteckt ->
    eine Riesensicherheitslücke. Zudem fehlt eine gute Überprüfung , da würde ich ein isset/empty und strlen bevorzugen.


    So das wars erstmals, ich hoffe ich konnte dir ein wenig helfen :)

  • isset() liefert einen Wahrheitswert zurück , und dies ist falls die Variable gesetzt wurde 1.


    Verwirrend erklärt.


    isset() liefert einen Wahrheitswert (boolean) zurück. Der Rückgabewert ist also true oder false.
    Durch die Verkettung wie zB

    PHP
    1. echo "<li>Anliegen: ".isset($_GET['anliegen']);


    wird aus dem (zB) true ein int 1.



    Also

  • @ Nitamund


    Danke für dein Hilfe :)


    Punkt 1 und 2 sind geklärt.


    Bei Punkt 3 geht es jetz nur noch um eine Verständnisfrage, liest mein Server zuerst alle PHP und HTML Befehle durch bevor er mir etwas ausgibt oder Interpretiert. Oder gibt er Zeile für Zeile aus halt nur in einem Tempo das man es nich mehr sieht?


    Ich habe mir mal mein PHP-Programm selber durchgelesen und dabei festgestellt das ich es selbst nicht verstehen würde :D Sobald ich fertig mit dem überarbeiten bin lade ich es nochmal hoch.


    Desweiteren habe ich jetzt alle @-Zeichen entfernt. Ich habe aber nicht deine Lösung genommen sondern:

    PHP
    1. error_reporting(E_ALL ^ E_NOTICE);


    Deine Lösung hat leider nicht funktioniert. Ist meine Lösung denn auch in Ordnung? Oder geht das nicht gut auf lange Zeit?


    Die Sicherheitslücke habe ich gefunden ;)
    Die drei Überprüfungsmöglichkeiten die du vorgeschlagen hast finde ich auch besser für den Programmierer. Aber für den Nutzer wären diese doch eher ungeeignet, da isset nur Wahr oder falsch zurück gibt, empty gibt das selbse zurück und strlen nur die Anzahl der Zeichen. Wenn ich dem Nutzer zeigen möchte was er eingegeben hat dann würde ich es weiterhin mit

    PHP
    1. echo $_GET['name'];

    ausgeben lassen. Oder gibt es eine bessere Methode?



    @cotton
    Also ist boolean ein Wahrheitswert. Eine "Sache" kann nur wahr oder falsch sein. Deshalb 0 oder 1 ?



    Danke für eure Hilfe :)

  • 0 oder 1 wird angezeigt.
    Warum:
    Wenn Du ein boolean true ausgeben willst, kann PHP nicht "true" ausgeben. Das sähe ja so aus, als ob der String "true" da drin steckt.
    Also wird aus dem boolean ein integer Wert - 0 oder 1.


    Die PHP-Funktion var_dump() zeigt Dir immer den Wert und den Typ (bool, int, string, ...).
    Gib mal in einem Testscript

    PHP
    1. var_dump(true);
    2. var_dump(false);
    3. var_dump(0);
    4. var_dump('ein string ... ');


    aus.


    Andere Möglichkeit: