Zur Navigation

Formularfeld Eingabe überprüfen

1 tobi

Ich würde gerne bei meinem Formular folgendes noch einbauen.

Das Feld TTR soll überprüfen, dass nur Zahlen eingetragen werden können und dies max. 4 sind.
Zum anderen soll irgendwie überprüft werden, ob die Zahlen innerhalb eines bestimmten Zahlenbereiches liegen und dann entsprechend eine Fehlermeldung ausgeben.
'Aktive C mit QTTR von 1100 bis 1450 - Turniertag 2 - Sonntag 11. September 2016';
Aktive B mit QTTR von 1400 bis 1600 - Turniertag 2 - Sonntag 11. September 2016';
Aktive A mit QTTR von 1550 bis 3000 - Turniertag 2 - Sonntag 11. September 2016';

Kannst du helfen?

    
            <!-- Anfang Linker Inhalt -->
            <div id="linkerinhalt">
    <title>Anmeldung</title>

<?php

include_once('zugang_ppc.php.inc');

$max_aklasse=64;
$max_bklasse=64;
$max_cklasse=64;

// sql-Abfrage 1 - Ermitteln Anzahl A-Klasse + Teilweise Damen A (Turnierklasse = 3)
$query = mysqli_query($mysqli, 'SELECT Count(*) FROM anmeldungen_2016_sonntag WHERE gemeldeteKlasse = \'3\'');
list($num_aklasse) = mysqli_fetch_row($query);
// sql-Abfrage 2 - Ermitteln Anzahl B-Klasse + Teilweise Damen A (Turnierklasse = 2)
$query = mysqli_query($mysqli, 'SELECT Count(*) FROM anmeldungen_2016_sonntag WHERE gemeldeteKlasse = \'2\'');
list($num_bklasse) = mysqli_fetch_row($query);
// sql-Abfrage 3 - Ermitteln Anzahl C-Klasse + Teilweise Damen A (Turnierklasse = 1)
$query = mysqli_query($mysqli, 'SELECT Count(*) FROM anmeldungen_2016_sonntag WHERE gemeldeteKlasse = \'1\'');
list($num_cklasse) = mysqli_fetch_row($query);
unset($query);
?>
<?php
//begin POST form check
$show_form = false;
//entweder einfacher Check (nur namen angeben), oder erweiterter via Regularexpression ([name,regex,errormsg])
$frm_field = array(
    array(
        'email',
        '/^[\w\-\.\+]+@([\w\-]+\.?)+$/',
        'Bitte gültige E-Mail eintragen!'
    ),
    'vorname',
    'nachname',
    array(
        'geschlecht',
        '/^(M|W)$/',
        'Bitte Geschlecht auswählen!'
    ),
    array(
        'geburtsjahr',
        '/^(19|20)\d\d$/',
        'Bitte gültiges Geburtsjahr eintragen (z.B. 1967)!'
    ),
    'ttr',
    'verein',
    array(
        'turnierklasse',
        '/^[1-5]$/',
        'Bitte gültige Turnierklasse auswählen!'
    ),
    array(
        'email_alt',
        '/(^[\w\-\.\+]+@([\w\-]+\.?)+$|^$)/',
        'Optionales Feld, darf leer gelassen werden oder weitere gültige E-Mail eintragen!'
    )
);
$frm_error = array();
if (isset($_POST['email'])) {
    foreach ($frm_field as $val) {
        if (!is_array($val)) {
            if (empty($_POST[$val])) {
                $_POST[$val]     = '';
                $frm_error[$val] = ' <span class="rot">Bitte ausfüllen!</span>';
                $show_form       = true;
            } else
                $frm_error[$val] = '';
        } else {
            if (!isset($_POST[$val[0]])) {
                $_POST[$val[0]]     = '';
                $frm_error[$val[0]] = ' <span class="rot">Bitte ausfüllen!</span>';
                $show_form          = true;
            } elseif (!preg_match($val[1], $_POST[$val[0]])) {
                $frm_error[$val[0]] = ' <span class="rot">' . $val[2] . '</span>';
                $show_form          = true;
            } else
                $frm_error[$val[0]] = '';
        }
    }
} else {
    foreach ($frm_field as $val) {
        if (is_array($val)) {
            if (!isset($_POST[$val[0]]))
                $_POST[$val[0]] = '';
            $frm_error[$val[0]] = '';
        } elseif (!isset($_POST[$val])) {
            $_POST[$val]     = '';
            $frm_error[$val] = '';
        }
    }
    $show_form = true;
}
unset($frm_field);
//vom check oben nicht betroffen (da optional)
if (!isset($_POST['eintrag']))
    $_POST['eintrag'] = '';
if (!isset($_POST['turnierklasse_ex']))
    $_POST['turnierklasse_ex'] = '';
//end POST form check

if (!$show_form) { //sende anfrage / eintragen
    $_POST['turnierklasse'] = intval($_POST['turnierklasse']);
    $turnierklassestr       = '';
//    $altSignUp              = ($num_sonntag >= $max_sonntag); //case 1&2 change it again
$altSignUp              = ($num_cklasse >= $max_cklasse || $num_bklasse >= $max_bklasse || $num_aklasse >= $max_aklasse);	

    switch ($_POST['turnierklasse']) {
        case 1:
            $turnierklasse    = 'Aktive C';
            $turnierklassestr = 'Aktive C mit QTTR von 1100 bis 1450 - Turniertag 2 - Sonntag 11. September 2016';
            $startgeld        = '10€';
            $vorkasse         = '9€';
			$altSignUp 		  = ($num_cklasse >= $max_cklasse); 
            break;
        case 2:
            $turnierklasse    = 'Aktive B';
            $turnierklassestr = 'Aktive B mit QTTR von 1400 bis 1600 - Turniertag 2 - Sonntag 11. September 2016';
            $startgeld        = '10€';
            $vorkasse         = '9€';
			$altSignUp 		  = ($num_bklasse >= $max_bklasse); 
            break;
        case 3:
            $turnierklasse    = 'Aktive A';
            $turnierklassestr = 'Aktive A mit QTTR von 1550 bis 3000 - Turniertag 2 - Sonntag 11. September 2016';
            $startgeld        = '10€';
            $vorkasse         = '9€';
			$altSignUp 		  = ($num_aklasse >= $max_aklasse); 
            break;
    }
    if (mysqli_fetch_object(mysqli_query($mysqli, 'SELECT * FROM `anmeldungen_2016_sonntag` WHERE `vorname` = \'' . mysqli_real_escape_string($mysqli, $_POST['vorname']) . '\' AND `nachname` = \'' . mysqli_real_escape_string($mysqli, $_POST['nachname']) . '\' LIMIT 1'))) {
?><p><span class="rot"><b>Die Anmeldung ist Fehlgeschlagen!<br/>Die von dir angegebene Person <?php
        echo $_POST['vorname'] . ' ' . $_POST['nachname'];
?> ist bereits angemeldet.</b></span></p>
                </p><?php
        $show_form = false;
    } else { //eintragen
        $mysqli_query = ' 
INSERT INTO `anmeldungen_2016_sonntag`
(`vorname`, `nachname`, `geschlecht`, `geburtsjahr`, `ttr`, `email`, `verein`, `gemeldeteKlasse`, `anmerkung`, `timestamp`)
VALUES
(\'' . mysqli_real_escape_string($mysqli, $_POST['vorname']) . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['nachname']) . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['geschlecht']) . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['geburtsjahr']) . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['ttr']) . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['email']) . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['verein']) . '\', \'' . $_POST['turnierklasse'] . '\', \'' . mysqli_real_escape_string($mysqli, $_POST['eintrag']) . '\', NOW())';
        if (mysqli_query($mysqli, $mysqli_query)) { //Bestätigungsemail an den Anmeldenden
            
            $mail = new PHPMailer;
           //Mailinhalte zensiert 

            //Text der EMail setzen
            $mail->Body = $text;
            
            //EMail senden und überprüfen ob sie versandt wurde
            if (!$mail->Send()) {
                //$mail->Send() liefert FALSE zurück: Es ist ein Fehler aufgetreten
                echo "Es gab bei der übermittelung der Daten ein kleines Problem. Bitte wiederhole den Vorgang oder kontaktiere uns bitte via E-Mail";
                echo "Fehler: " . $mail->ErrorInfo;
            } else {
                //$mail->Send() liefert TRUE zurück: Die Email ist unterwegs
                echo "<br />Eine Bestätigung deiner Anmeldung/Anfrage ist soeben an dich gesendet worden.";
            }
            { //Mail an die Turnierleitung
                
                $mail = new PHPMailer;
              //Mailinhalte zensiert 
                 
                //Text der EMail setzen
                $mail->Body = $text;
                
                //EMail senden und überprüfen ob sie versandt wurde
                if (!$mail->Send()) {
                    //$mail->Send() liefert FALSE zurück: Es ist ein Fehler aufgetreten
                    echo "Es gab bei der übermittelung der Daten ein kleines Problem. Bitte wiederhole den Vorgang oder kontaktiere uns bitte via E-Mail";
                    echo "Fehler: " . $mail->ErrorInfo;
                } else {
                    //$mail->Send() liefert TRUE zurück: Die Email ist unterwegs
                    echo "<br />Die Anmeldung/Anfrage ist an die Turnierleitung übermittelt worden.";
                }
                
                //    $show_form=true;
            }
        } else {
            die ('<b>MySQL Error:</b><div class="rot">' . mysqli_error($mysqli) . '</div><br/>');
            $show_form = true;
        }
    }
}
if ($show_form) //zeige Formular
    { //führt das aus, wenn die mail adresse noch ned angegeben wurde oder sonst wie das Formular nicht stimmt.
    //ausgabe bzw. setzen von "turnierklasse" vereinfachen
    //Formular für Zusatzangaben wie E-Mail-Adresse, Mitteilung, etc.
?>
<h1>Anmeldung</h1>    
<p>für den Turniertag 2, Sonntag den 11.09.2016</p>
<p>Bitte jetzt folgende Felder ausfüllen. Die Teilnahme in einer höheren Turnierklasse ist möglich (bitte angeben), nicht aber ein Start in mehreren Wettbewerben.<br />
*Die Angabe der E-Mail-Adresse ist von Nöten, da wir an diese Adresse die Bestätigungsemail verschicken. </p>
<form name="blub" method="post" action="anmeldung-sonntag.php">
<table><tr>
    <td><label for="vorname">Vorname:</label></td>
    <td><input name="vorname" type="text" id="vorname" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['vorname'] . '"/>' . $frm_error['vorname']);
?></td>
</tr>
<tr>
    <td><label for="nachname">Nachname:</label></td>
    <td><input name="nachname" type="text" id="nachanme" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['nachname'] . '"/>' . $frm_error['nachname']);
?></td>
</tr>
<tr>
    <td>Geschlecht:</td>
    <td><select name="geschlecht"><option value="1">Bitte auswählen</option><option value="M"<?php
    echo (($_POST['geschlecht'] == 'M' ? ' selected="selected"' : ''));
?>>männlich</option><option value="W"<?php
    echo (($_POST['geschlecht'] == 'W' ? ' selected="selected"' : ''));
?>>weiblich</option></select><?php
    echo $frm_error['geschlecht'];
?></td>
</tr>
<tr>
    <td><label for="ttr">(Q-)TTR (11.08.2016):</label></td>
    <td><input name="ttr" type="text" id="ttr" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['ttr'] . '"/>' . $frm_error['ttr']);
?></td>
</tr>
<tr>
    <td>Turnierklasse:</td>
    <td><select name="turnierklasse">
    <option>Bitte auswählen</option>
    <?php
    /*Samstag*/
	$sunfull_cklasse = ($num_cklasse >= $max_cklasse ? 'full' : 'gruen');
	$sunfull_bklasse = ($num_bklasse >= $max_bklasse ? 'full' : 'gruen');
	$sunfull_aklasse = ($num_aklasse >= $max_aklasse ? 'full' : 'gruen');
?>
   <option value="1" class="<?php echo $sunfull_cklasse; ?>"
   <?php echo ($_POST['turnierklasse'] == 1 ? ' selected="selected"' : ''); ?>
   >Aktive C mit QTTR von 1100 bis 1450 - Turniertag 2 - Sonntag 11. September 2016</option>
   <option value="2" class="<?php echo $sunfull_bklasse; ?>"
   <?php echo ($_POST['turnierklasse'] == 2 ? ' selected="selected"' : ''); ?>
   >Aktive B mit QTTR von 1400 bis 1600 - Turniertag 2 - Sonntag 11. September 2016</option>
   <option value="3" class="<?php echo $sunfull_aklasse; ?>"
   <?php echo ($_POST['turnierklasse'] == 3 ? ' selected="selected"' : ''); ?>
   >Aktive A mit QTTR von 1550 bis 3000 - Turniertag 2 - Sonntag 11. September 2016</option>
   </select><?php
    echo $frm_error['turnierklasse'];
?>
</td></tr>
<?php		
	  if (in_array('full', array($sunfull_cklasse, $sunfull_bklasse, $sunfull_aklasse))) {
?><tr><td colspan="2" class="rot" style="text-align:center;font-size:80%;">Hinweis: eine oder mehrere Turnierklassen sind derzeit belegt, Anmeldung für die gewünschte Turnierklasse ist dennoch unter Vorbehalt möglich!</td></tr><?php
    }
?>
<tr><td colspan="2">&nbsp;&nbsp;&nbsp;&nbsp;<input name="turnierklasse_ex" type="checkbox" id="turnierklasse_ex" value="1"<?php
    echo (intval($_POST['turnierklasse_ex']) ? ' checked="checked"' : '');
?>/> <label for="turnierklasse_ex">Ich habe mich freiwillig eine Klasse höher gemeldet</label></td></tr>
<tr>
    <td><label for="email">E-Mail*:</label></td>
    <td><input name="email" type="text" id="email" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['email'] . '"/>' . $frm_error['email']);
?></td>
</tr>
<tr>
    <td><label for="email_alt">E-Mail 2 (optional):</label></td>
    <td><input name="email_alt" type="text" id="email_alt" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['email_alt'] . '"/>' . $frm_error['email_alt']);
?></td>
</tr>
<tr>
    <td><label for="geburtsjahr">Geburtsjahr:</label></td>
    <td><input name="geburtsjahr" type="text" id="geburtsjahr" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['geburtsjahr'] . '"/>' . $frm_error['geburtsjahr']);
?></td>
</tr>
<tr>
    <td><label for="verein">Verein:</label></td>
    <td><input name="verein" type="text" id="verein" size="70" maxlength="50" class="eingabe" value="<?php
    echo ($_POST['verein'] . '"/>' . $frm_error['verein']);
?></td>
</tr>
<tr>
    <td valign="top"><label for="email">Anmerkung:</label></td>
    <td><textarea name="eintrag" cols="65" rows="7" id="eintrag" class="eingabe"><?php
    echo ($_POST['eintrag']);
?></textarea></td>
</tr>
</table><p><input type="submit" value="Anmeldung abschließen"/></form></p><?php
}
?>
               
                
                <div class="clear"></div>
   
            </div>
            <!-- Ende Linker Inhalt -->
           

20.07.2016 07:26

2 Jörg Kruse

Den Minimal- und Maximalwert kannst du ja in der switch Anweisung definieren, wobei ich den String $turnierklassestr dann einfach nur noch zusammenbauen würde:

switch ($_POST['turnierklasse']) {
    case 1:
        $turnierklasse    = 'Aktive C';
        $min_ttr          = 1100;
        $max_ttr          = 1450;
        $turnierklassestr = $turnierklasse ' mit QTTR von ' . $min_ttr . ' bis ' . $max_ttr . ' - Turniertag 2 - Sonntag 11. September 2016';
        /* ... */
        break;
    /* ... */
}

Dann kannst du weiter unten $_POST['ttr'] mit diesen Werten vergleichen. Mit dem Pattern '/^[1-9][0-9]{3}$/' kannst du zudem überpüfen, ob der String einer vierziffrigen Zahl entspricht, d.h. eine Ziffer von 1 bis 9 und drei Ziffern von 0 bis 9.

if (preg_match('/^[1-9][0-9]{3}$/', $_POST['ttr']) && $_POST['ttr'] >= $min_ttr && $_POST['ttr'] <= $max_ttr) {
    // OK
} else {
    // Fehlermeldung
}

20.07.2016 14:10 | geändert: 20.07.2016 14:13

3 tobi

hier muß ich nichts definieren?
$frm_field = array(
...
'ttr',
...

an welcher Stelle muß ich
if (preg_match('/^[1-9][0-9]{3}$/', $_POST['ttr']) && $_POST['ttr'] >= $min_ttr && $_POST['ttr'] <= $max_ttr) {
    // OK
} else {
    // Fehlermeldung
}
platzieren?

21.07.2016 07:46

4 Jörg Kruse

Zitat von tobi
hier muß ich nichts definieren?
$frm_field = array(
...
'ttr',
...

Achso, dort validierst du ja bereits die Eingaben. '/^[1-5]$/' matcht auf die Zahlen 1 bis 5. Du kannst ja den regulären Ausdruck aus Beitrag 2 verwenden, dann werden die Zahlen 1000 bis 9999 erfasst:

    array(
        'turnierklasse',
        '/^[1-9][0-9]{3}$/',
        'Bitte gültige Turnierklasse auswählen!'
    ),

Wobei du oben schreibst:

dass nur Zahlen eingetragen werden können und dies max. 4 sind.

Damit wären ja eher 1 bis 9999 gemeint? das sollte mit dem Ausdruck '/^[1-9][0-9]{0,3}$/' gehen

an welcher Stelle muß ich
if (preg_match('/^[1-9][0-9]{3}$/', $_POST['ttr']) && $_POST['ttr'] >= $min_ttr && $_POST['ttr'] <= $max_ttr) {
    // OK
} else {
    // Fehlermeldung
}
platzieren?

(Die erste Bedingung kannst du jetzt weglassen, die wird ja jetzt schon innerhalb von $frm_field geprüft)

Platzieren musst du das nach dem Switch, denn erst dort stehen dir $min_ttr und $max_ttr zur Verfügung. In den Abschnitt, wo jetzt "// OK" steht, kannst du dann den Rest des Codes reinschieben, der innerhalb von "if (!$show_form) { }" steht. Denn der soll ja nur ausgeführt werden, wenn die Zahlen im zulässigen Bereich liegen

21.07.2016 21:16

5 tobi

Nun kriege ich eine weiße seite und der Errorlog spuckt folgendes aus:
PHP Parse error: syntax error, unexpected '' mit QTTR von '' (T_CONSTANT_ENCAPSED_STRING)

bezogen auf Zeile 153:
$turnierklassestr = $turnierklasse ' mit QTTR von ' . $min_ttr . ' bis ' . $max_ttr . ' - Turniertag 2 - Sonntag 11. September 2016';

21.07.2016 22:22 | geändert: 21.07.2016 22:23

6 Jörg Kruse

Da fehlt noch ein Verknüpfungspunkt:

$turnierklassestr = $turnierklasse . ' mit QTTR von ' . $min_ttr . ' bis ' . $max_ttr . ' - Turniertag 2 - Sonntag 11. September 2016';

22.07.2016 10:16

7 tobi

PHP Parse error: syntax error, unexpected '<' in / on line 182
Zeile 182 müßte des nach // Fehlermeldung seien. wobei ich nicht weiß ob
	if (preg_match( $_POST['ttr']) && $_POST['ttr'] >= $min_ttr && $_POST['ttr'] <= $max_ttr) {
    // OK
182		} else {
    // Fehlermeldung
	<?php echo 'Deine TTR Punkte sind außerhalb des ausgewählten Wettbewerbes'; ?>
	}
an de richtigen Stelle platziert ist.
switch ($_POST['turnierklasse']) {
        case 1:
            $turnierklasse    = 'Aktive C';
			$min_ttr          = 1100;
			$max_ttr          = 1450;
			$turnierklassestr = $turnierklasse . ' mit QTTR von ' . $min_ttr . ' bis ' . $max_ttr . ' - Turniertag 2 - Sonntag 11. September 2016';
 //           $turnierklassestr = 'Aktive C mit QTTR von 1100 bis 1450 - Turniertag 2 - Sonntag 11. September 2016';
            $startgeld        = '10€';
            $vorkasse         = '9€';
			$altSignUp 		  = ($num_cklasse >= $max_cklasse); 
            break;
        case 2:
            $turnierklasse    = 'Aktive B';
			$min_ttr          = 1400;
			$max_ttr          = 1600;			
            $turnierklassestr = $turnierklasse . ' mit QTTR von ' . $min_ttr . ' bis ' . $max_ttr . ' - Turniertag 2 - Sonntag 11. September 2016';
            $startgeld        = '10€';
            $vorkasse         = '9€';
			$altSignUp 		  = ($num_bklasse >= $max_bklasse); 
            break;
        case 3:
            $turnierklasse    = 'Aktive A';
			$min_ttr          = 1550;
			$max_ttr          = 3000;	
            $turnierklassestr = $turnierklasse . ' mit QTTR von ' . $min_ttr . ' bis ' . $max_ttr . ' - Turniertag 2 - Sonntag 11. September 2016';
            $startgeld        = '10€';
            $vorkasse         = '9€';
			$altSignUp 		  = ($num_aklasse >= $max_aklasse); 
            break;
    }
	if (preg_match( $_POST['ttr']) && $_POST['ttr'] >= $min_ttr && $_POST['ttr'] <= $max_ttr) {
    // OK
		} else {
    // Fehlermeldung
	<?php echo 'Deine TTR Punkte sind außerhalb des ausgewählten Wettbewerbes'; ?>
	}

22.07.2016 10:41

8 Jörg Kruse

Die '<?php' und '?>' sind hier falsch - es findet hier ja kein Wechsel von HTML- auf PHP-Code statt

		} else {
    // Fehlermeldung
	 echo 'Deine TTR Punkte sind außerhalb des ausgewählten Wettbewerbes';
	}

Wenn du die nochmalige Validierung aus der Bedingung rausnehmen willst, dann musst du nicht nur das Pattern entfernen, sondern den ganzen Ausdruck von preg_match() wie auch das verknüpfende &&

if ($_POST['ttr'] >= $min_ttr && $_POST['ttr'] <= $max_ttr) {

An Stelle von '// OK' muss dann noch wie gesagt der Code, der zur Asuführung kommen soll, wenn $_POST['ttr'] im korrekten Bereich liegt

22.07.2016 11:42

9 tobi

Wenn ich
    // OK
		} else {
    // Fehlermeldung
	echo 'Deine TTR Punkte sind außerhalb des ausgewählten Wettbewerbes';
	}
einfüge, dann wird aktuell mein Formular überhaupt nicht mehr aufgezeigt.

22.07.2016 12:23

10 Jörg Kruse

Überhaupt nicht mehr? hast du Kontrollstrukturen (if, else, switch etc.) alle korrekt verschachtelt?

An der Stelle, wo '// OK' steht, sollte ja auch noch Code ausgeführt werden, der nach dem Switch folgte, siehe meine Anmerkungen in Beitrag 4 und 8. Der Code nach dem "if (!$show_form) { ... }" darf da natürlich nicht rein!

Vielleicht postest du nochmal den Gesamtcode

22.07.2016 18:01 | geändert: 22.07.2016 18:02