Problem bei der Formularauswertung
SiWi
- php
Ich habe mich anhand eines Buches etwas mit PHP angefangen und bin jetzt bei der Formularauswertung angelangt. Nun habe ich aber bei der Verwendung folgendes Codes ein Problem:
Htmldatei:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ud01</title>
</head>
<body>
Bitte tragen Sie zwei Zahlen ein und senden Sie das Formular ab.<br>
<form action="ud01.php" method="post">
Wert 1: <input name="w1">
<p>Wert 2: <input name="w2"></p>
<p><input type="submit">
<input type="reset"></p>
</form>
</body>
</html>
Die PHP-Datei:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ud01</title>
</head>
<body>
<?php $erg = $w1 + $w2;
echo "Die Summe von $w1 und $w2 ist $erg";
?>
</body>
</html>
Die Ausgabe ist:
Die Summe von und ist 0
Wo liegt das Problem?
Ich habe XAMPP und den Firefox.
Ich habe mich anhand eines Buches etwas mit PHP angefangen und bin jetzt bei der Formularauswertung angelangt. Nun habe ich aber bei der Verwendung folgendes Codes ein Problem:
...
<?php $erg = $w1 + $w2;
echo "Die Summe von $w1 und $w2 ist $erg";
?>
Die Ausgabe ist:
Die Summe von und ist 0
Wo liegt das Problem?
Ich habe XAMPP und den Firefox.
Das Problem ist, das Du ein altes Buch hast ;) In den neueren PHP Versionen werden die Parameter (POST, GET, COOKIE, SESSION) nicht mehr automatisch in PHP Variablen umgewandelt.
Die Formularfelder "w1" und "w2" kannst Du wie folgt abfragen:
$w1 = $_POST['w1']; bzw.
$w1 = $_POST['w2'];
Das Stichwort ist "Suberglobals".
<?php
// importiere HTML Forumlar Daten
$w1 = $_POST['w1'];
$w1 = $_POST['w2'];
// Rechne...
$erg = $w1 + $w2;
// Werf Ergebnis raus.
echo "Die Summe von $w1 und $w2 ist $erg";
?>
Hello,
// importiere HTML Forumlar Daten
$w1 = $_POST['w1'];
$w1 = $_POST['w2'];
Die Daten sind bereits aus den Parametern des Environments in Varibalen des Scripts umgewandelt. Es ist nicht notwedig, sie vor der Verwendung nochmals zu kopieren.
// Rechne...
$erg = $w1 + $w2;
// Werf Ergebnis raus.
echo "Die Summe von $w1 und $w2 ist $erg";
?>
Das geht entsprechend auch so
// Rechne...
$erg = $_POST['w1'] + $_POST['w2'];
// Werf Ergebnis raus.
echo "{$_POST['w1']} + {$_POST['w2']} = $erg";
?>
Die geschweiften Klammern ermöglichen dem Parser den direkten Zugriff auf eine doppelte Dereferenzierung und Ersetzung im String.
http://de3.php.net/manual/de/language.types.string.php
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
// importiere HTML Forumlar Daten
$w1 = $_POST['w1'];
$w1 = $_POST['w2'];Die Daten sind bereits aus den Parametern des Environments in Varibalen des Scripts umgewandelt. Es ist nicht notwedig, sie vor der Verwendung nochmals zu kopieren.
Nein sind die nicht - wenn register_globals off ist. Das mit dem Kopieren hat mache ich eigentlich immer a) weil ich an dieser Stelle bequem den User Input validieren kann und b) weil es sich fuer mich besser anfuehlt.
Die geschweiften Klammern ermöglichen dem Parser den direkten Zugriff auf eine doppelte Dereferenzierung und Ersetzung im String.
Mag ich persoenlich nicht - ich ziehe das konkatieren des Strings vor.
Hallo Jens,
Die Daten sind bereits aus den Parametern des Environments in Varibalen des Scripts umgewandelt.
Nein sind die nicht - wenn register_globals off ist.
Doch, selbstverständlich sind sie das - nämlich in den Arrays $_POST[], $_GET[], $_COOKIE[] usw.
Das mit dem Kopieren hat mache ich eigentlich immer a) weil ich an dieser Stelle bequem den User Input validieren kann und b) weil es sich fuer mich besser anfuehlt.
Okay, das kann man so stehenlassen. ;-)
Die geschweiften Klammern ermöglichen dem Parser den direkten Zugriff auf eine doppelte Dereferenzierung und Ersetzung im String.
Mag ich persoenlich nicht - ich ziehe das konkatieren des Strings vor.
Geschmackssache. Ich sehe keinen sachlichen Ansatzpunkt, nach dem eine der beiden Lösungen "besser" als die andere wäre - also mach es so, wie es dir besser gefällt.
Ciao,
Martin
Hello,
Die Daten sind bereits aus den Parametern des Environments in Varibalen des Scripts umgewandelt.
Nein sind die nicht - wenn register_globals off ist.Doch, selbstverständlich sind sie das - nämlich in den Arrays $_POST[], $_GET[], $_COOKIE[] usw.
Das mit dem Kopieren hat mache ich eigentlich immer a) weil ich an dieser Stelle bequem den User Input validieren kann und b) weil es sich fuer mich besser anfuehlt.
Okay, das kann man so stehenlassen. ;-)
nicht wirklich, da die Aktion damit wahrscheinlich mir einem Informationsverlust einhergeht.
Es ist und bleibt sinnvoll, die Übermittlungsmethoden getrennt identifizieren zu können.
Außerdem ist es oft sinnvoll, z. auch die Daten im $_POST-Array nochmals in Subarrays zu unterteilen, um sie "automatisiert" verarbeiten zu können.
Das stumpfe Umkopieren in "lose" Scriptvariablen vernichtet damit also wesentliche und wertvolle Fähigkeiten von PHP. Die Bindung von Variablen aufzulösen, oder von der Referenzebene (Array mit Elemente) auf die Namensebene (Variablen mit gleichem Präfix o.ä.) zu verlegen, ist nicht besonders klug.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom,
»»[...]
nicht wirklich, da die Aktion damit wahrscheinlich mir einem Informationsverlust einhergeht.
Es ist und bleibt sinnvoll, die Übermittlungsmethoden getrennt identifizieren zu können.
Definitiv richtig - es ist immer Sinnvoll zu wissen aus welcher Richtung die Daten kommen. Bei diesem trival Beispiel hat man noch leicht die Uebersicht, bei groesseren Projekten verliert man schnell die Übersicht. Im Allgemeinen importiere ich Variablen nur an einer Stelle im Code - um eine zentrale Validierung fahren zu können.
Verwendet man die SuperGlobals immer direkt muss ich bei jeder Verwendung validieren. Ich weiss das ist ein sehr starres Vorgehen, aber ich komme aus der Pascal Programmierung und das ist auch gut so ;)
Außerdem ist es oft sinnvoll, z. auch die Daten im $_POST-Array nochmals in Subarrays zu unterteilen, um sie "automatisiert" verarbeiten zu können.
Da spricht ja nix gegen - aber entweder werden mir die Daten automatisch zu Subarray zusammen gefasst (Formelementname test[]) oder ich mach das manuell - und da komme ich um das kopieren nicht mehr rum. Oder verstehe ich dich hier falsch?
Das stumpfe Umkopieren in "lose" Scriptvariablen vernichtet damit also wesentliche und wertvolle Fähigkeiten von PHP.
Das sehe ich definitv so nicht - denn
a) ich weiss 100%ig aus welcher Richtung die Variable kam
b) so kann diese in meinen Programmierparadigmen verwendet werden
c) die Validierung der Daten kann an einer zentralen Stelle passieren
Wenn die Validierung passiert ist, sollte es dem Rest des Programmes egal sein ob die Variable jetzt als POST, GET oder von der Brieftaube kommt und sollte man wider erwarten später doch noch mal diese Information benötigen, steht die Variable ja noch immer in der Super Global Variablen bereit.
»»Die Bindung von Variablen aufzulösen, oder von der Referenzebene (Array mit Elemente) auf die Namensebene (Variablen mit gleichem Präfix o.ä.) zu verlegen, ist nicht besonders klug.
Aehhh?! Man kann einfach das Array aus dem Super Global Array "rauskopieren". Gerade die bequeme Art der Arrays/Hashes ist eine der stärken von PHP - diese Macht wuerde selbst ich nicht verschmähen :)
Gruesse
Jens
Hello,
nicht wirklich, da die Aktion damit wahrscheinlich mir einem Informationsverlust einhergeht.
Es ist und bleibt sinnvoll, die Übermittlungsmethoden getrennt identifizieren zu können.Im Allgemeinen importiere ich Variablen nur an einer Stelle im Code - um eine zentrale Validierung fahren zu können.
Die Parameter sind bereits importiert und stehen nun in Elementen der Variable $_POST oder $_GET usw. zur Verfügung. Selbstverständlich kann man auch diese Arrays durchlaufen, und die darin befindlichen Elemente lesen und _beschreiben_, wenn es denn nötig ist.
Aehhh?! Man kann einfach das Array aus dem Super Global Array "rauskopieren". Gerade die bequeme Art der Arrays/Hashes ist eine der stärken von PHP - diese Macht wuerde selbst ich nicht verschmähen :)
Man braucht es noch nicht einmal "herauszukopieren". Man kann es gleich in der Originalfassung verwenden. Gegenprüfen gegen deine Variablendefinition kannst Du ebenfalls mit dem Original tun.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Tach,
Hello,
nicht wirklich, da die Aktion damit wahrscheinlich mir einem Informationsverlust einhergeht.
Es ist und bleibt sinnvoll, die Übermittlungsmethoden getrennt identifizieren zu können.Im Allgemeinen importiere ich Variablen nur an einer Stelle im Code - um eine zentrale Validierung fahren zu können.
Die Parameter sind bereits importiert und stehen nun in Elementen der Variable $_POST oder $_GET usw. zur Verfügung. Selbstverständlich kann man auch diese Arrays durchlaufen, und die darin befindlichen Elemente lesen und _beschreiben_, wenn es denn nötig ist.
Janein - ich habe die Variablen im lokalen Kontext lieber. Gobale Variablen verleiten zusehr zu unsauberen Code. Ausserdem habe ich irgendwo aufgeschnappt das es keine gute Idee ist in Super Globalen Variablen zu schreiben - kann den entsprechenden Text gerade nicht finden, oder bilde es mir nur ein, kann auch sein.
Aehhh?! Man kann einfach das Array aus dem Super Global Array "rauskopieren". Gerade die bequeme Art der Arrays/Hashes ist eine der stärken von PHP - diese Macht wuerde selbst ich nicht verschmähen :)
Man braucht es noch nicht einmal "herauszukopieren". Man kann es gleich in der Originalfassung verwenden. Gegenprüfen gegen deine Variablendefinition kannst Du ebenfalls mit dem Original tun.
Jedesmal wenn ich die Variable verwenden muss und nicht 100%ig sicher seinen kann das bereits eine Validierung stattfand?
Ich denke das wir hier zu keiner Lösung kommen, ein Richtig und ein Falsch gibt es in der Frage nicht - es ist alles Geschmackssache, sagte der Affe und biss in Seife :)
Hello,
Janein - ich habe die Variablen im lokalen Kontext lieber. Gobale Variablen verleiten zusehr zu unsauberen Code. Ausserdem habe ich irgendwo aufgeschnappt das es keine gute Idee ist in Super Globalen Variablen zu schreiben - kann den entsprechenden Text gerade nicht finden, oder bilde es mir nur ein, kann auch sein.
Dann musst Du die "Übernahme" aber auch innerhalb von Funktionen vornehmen. Anschließend sind aber die "übernommenen" Variablen wieder verschwunden. Außerhalb von Funktionen sind Skalare genauso global, wie Arrays oder Booleans usw.
Aehhh?! Man kann einfach das Array aus dem Super Global Array "rauskopieren". Gerade die bequeme Art der Arrays/Hashes ist eine der stärken von PHP - diese Macht wuerde selbst ich nicht verschmähen :)
Man braucht es noch nicht einmal "herauszukopieren". Man kann es gleich in der Originalfassung verwenden. Gegenprüfen gegen deine Variablendefinition kannst Du ebenfalls mit dem Original tun.
Jedesmal wenn ich die Variable verwenden muss und nicht 100%ig sicher seinen kann das bereits eine Validierung stattfand?
Das passiert mir immer nur, wenn ich am Vorabend der Programmierung vier Hefeweizen zuviel getrunken habe. Ein Programmierer sollte doch wohl wissen, wann er was veranlasst hat, und auch Mittel und Wege kennen, dass das Programm ihm Statusmeldungen gibt.
Entschuldige bitte, wenn ich Dir jetzt etwas nahe trete. Aber Du bist einfach unsicher und hast Dir noch keine Übnersicht verschafft, was da eigentlich passiert.
Die sogenannte "Übernahme" von Variablen findet allerdings in tausenden von Scripten im Internet statt und ist wohl klassisch gewachsen. Sie hat überhaupt keinen realen Nutzen, sondern verballert nur den verfügbaren Speicher und die Rechenzeit.
Bis PHP 5.x gab es auch noch eine wwitere unnötige Redundanz. Die alten $HTTP_*_VARS wurden auch immer noch parallel zu den $_POST, $_GET .... angelegt vom System. Ab PHP 5.x kann man diesen Unsinn dann wenigstens abschalten.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Die Summe von und ist 0
Wo liegt das Problem?
Das Problem daran wird sein, dass Dein Lehrbuch eher ein Leerbuch ist in Bezug auf das PHP von heute. Es berücksichtigt weder die Trennung der Scriptvariablen von den Requestparamtern (Stichwort "registger_globals"), noch die Trennung von Datenübernahme, Datenkontrolle, Datenverarbeitung und -manipulation, Datenaufbereitung und Ausgabe.
Es ist zwar durchaus möglich, HTML und PHP-Code wild zu mischen, aber solche Scripte sind später schwer wartbar und erzeugen meistens auch keine valide HTML-Ausgabe (das als Erfahrungswert).
Als erstes solltest Du Dich also in das Kapitel
http://de3.php.net/manual/en/language.variables.predefined.php
oder auf Deutsch
http://de3.php.net/manual/de/language.variables.predefined.php
einlesen.
Und dazu gehören dann auch verwandte Themen, wie
http://de3.php.net/manual/de/function.get-magic-quotes-gpc.php
http://de3.php.net/manual/de/ref.errorfunc.php
Bitte auch den weiterführenden Links folgen.
Schreibe in die erste Zeile Deines Scriptes
error_reporting(E_ALL); ## alle Fehler anzeigen lassen
oder setze den Wert in der php.ini-Datei auf 1.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
echo $begrüßung;
Schreibe in die erste Zeile Deines Scriptes
error_reporting(E_ALL); ## alle Fehler anzeigen lassen
oder setze den Wert in der php.ini-Datei auf 1.
Die 1 ist sicher nur ein Flüchtigkeitsfehler. Hier meinte der Meister, dass in der php.ini der Wert von error_reporting auf 2047 oder auch E_ALL gesetzt werden soll. Wenn es eine Konfiguration in einer Verzeichniskonfigurationsdarei (z.B. .htaccess) sein soll dann nur mit Zahlenwert:
php_value error_reporting 2047
echo "$verabschiedung $name";
Hello,
oder setze den Wert in der php.ini-Datei auf 1.
Die 1 ist sicher nur ein Flüchtigkeitsfehler. Hier meinte der Meister,
*oh*
Man soll wirlich nicht so im Fluge noch eine Antwort geben.
Ich danke Dir für die Korrektur.
Ist natürlich unverzeihlich, einen solchen Fehler zu posten. ;-)
Selbstverständlich hast Du Recht mit dem numerischen Wert 2047.
Das passende Kapitel sollte man aber trotzdem lesen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom