Tom: session_start verträgt sich nicht mit POST- und Feldübergabeprüf

Beitrag lesen

Hello,

Ich hoffe dass Ihr mir ein wenig weiterhelfen könnt!

Klar, gerne.

Also erstmal die Ursache:

es liegt mit 99% Wahrscheinlichkeit an der automatischen Sessionorganisation von PHP. Wenn mann die Seite das erste Mal aufruft, also vom Browser noch kein Session-Parameter mit dem Request mitgesendet wurde, dann baut PHP (bei Standardeinstellung) in jedes Formular ein <hidden>-Element ein mit der neuen Session-ID.

Wie kannst Du das feststellen?

Lasse Dir das $_POST-Array zum Debuggen ausgeben

echo "<pre>\r\n";
    echo htmlspecialchars(print_r($_POST,1));
    echo "</pre>\r\n";

Was machst Du falsch?

Du _zählst_ die per POST übergebenen Paramter, obwohl die Anzahl vollkommen irrelevant ist.

Wie kannst Du es besser machen?

Die Liste der notwendigen Felder mit dem POST-Array vergleichen

Du baust ein Vergleichsarray mit den Namen aller Parameter auf

$_expected['name'][$i]        Name des POST-Paramters
   $_expected['duty'][$i]        Ist er Pflicht?
   $_expected['complete'][$i]    Muss er ergänzt werden, wenn er fehlt?
   $_expected['default'][$i]     was ist der Default bei Ergänzung?
   ...                           weitere z.B. für valid-Prüfung usw.
   $_expected['checked'][$i]     POST-Array und Vorgabe bereits verglichen

dann fährst Du das $_POST-Array mit foreach() ab und vergleichst die Vorgaben in $_expected. Alle geprüften werden mit ['checked'] = true gekennzeichnet. Diejenigen, die dort nicht enthalten sind, führen zum Prüfungsfehler!

Wenn die Prüfung bis hierher ok war, machst Du die Gegenprobe, indem Du mit foreach() und array_filter() die ['checked']-Spalte des $_expected-Arrays abfährst und alle diejenigen, die noch nicht checked wurden, nach eingetragenen Vorgaben (z.B. Default) abarbeitest.
Auch hierbei führt ein fehler zum Prüfungsfehler!

So verhinderst Du, dass Du unerwartete Parameter erhalten kannst und auch, dass welche fehlen. Außerdem kannst Du diejenigen, die nur im Auswahlfall mitkommen (radio, checkbox, select, ...) im POST-Array ergänzen, sodass ein Datenbankupdate dann später nach Schema F ablaufen kann.

Wenn Du noch Fragen hast zum Verfahren, dann melde dich nochmal.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de