kostenloser Webspace werbefrei: lima-city


Fehler bei php Formular

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    it-heberle

    Kostenloser Webspace von it-heberle, auf Homepage erstellen warten

    it-heberle hat kostenlosen Webspace.

    .

    anscheinend ist irgendwas bei adresse falsch, ich find aber nix...

    spendenformular:
    <html>
    <head>
    <title>Spendenformular f&uuml;r bedrohte V&ouml;gel</title>
    </head>
    <body>
    <form name="spende" action="spende.php" method="post"
    enctype="multipart/form-data">
    <input type="hidden" name="ausgabeZeit"
    value="<?php echo time();?>">
    <h1>Spendenformular</h1>
    Wir freuen uns, dass Sie spenden m&ouml;chten! Bitte
    geben Sie Ihren Namen, Ihre Adresse, die H&ouml;he der Spende und Ihre Kreditkartennummer ein. 
    Dr&uuml;cken Sie dann auf "Spende abschicken!"</p>
    <p>
    <b>Name:</b> <input type="text" name="spenderName" size="80"></p>
    <p><b>Adresse</b><br>
    <textarea name="adresse" rows="4" cols="40"></textarea></p>
    <p><b>H&ouml;he der Spende:</b>
    <select name="betrag">
    <?php
    for($i=5;$i<101;$i=$i+5){
    echo "<option value=\"".$i."\">".$i."&euro;\n";
    }
    ?>
    </select>
    <b>Spendenrhytmus</b>
    <select name="spendenRhytmus">
    <option value="einmalig">einmalig
    <option value="wöchentlich">w&ouml;chentlich
    <option value="monatlich">monatlich
    <option value="jährlich">j&auml;hrlich
    </select>
    
    &nbsp;
    <b>Ihr Foto</b> (optional): <input name="spenderFoto" type="file"></p>
    <p><b>Kreditkartentyp:</b>
    <input type="radio" name="kartenTyp" value="Visa">Visa
    &nbsp;
    <input type="radio" name="kartenTyp" value="Mastercard">Mastercard
    &nbsp;
    <input type="radio" name="kartenTyp" value="American Express">American Express
    </p>
    <p><b>Kreditkarteninhaber</b>
    <input type="text" name="Kreditkarteninhaber" size="80"></p>
    <p><b>Kreditkartennummer:</b>
    <input type="text" name="kreditKarte" size="20" maxlength="20">
    &nbsp;
    <b>Ablaufdatum:</b>
    <input type"text" name="ablaufDatum" size="4" maxlength=24 ></p>
    <b>Klicken sie hier, wenn wir Ihren Namen ver&ouml;ffentlichen d&uuml;rfen:</b>
    <input type="checkbox" name="oeffentlich" checked></p>
    <p><input type="submit" value="Spende abschicken!"></p>
    </form>
    </bod>
    </html>


    das auswertungsskript:
    <?php
        //Dieses Skript empfängt die Daten des Spendenformulars
        //Die Daten werden überprüft und dem benutzer zur Bestätigung angezeigt.
        $hack=false;
        //Daten der Bequemlichkeit aus $_Post auslesen
        $spenderName = $_POST["spenderName"];
        $adresse = $_POST["adresse"];
        $betrag = $_POST["betrag"];
        $spendenRhytmus = $_POST["spendenRhytmus"];
        $kartenTyp = $_POST["kartenTyp"];
        $kreditKarte = $_POST["kreditKarte"];
        $kartenInhaber =$_POST["kreditKartenInhaber"];
        $ablaufDatum =$_POST["ablaufDatum"];
        $oeffentlich =$_POST["oeffentlich"];
        $ausgabeZeit =$_POST["ausgabeZeit"];
        //Überprüfung der Daten
        //$spendername kann ein beliebiger String sein, sollte aber nicht leer sein
        if($spenderName ==""){$hack=true; $feld="Name";}
        //für Adresse gilt selbiges
        if($adresse ==""){$hack=true; $feld="Adresse";}
        //Betrag muss Ganze Zahl zwischen 5 und 100
        if(!preg_match("/^\d*[05]$/", $betrag)){$hack=true;$feld="Betrag";}
        if(($betrag<5)||($betrag>100)){$hack=true;$feld="Betrag";}
        //Kartentyp Visa oder Mastercard
        switch($kartenTyp){case "Visa":break;
        case "Masercard":break;
        default: $hack=true; $feld="Kartentyp";}
        //Kartennummer 15 oder 16 Ziffern ohne Leerzeichen oder Sonderzeichen
        if(!preg_match("/^(\d[\s\-]?){15,16}$/",$kreditKarte)){$hack=true; $feld="Kartennummer";}
        //Ablaufdatum ersten zwei zwischen 01und12 die dritte 1oder2 und die vierte zwischen 11und20
        if(!preg_match("/^(\d{2})[1,2][11-20]$/", $ablaufDatum, $match)){$hack=true; $feld="Ablaufdatum";}
        else{if(($match[1]<1)||($match[1]>12)) {$hack=true; $feld="Ablaufdatum";}}
        //Checkbox leer, on oder gehackt
        if(($oeffentlich!="")&&($oeffentlich!="on")){$hack=true; $feld="&ouml;ffentliche Spende";}
        //Ausgabezeit muss eine ganze Zahl sein
        if(!preg_match("/^\d+$/", $ausgabeZeit)){$hack=true; $feld="ausgabeZeit";}
        //Wurde ein Foto verschickt
        if($_FILES["spenderFoto"]["size"]>0){$foto=true;
        preg_match("/^\.\w+)$/",
        $_FILES["spenderFoto"]["name"],$match);
        $typ=$match[1];
        //es sind nur Bilddateien erlaubt, damit keine Skripte eingeschmuggelt werden können
        if(in_array(strlolower($typ),array(".gif",".bmp",".jpg",".jpeg"))){$dateiName=uniqid("").$typ;
        $bildPfad=
        preg_replace("/\/[^\/]+$/","",
        $_SERVER["SCRIPT_FILENAME"])
        ."/Bilder/";
        copy($_FILES["spenderfoto"]["tmp_name"],
        $bildPfad.$dateiName);}}
        else{$foto=false;}
        //Fehlermeldung anzeigen
        if($hack){?>
        <html>
        <head>
        <title>fuck you</title>
        </head>
        <body>
        <h1>Eingabefehler</h1>
        Ihre Eingabe im Feld <b><?php echo $feld; ?></b>
        war inkorrekt.
        </body>
        </html>
        <?php
        exit(); //Skript beenden
        }
            
        //Platzhalter für Skrpt zur Datenverarbeitung
        
        ?>
        //Daten zur Bestätigung an den Benutzer ausgeben
    <html>
    <head>
    <title>Eingabefehler</title>
    </head>
    <body>
    <h1>Liebe(r)<?php echo $spenderName;?></h1>
    <p>Haben sie vielen Dank f&uuml;r Ihre Spende &uuml;ber <?php echo $betrag;?>&euro;.
    Eine Spendenquittung schicken wir an Ihre Adresse:</p>
    <p><b><?php echo stripslashes(preg_replace("/\r?\n","<br>",$adresse));?></b></p>
    <p>Die Spende wird in einem <?php echo $spendenRhytmus;?>Rhytmus von Ihrer
    <b><?php echo $kartenTyp;?>-Kreditkarte mit Nummer:</p>
    <p><b><?php echo $kreditKarte;?></b>
    g&uuml;ltig bis <b><?php echo $ablaufDatum;?></b>abgebucht</p>
    <p>Karteninhaber ist <?php echo $kreditKartenInhaber;?></p>
    <?php}?>
    <p>Wir nehmen zur Kenntnis, dass wir Ihren Namen
    <? php 
    if ($oeffentlich==""){echo "nicht"}?>
    ver&ouml;ffentlichen d&uuml;rfen.</p>
    <p>Sie haben <?php echo (time()-$ausgabeZeit);?>
    Sekunden zum ausf&uuml;llen unseres Formulars gebraucht.</p>
    </body>
    </html>
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Öhm joah, was soll eigentlich das Script machen? Außerdem finde ich das PHP-Verarbeitungsscript ein bisschen schlecht. Sachen wie
    <head>
    <title>fuck you</title>
    </head>
    oder
    <body> mit </bod>
    zuzumachen ist nicht besonders vielsagend.
    Erzähl uns doch ein bisschen was du genau damit machen willst.
  4. t*****b

    it-heberle schrieb:
    anscheinend ist irgendwas bei adresse falsch, ich find aber nix...


    Naja, wenn du dir nicht die Mühe machst genau zu beschreiben, was nicht wie gewünscht funktioniert, wird sich hier keiner die Mühe machen nach Fehlern zu suchen...
  5. Autor dieses Themas

    it-heberle

    Kostenloser Webspace von it-heberle, auf Homepage erstellen warten

    it-heberle hat kostenlosen Webspace.

    ich versuche mir hier gerade mithilfe eines buches php beizubringen.
    den titel bitte ich zu entschuldigen!
    wie gesagt lerne ich gerade erst den umgang mit dieser sprache, weshalb mir die fehlersuche etwas schwerfällt.
    ich habe im endeffekt ein formular erstellt, mit textfeldern, auswahlfeldern, und textarea.das zweite skript soll die daten, die in dieses formular eingegeben werden auswerten und bei eingabefehlern diese zurückgeben oder bei reichtigkeit eine bestätigung abschicken.
    leider gibt es mir immer wieder andere fehler aus.
    erst war das datum falsch obwohl das ja hidden ist, und jetzt heißt es eben, die adresse ist falsch obwohl ich mit sicherheit weiß, dass ich diese richtig eingegeben habe.
    danke schonmal für den tipp mit </bod(y)>!
    hoffe das ist jetzt was ihr benötigt, ansonsten gerne nochmal nachfragen!
    DANKE
  6. Was ich gleich zu Anfang loswerden will: dein Code ist ziemlich unübersichtlich. Du solltest Code-Teile einrücken und jedem Befehl eine eigene Zeile spendieren, das macht dein Script dann wesentlich lesbarer. Auch ist es üblich vor und nach einem Operator ein Leerzeichen zu setzten.
    Zudem brauchst du in einem if-Statement einzelne Ausdrücke nicht extra einklammern (if($betrag < 5 || $betrag > 100) reicht anstatt if(($betrag < 5) ||( $betrag > 100))).
    Ich habe deinen Code jetzt ein wenig gegliedert und ein paar gefundene Fehler korrigiert (und mit Kommentaren darauf hingewiesen):
    <html>
    <head>
    	<title>Spendenformular f&uuml;r bedrohte V&ouml;gel</title>
    </head>
    <body>
    
    <form name="spende" action="spende.php" method="post" enctype="multipart/form-data">
    	<input type="hidden" name="ausgabeZeit" value="<?php echo time();?>">
    	<h1>Spendenformular</h1>
    	Wir freuen uns, dass Sie spenden m&ouml;chten! Bitte
    	geben Sie Ihren Namen, Ihre Adresse, die H&ouml;he der Spende und Ihre Kreditkartennummer ein. 
    	Dr&uuml;cken Sie dann auf "Spende abschicken!"</p>
    	<p>
    		<b>Name:</b>
    		<input type="text" name="spenderName" size="80">
    	</p>
    	<p>
    		<b>Adresse</b><br>
    		<textarea name="adresse" rows="4" cols="40"></textarea>
    	</p>
    	<p>
    		<b>H&ouml;he der Spende:</b>
    		<select name="betrag">
    <?php
    for($i=5;$i<101;$i=$i+5)
    {
    	echo "\t\t\t<option value=\"".$i."\">".$i."&euro;\n";
    }
    ?>
    		</select>
    		<b>Spendenrhytmus</b>
    			<select name="spendenRhytmus">
    			<option value="einmalig">einmalig
    			<option value="wöchentlich">w&ouml;chentlich
    			<option value="monatlich">monatlich
    			<option value="jährlich">j&auml;hrlich
    		</select>
    
    		&nbsp;
    		<b>Ihr Foto</b> (optional): <input name="spenderFoto" type="file">
    	</p>
    	<p>
    		<b>Kreditkartentyp:</b>
    		<input type="radio" name="kartenTyp" value="Visa">Visa
    		&nbsp;
    		<input type="radio" name="kartenTyp" value="Mastercard">Mastercard
    		&nbsp;
    		<input type="radio" name="kartenTyp" value="American Express">American Express
    	</p>
    	<p>
    		<b>Kreditkarteninhaber</b>
    		<!-- Achtung PHP-ist Case-Sensitiv (unterscheidet zwischen Groß- und Kleinschreibung) -->
    		<input type="text" name="kreditKartenInhaber" size="80">
    	</p>
    	<p>
    		<b>Kreditkartennummer:</b>
    		<input type="text" name="kreditKarte" size="20" maxlength="20">
    		&nbsp;
    		<b>Ablaufdatum <i>(Fromat: TT.MM.JJ ??)</i>:</b>
    <!-- '=', und Anführungszeichen Vergessen: -->
    		<input type="text" name="ablaufDatum" size="4" maxlength="24" >
    	</p>
    	<p><!-- p-Tag vergessen! -->
    		<b>Klicken sie hier, wenn wir Ihren Namen ver&ouml;ffentlichen d&uuml;rfen:</b>
    		<input type="checkbox" name="oeffentlich" checked>
    	</p>
    	<p><input type="submit" value="Spende abschicken!"></p>
    </form>
    
    </body>
    </html>
    <?php
    //Dieses Skript empfängt die Daten des Spendenformulars
    //Die Daten werden überprüft und dem benutzer zur Bestätigung angezeigt.
    $hack = false;
    //Daten der Bequemlichkeit aus $_Post auslesen
    $spenderName	= $_POST["spenderName"];
    $adresse	= $_POST["adresse"];
    $betrag		= $_POST["betrag"];
    $spendenRhytmus	= $_POST["spendenRhytmus"];
    $kartenTyp	= $_POST["kartenTyp"];
    $kreditKarte	= $_POST["kreditKarte"];
    $kartenInhaber	= $_POST["kreditKartenInhaber"];
    $ablaufDatum	= $_POST["ablaufDatum"];
    $oeffentlich	= $_POST["oeffentlich"];
    $ausgabeZeit	= $_POST["ausgabeZeit"];
    
    //Überprüfung der Daten
    //$spendername kann ein beliebiger String sein, sollte aber nicht leer sein
    if($spenderName == "")
    {
    	$hack = true;
    	$feld = "Name";
    }
    //für Adresse gilt selbiges
    if($adresse == "")
    {
    	$hack = true;
    	$feld = "Adresse";
    }
    //Betrag muss Ganze Zahl zwischen 5 und 100
    if(!preg_match("/^\d*[05]$/", $betrag))
    {
    	$hack = true;
    	$feld = "Betrag";
    }
    if($betrag < 5 || $betrag > 100)
    {
    	$hack = true;
    	$feld = "Betrag";
    }
    //Kartentyp Visa oder Mastercard
    switch ($kartenTyp)
    {
    	case "Visa":
    		break;
    	case "Masercard":
    		break;
    	default:
    		$hack=true;
    		$feld="Kartentyp";
    }
    //Kartennummer 15 oder 16 Ziffern ohne Leerzeichen oder Sonderzeichen
    if(!preg_match("/^(\d[\s\-]?){15,16}$/", $kreditKarte))
    {
    	$hack = true;
    	$feld = "Kartennummer";
    }
    //Ablaufdatum ersten zwei zwischen 01und12 die dritte 1oder2 und die vierte zwischen 11und20
    // Wie soll das Datum aussehen??
    if(!preg_match("/^(\d{2})[1,2][11-20]$/", $ablaufDatum, $match))
    {
    	$hack = true;
    	$feld = "Ablaufdatum 1";
    }
    else
    {
    	if($match[1] < 1 || $match[1] > 12) 
    	{
    		$hack = true;
    		$feld = "Ablaufdatum";
    	}
    }
    //Checkbox leer, on oder gehackt
    if($oeffentlich != "" && $oeffentlich != "on")
    {
    	$hack = true;
    	$feld = "&ouml;ffentliche Spende";
    }
    //Ausgabezeit muss eine ganze Zahl sein
    if(!preg_match("/^\d+$/", $ausgabeZeit))
    {
    	$hack = true;
    	$feld = "ausgabeZeit";
    }
    //Wurde ein Foto verschickt
    if($_FILES["spenderFoto"]["size"] > 0)
    {
    	$foto = true;
    	// Fehler in Regex: '^' passt nicht, da nicht am Anfang suchen, und '(' vergessen
    	preg_match("/(\.\w+)$/", $_FILES["spenderFoto"]["name"], $match);
    	$typ = $match[1];
    	//es sind nur Bilddateien erlaubt, damit keine Skripte eingeschmuggelt werden können
    	// Tippfehler bei strtolower():
    	if(in_array(strtolower($typ), array(".gif", ".bmp", ".jpg", ".jpeg")))
    	{
    		$dateiName = uniqid() . $typ; // leeren String übergeben sinnlos -> ist Standard in uniqid()
    		// zerlegen mit Regex ungeeignet; replace generell unpassend (wieso soll der Pfad ersetzt werden?)
    		//$bildPfad = preg_replace("/\/[^\/]+$/", "", $_SERVER["SCRIPT_FILENAME"]) . "/Bilder/";
    		// besser mit:
    		$bildPfad = dirname($_SERVER["SCRIPT_FILENAME"]);
    		copy($_FILES["spenderfoto"]["tmp_name"], $bildPfad . "/Bilder/" . $dateiName);
    	}
    }
    else
    {
    	$foto = false;
    }
    //Fehlermeldung anzeigen
    if($hack)
    {
    ?>
    <html>
    <head>
    	<!-- wir wollen zu unseren Benutzern doch nett sein ;-) -->
    	<title>Fehler bei der Eingabe</title>
    </head>
    <body>
    	<h1>Eingabefehler</h1>
    	Ihre Eingabe im Feld <b><?php echo $feld; ?></b> war inkorrekt.
    </body>
    </html>
    <?php
    	// exit() nicht nötig -> else ist sauberer
    }
    
    //Platzhalter für Skrpt zur Datenverarbeitung
    // Fehlt da was?
    //Daten zur Bestätigung an den Benutzer ausgeben (Kommentar war auserhaulb des php-Tags!)
    
    else	// Wenn kein Fehler aufgetreten ist, und nur DANN soll das Ergebnis ausgegeben werden!
    {
    ?>
    <html>
    <head>
    	<!-- Wieso Fehler ?! -->
    	<title>Eingabefehler</title>
    </head>
    <body>
    
    <h1>Liebe(r)<?php echo $spenderName; ?></h1>
    <p>
    	Haben sie vielen Dank f&uuml;r Ihre Spende &uuml;ber <?php echo $betrag; ?>&euro;.
    	Eine Spendenquittung schicken wir an Ihre Adresse:
    </p>
    <p>
    	<b><?php
    		//echo stripslashes(preg_replace("/\r?\n/","<br>", $adresse)); // '/' im Regex vergessen!
    		// nl2br-Methode ist besser geiegnet:
    		echo nl2br($adresse);
    	?></b>
    </p>
    <p>
    	Die Spende wird in einem <?php echo $spendenRhytmus; ?> Rhytmus von Ihrer
    	<b><?php echo $kartenTyp; ?>-Kreditkarte mit Nummer:
    </p>
    <p>
    	<b><?php echo $kreditKarte; ?></b>
    	g&uuml;ltig bis <b><?php echo $ablaufDatum; ?></b> abgebucht
    </p>
    <p>Karteninhaber ist <?php echo $kartenInhaber; // Achtung: falschen Variablen-Namen verwendet! ?></p>
    
    <!-- Was soll das hier? -->
    <?php // } ?>
    
    <p>
    	Wir nehmen zur Kenntnis, dass wir Ihren Namen
    	<?php // Achtung: Leerzeichen im PHP-Tag!
    	if ($oeffentlich == "")
    	{
    		echo "nicht"; // Strichpunkt vergessen!
    	}
    	?>
    	ver&ouml;ffentlichen d&uuml;rfen.
    </p>
    <p>
    	Sie haben <?php echo (time()-$ausgabeZeit); ?>
    	Sekunden zum ausf&uuml;llen unseres Formulars gebraucht.
    </p>
    </body>
    </html>
    <?php } // else-Zweig schließen ?>
    Was mir noch immer nicht klar ist, ist wie das Datum aussehen soll. Dein Regex hat mich da eher verwirrt und im Formular ist kein Hinweis darauf, wie das Datum aussehen soll! Abgesehen vom Datum sollte jetzt aber alles richtig verarbeitet werden.

    EDIT:
    Hab' den Dateiupload vergessen. Ist jetzt auch korrigiert.

    Beitrag zuletzt geändert: 30.1.2011 15:09:30 von metalmachine
  7. Du fragst das Datum so ab:
    <b>Ablaufdatum <i>(Fromat: TT.MM.JJ ??)</i>:</b>


    Erstmal gibt es beim Kreditkarten-Ablaufdatum keinen Tag, sondern nur Monat und Jahr.
    Zweitens empfehle ich dir die Auswahl per HTML-Select zu machen.
    Also ein Select von 01 bis 12 für den Monat, und eins mit 2011 bis z.b. 2030 für das Jahr.
    Dann hättest du schonmal eine einheitliche Ausgabe und müsstest nicht sowas wie 3/12 umständlich auswerten.

    Dann die Auswertung:
    //Ablaufdatum ersten zwei zwischen 01und12 die dritte 1oder2 und die vierte zwischen 11und20

    die dritte 1 oder 2?
    die vierte zwischen 11 und 20?
    hä?
    Mach es am besten wie oben beschrieben mit Select.
    Ansonsten nimm gleich die letzten 4 Ziffern und prüfe ob es zwischen 2011 und 2020 liegt.

    Das war jetzt der einzige Fehler der mir auffiel.

    EDIT:
    Sorry habe gerade gesehen dass der o.g. Fehler in deinem Script garnicht auftritt sondern nur in der korrektur über mir.

    Beitrag zuletzt geändert: 30.1.2011 21:37:00 von eu-b99
  8. Autor dieses Themas

    it-heberle

    Kostenloser Webspace von it-heberle, auf Homepage erstellen warten

    it-heberle hat kostenlosen Webspace.

    wow, vielen dank!

    allerdings stehe ich vor einem kleinen problem und zwar löscht es mir die eingaben im formular, wenn ich auf "abschicken" drücke.

    what can i do?
  9. Du könntest zum Beispiel das Textfeld so schreiben:
    <?php
    echo "<input type='text' name='feld' value=$feld />";
    ?>


    Beim auslesen empfehle ich dann, die Variablen der Auslese denen der Value-Variable anzupassen. Nun bleibt bei mir der Inhalt erhalten.
    Bei der Auslese empfehle ich außerdem die verwendung von:
    $feld = htmlspecialchars(trim($_POST["feld"]));

    Diese Funktionen "entschärfen" potenziell gefährliche Eingaben.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!