Beiträge von Arne Drews

    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...

    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 Drews

    Du 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 Stef

    vielen 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:

    PHP
    if ( isset($_POST['submitted']) ) {
    
    
        // ...Formulardaten sind vorhanden
    
    
    }

    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:

    PHP
    htmlspecialchars( $string, ENT_COMPAT, 'UTF-8' );

    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:

    PHP
    $sAge = isset( $_POST['alter18'] )? $_POST['alter18']: '-18';


    Das nennt sich Trinitäts- bzw. Ternärer Operator und ist lediglich die Kurzform von dem hier:

    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:

    Code
    // Inhalt von $_POST['angebot']:
    
    
    Array (
        [2] => 30.99€
        [4] => 10.99€
    )

    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:


    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:

    PHP
    file_put_contents( 'auswertung.txt', $sOrderData, FILE_APPEND );

    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:


    Ein Vorteil dieser Vorgehensweise ist, dass Du Deine Angebote im HTML-Formular beliebig erweitern kannst, aber den PHP-Part nie dafür anzufassen brauchst.

    Vermutlich eine Funktion, die nur über WLAN ausgeführt wird.
    Die SQL Query ist jedenfalls eindeutig fehlerhaft an dieser Stelle:

    Code
    ... WHERE ip = AND `hackcount` >= 1

    scheint so, als wenn er keine IP bekommt und in der Query nicht gesetzt wird bzw. als "leer" interpretiert wird.

    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:

    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:

    PHP
    Number.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:

    PHP
    Math.round( 1.4 ) // ergibt: 1
    Math.round( 1.5 ) // ergibt: 2


    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.
    ;)