dynamische Webseite mit php
bearbeitet vonHallo Henry,
- Du schreibst, dass Du die switch-Auswahl jetzt mit Checkboxen machst und mit JavaScript ein Radiobutton-Verhalten simulierst. Warum? Radiogruppen existieren und funktionieren. Wie Gunnar schrieb.
- Du schreibst, dass T1.ws_regler_ein beim POST zu T1_ws_regler_ein mutieren würde. Ja. TIL: PHP mag keine Spaces und keine Punkte in GET- und POST-Parametern. Wer PHP vor Version 4.1 gemacht hat, weiß warum. Darum wusste ich es nicht. In PHP 3 wurden GET und POST Parameter als globale Variablen registriert. Und in Variablennamen sind Punkt und Space nicht möglich, deshalb die Ersetzung in _. Nachdem genug PHP Seiten durch diesen Unfug gehackt wurden, brachte PHP 4.0 $HTTP\_GET\_VARS, aber nicht als Superglobal, und die Option register_globals, um nach Migration auf das neue Konzept das alte Verhalten abschalten zu können. Weil $_GLOBALS['HTTP_GET_VARS']einfach lästig war, brachte PHP 4.1 $\_GET als Superglobal, und mit PHP 4.2 wurde register_globals bereits missbilligt. Dank der Trägheit der Entwickler zog es sich aber insgesamt 12 Jahre, bis in PHP 5.4 ernst gemacht wurde, seitdem **muss** man $\_GET benutzen. Aber weil sich alle dran gewöhnt haben, dass Punkt und Space zu _ werden, konnte man diese Namensverwurstung wohl nicht loswerden, und die Idee, deshalb einen Schalter in die .ini zu pflanzen, fand auch keinen Anklang (hab ich bei der Recherche hierfür irgendwo gesehen). Dir bleibt nur übrig, vor dem Auslesen im varname die gleiche Ersetzung durchzuführen. Bspw. mit `preg_replace("/[. ]/", "_", $varname)`
- Du schreibst, es gebe die Notice, dass das Array bzw. die Variable `$_SERVER["REQUEST_METHOD"]` nicht existiert. Kannjagarnichtsein. $_SERVER und der Eintrag REQUEST_METHOD sind immer da, wenn PHP vom Webserver ausgeführt wird. Ich habe keine Ahnung, was da passiert.
Zum PHP noch diese Hinweise:
- Du hast den catch(PDOException) auskommentiert, aber den try { dazu stehen gelassen
- PDOExceptions zu fangen bringt nichts, wenn du mysqli verwendest. Von mysqli bekommst Du eine mysqli_sql_exception, [sofern Du mit dem Treiber nichts anderes aushandelst](https://www.php.net/manual/de/mysqli-driver.report-mode.php). Wenn Du PDOExceptions verwenden willst, musst Du PDO verwenden.
- "SELECT * FROM writecommands WHERE name ='".$name."'" ist verbesserungsbedürftig. Der $name sollte escaped werden, auch wenn er nicht vom User kommt, sondern allein unter deiner Kontrolle steht. Verwende [mysqli_real_escape_string](https://www.php.net/manual/de/mysqli.real-escape-string.php). Alternativ kann man mysqli_prepare verwenden, das lohnt aber für einmalig ausgeführte Statements eher nicht.
- Dass das Passwort im Klartext in deiner Datenbank steht, ist eine Todsünde. In die Datenbank gehört ein Hash des Passworts, den Du mit [password_hash](https://www.php.net/manual/de/function.password-hash.php)($klartext) erzeugst und dann mit [password_verify](https://www.php.net/manual/de/function.password-verify.php)($inputpwd, $hashFromDatabase) überprüfst. Der Teil, dass das Passwort falsch ist und $message auf WRONG_PASSWORD gesetzt wird, fehlt bei Dir eh noch 😉
- $receiveArray solltest Du vor der Abfrage auf die Reques-Methode initialisieren. PHP macht das zwar unter der Haube für Dich, wenn $receiveArray uninitialisiert ist, aber es ist generell schlechter Stil, uninitialisierte Variablen zu benutzen
- Statt `$receiveArray[$i] = "..."; $i++;` kannst Du einfach `$receiveArray[] = "..."` verwenden. Das hängt den neuen Wert hinten dran.
- Was machst Du mit $receiveArray? Du enumerierst das $_POST-Array und speicherst $key und $value als getrennte Werte im $receiveArray - welchem Zweck dient das?
- Im $receiveArray gezielt auf Position 4 und 5 zuzugreifen ergibt für mich keinen Sinn. Das ist extrem zerbrechlicher Code - ein neues Formfeld und die Indexe stimmen nicht. Verwende NAMEN. Mir scheint, dass Du in deinem Form immer nur zwei Dinge eingibst: Ein Passwort und einen Wert. Den Wert als Text-Input oder als Radiogruppe. Soll das so bleiben oder soll es später auch möglich sein, mehrere Werte einzugeben?
- Solange es nur ein Wert ist, kannst Du Dir das Leben vereinfachen. Verwende einen fixen Wert für das name-Attribut. Und zwar im $switch und im $value-Fall. Dann kannst Du den eingegebenen oder ausgewählten Wert stumpf unter bekanntem Namen in $_POST auslesen. Die ID für das Eingabefeld kann auch fix sein. Die IDs für die Radiobuttons musst Du auch nicht aus $varname herleiten, die kannst Du einfach durchnummerieren.
- Die Texte, die Du ausgibst, müssen grundsätzlich durch htmlspecialchars laufen. Und zwar **nur** vor der Ausgabe. Nicht nach Empfang aus $_POST, wie Du es beim $receiveArray machst. Die Nummer mit dem $receiveArray löst sich vermutlich eh in Luft auf, wenn Du mit einem fixen Namen für die Werteingabe arbeitest.
- Das hidden input mit name="action" und value="submit" ist redundant. Gib dem Submit-Button diesen Namen und diesen Value. Fertig.
_Rolf_
--
sumpsi - posui - obstruxi
dynamische Webseite mit php
bearbeitet vonHallo Henry,
- Du schreibst, dass Du die switch-Auswahl jetzt mit Checkboxen machst und mit JavaScript ein Radiobutton-Verhalten simulierst. Warum? Radiogruppen existieren und funktionieren. Wie Gunnar schrieb.
- Du schreibst, dass T1.ws_regler_ein beim POST zu T1_ws_regler_ein mutieren würde. Ja. TIL: PHP mag keine Spaces und keine Punkte in GET- und POST-Parametern. Wer PHP vor Version 4.1 gemacht hat, weiß warum. Darum wusste ich es nicht. In PHP 3 wurden GET und POST Parameter als globale Variablen registriert. Und in Variablennamen sind Punkt und Space nicht möglich, deshalb die Ersetzung in _. Nachdem genug PHP Seiten durch diesen Unfug gehackt wurden, brachte PHP 4.0 $HTTP\_GET\_VARS, aber nicht als Superglobal, und die Option register_globals, um nach Migration auf das neue Konzept das alte Verhalten abschalten zu können. Weil $_GLOBALS['HTTP_GET_VARS']einfach lästig war, brachte PHP 4.1 $\_GET als Superglobal, und mit PHP 4.2 wurde register_globals bereits missbilligt. Dank der Trägheit der Entwickler zog es sich aber insgesamt 12 Jahre, bis in PHP 5.4 ernst gemacht wurde, seitdem **muss** man $\_GET benutzen. Aber weil sich alle dran gewöhnt haben, dass Punkt und Space zu _ werden, konnte man diese Namensverwurstung wohl nicht loswerden, und die Idee, deshalb einen Schalter in die .ini zu pflanzen, fand auch keinen Anklang (hab ich bei der Recherche hierfür irgendwo gesehen). Dir bleibt nur übrig, vor dem Auslesen im varname die gleiche Ersetzung durchzuführen. Bspw. mit `preg_replace("/[. ]/", "_", $varname)`
- Du schreibst, es gebe die Notiz, dass das Array bzw. die Variable "$_SERVER["REQUEST_METHOD"]" noch nicht existiert. Kannjagarnichtsein. Die REQUEST_METHOD ist immer da, wenn PHP vom Webserver ausgeführt wird. Also keine Ahnung. Sichere Dich im Zweifelsfall mit ?? '' ab, so wie Du es beim Passwort tust.
Zum PHP noch diese Hinweise:
- Du hast den catch(PDOException) auskommentiert, aber den try { dazu stehen gelassen
- PDOExceptions zu fangen bringt nichts, wenn du mysqli verwendest. Von mysqli bekommst Du eine mysqli_sql_exception, [sofern Du mit dem Treiber nichts anderes aushandelst](https://www.php.net/manual/de/mysqli-driver.report-mode.php). Wenn Du PDOExceptions verwenden willst, musst Du PDO verwenden.
- "SELECT * FROM writecommands WHERE name ='".$name."'" ist verbesserungsbedürftig. Der $name sollte escaped werden, auch wenn er nicht vom User kommt, sondern allein unter deiner Kontrolle steht. Verwende [mysqli_real_escape_string](https://www.php.net/manual/de/mysqli.real-escape-string.php). Alternativ kann man mysqli_prepare verwenden, das lohnt aber für einmalig ausgeführte Statements eher nicht.
- Dass das Passwort im Klartext in deiner Datenbank steht, ist eine Todsünde. In die Datenbank gehört ein Hash des Passworts, den Du mit [password_hash](https://www.php.net/manual/de/function.password-hash.php)($klartext) erzeugst und dann mit [password_verify](https://www.php.net/manual/de/function.password-verify.php)($inputpwd, $hashFromDatabase) überprüfst. Der Teil, dass das Passwort falsch ist und $message auf WRONG_PASSWORD gesetzt wird, fehlt bei Dir eh noch 😉
- $receiveArray solltest Du vor der Abfrage auf die Reques-Methode initialisieren. PHP macht das zwar unter der Haube für Dich, wenn $receiveArray uninitialisiert ist, aber es ist generell schlechter Stil, uninitialisierte Variablen zu benutzen
- Statt `$receiveArray[$i] = "..."; $i++;` kannst Du einfach `$receiveArray[] = "..."` verwenden. Das hängt den neuen Wert hinten dran.
- Was machst Du mit $receiveArray? Du enumerierst das $_POST-Array und speicherst $key und $value als getrennte Werte im $receiveArray - welchem Zweck dient das?
- Im $receiveArray gezielt auf Position 4 und 5 zuzugreifen ergibt für mich keinen Sinn. Das ist extrem zerbrechlicher Code - ein neues Formfeld und die Indexe stimmen nicht. Verwende NAMEN. Mir scheint, dass Du in deinem Form immer nur zwei Dinge eingibst: Ein Passwort und einen Wert. Den Wert als Text-Input oder als Radiogruppe. Soll das so bleiben oder soll es später auch möglich sein, mehrere Werte einzugeben?
- Solange es nur ein Wert ist, kannst Du Dir das Leben vereinfachen. Verwende einen fixen Wert für das name-Attribut. Und zwar im $switch und im $value-Fall. Dann kannst Du den eingegebenen oder ausgewählten Wert stumpf unter bekanntem Namen in $_POST auslesen. Die ID für das Eingabefeld kann auch fix sein. Die IDs für die Radiobuttons musst Du auch nicht aus $varname herleiten, die kannst Du einfach durchnummerieren.
- Die Texte, die Du ausgibst, müssen grundsätzlich durch htmlspecialchars laufen. Und zwar **nur** vor der Ausgabe. Nicht nach Empfang aus $_POST, wie Du es beim $receiveArray machst. Die Nummer mit dem $receiveArray löst sich vermutlich eh in Luft auf, wenn Du mit einem fixen Namen für die Werteingabe arbeitest.
- Das hidden input mit name="action" und value="submit" ist redundant. Gib dem Submit-Button diesen Namen und diesen Value. Fertig.
_Rolf_
--
sumpsi - posui - obstruxi