leer !== nicht existent
Beiträge von Arne Drews
-
-
Das klingt sehr verwirrend!
Was hat zweiter Code-Block mit erstem zu tun?
Ich weiß nicht, was für eine Notiz Du meinst... -
Hallo,
Code der außerhalb einer Fragestellung gepostet wird, schaue ich mir i.d.R. nicht an.
Deshalb die Frage: Hast Du bei dem Beispiel auch mal den Code angesehen und getestet? -
Ja, Leerzeichen sind auch Ausgaben für den Browser!
Als Tipp: Die Fehlermeldungen von PHP sagen i.d.R. recht deutlich, wo der Fehler liegt, man muß in den meisten Fällen nur übersetzen... -
Hallo,
Kannst Du das im Detail erläutern, mit konkreten Beispielen?
Gerne auch per PN, Skype oder E-Mail ( Mail-Adresse bitte per PN anfragen )gruß
Arne -
-
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... -
Hallo,
Das bringt Dir bei Checkboxen doch nichts, die haben ja einen Value, werden aber gar nicht erst übertragen, wenn sie nicht angeklickt sind...
-
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 DrewsDu 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 Stefvielen 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:
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: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:
Das nennt sich Trinitäts- bzw. Ternärer Operator und ist lediglich die Kurzform von dem hier:PHP
Alles anzeigenif ( isset($_POST['alter18']) ) { $sAge = $_POST['alter18']; } else { $sAge = '-18'; }
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:
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:
PHP
Alles anzeigen$aOffers = array_map( // Callback-Funktion mit Parametern für Wert und Schlüssel // $val: Wert des Array-Elements, hier der Preis // $key: Schlüssel des Array-Elements, hier die Angebotsnummer function ( $val, $key ) { // Rückgabe, bspw.: Angebot 2 = 30.99€ return 'Angebot ' . $key . ' = ' . $val; } // Array mit den Werten für $val , $_POST['angebot'] // Array mit den Werten für $key , array_keys( $_POST['angebot'] ) );
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:Gruß Arne
-
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:
HTML
Alles anzeigen<form action="bestellformular-auswertung.php" method="post"> <div> <label for="vname"><span>*</span> Ihr Vorname:</label> <input type="text" id="vname" name="name" required> <label for="nname"><span>*</span> Ihr Nachname:</label> <input type="text" id="nname" name="nachname" required> </div> <div> <span>*</span> Bist du 18 Jahre alt?<br> <label id="alter-ja">Ja</label><input type="radio" id="alter-ja" name="alter18" value="+18"> <label id="alter-nein">Nein</label><input type="radio" id="alter-nein" name="alter18" value="-18" required> </div> <div> <label for="email"><span>*</span> Ihre E-Mail-Adresse:</label> <input type="email" id="email" name="email" required> </div> <div> <p><label for="angebot1">Bilder</label><input type="checkbox" id="angebot1" name="angebot[1]" value="15.99€"></p> <p><label for="angebot2">Videos</label><input type="checkbox" id="angebot2" name="angebot[2]" value="30.99€"></p> <p><label for="angebot3">E-Book</label><input type="checkbox" id="angebot3" name="angebot[3]" value="15.99€"></p> <p><label for="angebot4">Buch</label><input type="checkbox" id="angebot4" name="angebot[4]" value="10.99€"></p> </div> <div> <input type="submit" name="submitted" value="Bestellen!"> </div> </form>
PHP
Alles anzeigen<?php // Diese beiden Zeilen werden nur zur Entwicklungszeit und beim Debuggen benötigt! error_reporting ( -1 ); ini_set ( 'display_errors', true ); if ( isset($_POST['submitted']) ) { $sFirstName = htmlspecialchars( $_POST['name'] ); $sLastName = htmlspecialchars( $_POST['nachname'] ); $sEmail = htmlspecialchars( $_POST['email'] ); $sAge = isset( $_POST['alter18'] )? $_POST['alter18']: '-18'; $aOffers = array_map( function ( $val, $key ) { return 'Angebot ' . $key . ' = ' . $val; } , $_POST['angebot'] , array_keys( $_POST['angebot'] ) ); $sOrderData = implode( PHP_EOL, array($sFirstName, $sLastName, $sAge, $sEmail) ) . PHP_EOL . implode( PHP_EOL, $aOffers ) . PHP_EOL; file_put_contents( 'auswertung.txt', $sOrderData, FILE_APPEND ); }
Ein Vorteil dieser Vorgehensweise ist, dass Du Deine Angebote im HTML-Formular beliebig erweitern kannst, aber den PHP-Part nie dafür anzufassen brauchst. -
-
Dein isset() kommt immer noch zu spät.
Was ist mit dem Link? Nicht verstanden oder keine Lust? -
Eine Ausbildung ist ja auch i.O. und in den meisten Fällen angebracht.
Vorteilhaft ist auch, dass Du dort Geld bekommst, anstatt es auszugeben -
Jo, siehe Link aus #2
Da wird dann auch erklärt, wie man das generell löst...
-
-
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 -
Hallo,
Bevor Du Geld für solche Fernstudien aus dem Fenster wirfst, solltest Du erstmal schauen, ob Du nicht auch so weiter kommst.
Meiner Meinung nach gibt es im Netz zu jedem Thema gute Tutorials ( natürlich auch massenhaft schlechte, also mit Bedacht wählen! ).Bei Tutorials solltest Du Dich immer auch mit den Inhalten befassen und "nachfragen".
Tutorials, die bspw. mit der mysql_* Extension von PHP arbeiten, sind offensichtlich veraltet, denn die gibts ab PHP7 endlich nicht mehr.Es gibt natürlich noch viele Kleinigkeiten, an denen man die Qualität eines Tutorials einschätzen kann, das alles aufzuzählen würde vermutlich den Rahmen sprengen und nicht der Vollständigkeit entsprechen.
Am besten, Du schaust Dir ein Tutorial an und checkst zu den verwendeten Funktionen parallel die offizielle Doku ( https://www.php.net ), dort sind immer auch Hinweise, falls eine Funktion evtl. veraltet sein sollte.
Weiterhin bietet die Doku auch zu den meisten Funktionen gute verständliche Beispiele.Wie gesagt, im Idealfall kannst Du Dir das Geld für so ein teures Fernstudium sparen.
-
Hallo,
Die Abfrage ist bereits enthalten, nur ist der Event-Listener ausserhalb dieser gesetzt.
Da müsstest Du das einfach umbauen: -
Wenn das passiert, hast Du an entsprechender Stelle die Abfrage auf den Typ des Input-Elements nicht gesetzt.
Zeig mal den Code... -
Im Prinzip ist die Prototype-Funktion nicht ganz korrekt, denn sie arbeitet eigentlich ausschließlich für zwei Dezimalstellen, daher könnte man den Parameter dec_cnt auch weglassen und mit einem festen Wert anstelle von _deccnt arbeiten.
Müsste eher so in etwa aussehen:
PHPNumber.prototype.roundDecimal = function( dec_cnt ) { _roundfactor = Math.pow( 10, dec_cnt ); return Math.round( this * _roundfactor ) / _roundfactor; }
Die Besonderheit bei Math.round ist, dass immer zur nächsten Ganzzahl aufgerundet wird:
Um jetzt auf zwei Nachkommastellen runden zu können, multipliziert man den Wert mit 100 ( 10² ) und führt darauf ein Math.round() aus.
Das Ergebnis teilt man dann wieder durch denselben Faktor ( 100 ) und erhält den gerundeten Wert auf zwei Nachkommastellen.Hier mal kurz der Rechenweg Schritt für Schritt:
PHP// Ausgangswert var _wert = 1.578; // mit 100 ( 10² ) multiplizieren, für 2 Nachkommastellen _ergebnis = Math.round( _wert * 100 ); // = Math.round( 157.8 ) = 158 // _ergebnis wieder durch 100 ( 10² ) teilen, um aus dem Integer ein Float mit 2 Nachkommastellen zu erzeugen _ergebnis = _ergebnis / 100; // = 1.58
Man kann da allerdings noch viel mehr draus machen, denn so super genau ist auch das nicht.