Hallo allemaal,

Op mijn site http://www.vanbaasbank.nl zit ik met de volgende uitdaging:
Ik krijg <input required> niet goed werkend.
In Google Chrome werkt alles met onderstaande script goed maar in andere browsers werkt het required niet volledig en/of de melding vanuit de browser dat het veld een verplicht veld is, komt niet.
Wie heeft een suggestie?

De HTML5-code:


<?php

/**
 * @author 		George van Baasbank
 * @package		vanbaasbank
 * @subpackage		reactie
 * @copyright		Ermelo Software
 * @since		16-7-2012
 * bestandsnaam		reactie.inc
 * beschrijving		Contactformulier
 * aangeroepen door	-
 * roept aan		-		
 * opmerking		Geoptimaliserd voor HTML5 en CSS3
 * taalmodule		-
 * functies             functiebieb
 * e-mail		[email protected]
 * project		Nieuwe website Van Baasbank
 * 
 */ 
 

session_start();

error_reporting(0);

if(isset($_SERVER['REMOTE_ADDR'])) {
    $cIpadres = $_SERVER['REMOTE_ADDR'];
} else {
    $cIpadres = "Onbekend";
}
 
if(isset($_SERVER['HTTP_USER_AGENT'])) {
    $cBrowser = $_SERVER['HTTP_USER_AGENT'];
} else {
    $cBrowser = "Onbekend";
}

// Declaratie variabelen
$cPaginanaam = "reactie";
$nAantalFouten = 0;

// Laden functiebibliotheek
include "functies/functiebieb.inc";

// Geïndexeerde array met maanden
$aMaanden = array (
1 => 'januari',
     'februari',
     'maart',
     'april',
     'mei',
     'juni',
     'juli',
     'augustus',
     'september',
     'oktober',
     'november',
     'december'
);

if(isset($_POST['submit'])) {
    
    $cNaam          = $_POST['naam'];
    $cEmailbezoeker = $_POST['emailadres'];
    $cOnderwerp     = $_POST['onderwerp'];
    $cBericht       = $_POST['bericht'];
    
    $cNaam          = htmlentities(trim(strip_tags($cNaam)));
    $cEmailbezoeker = htmlentities(trim(strip_tags($cEmailbezoeker)));
    $cOnderwerp     = htmlentities(trim(strip_tags($cOnderwerp)));
    $cBericht       = htmlentities(trim(strip_tags($cBericht)));
    
    // Converteer emailadres naar ondercast
    $cEmailbezoeker = TekstinOndercast($cEmailbezoeker);
            
    if($cOnderwerp != "" AND $cBericht != "" AND $cEmailbezoeker != "" AND $cNaam != "" ) {  // Alle velden correct ingevuld
        
        // Constanten voor mysql_connect() insluiten:
        require_once('mysql_connect.inc.php');

        // Databaseverbinding openen:
        $verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die("Verbinding mislukt: " . mysql_error());

        // Database selecteren:
        mysql_select_db("xxxxxxxxxxxx") or die("Kon de database niet openen: " . mysql_error());
        
        // Query samenstellen
        $sql = "INSERT INTO aanvullingen (ipadres, email, naam, bericht, persoon, datum)";
        $sql .= "VALUES ('$cIpadres','$cEmailbezoeker','$cNaam','$cBericht','$cOnderwerp',NOW())";
        
        $cResultMail = mysql_query($sql);
        
        // Sluiten database
        mysql_close($verbinding);
        
        header("Location: bevestiging.php");
        exit();

    }
}

// Databases scannen voor opmaak pagina
include "opmaak.inc";
include "jarig.inc";

// Database sluiten
mysql_close($verbinding);

?>


<!doctype html>
<html lang = "nl">
<head>
    <!-- Begin metatags en titel -->
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> 
    <meta name="robots" content="index, follow" />
    <meta name="revisit-after" content="3 days" />
    <meta name="keywords" content="<?php echo $cMetaKeywords ; ?>" />
    <meta name="author" content="<?php echo $cMetaAuteur ; ?>" />
    <meta name="web_author" content="<?php echo $cMetaWebAuteur ; ?>" />
    <meta name="description" content="<?php echo $cMetaDescription ; ?>" />
    <meta name="copyright" content="Ermelo Software 2012" />
	<title><?php echo $cMetaTitel ; ?></title>
    <!-- Einde metatags en titel -->
    <!-- Begin stylesheets en scripts -->
    <!--[if lt IE 9]><script src="scripts/html5shiv.js"></script><![endif]-->
	<meta charset="utf-8" />
	<title>VanBaasbank.nl | Contactformulier</title>
	<link rel="stylesheet" href="css/styles.css" type="text/css" media="screen" />
    <link rel="stylesheet" href="css/formulier.css" type="text/css" media="screen" />
	<link rel="stylesheet" type="text/css" href="css/print.css" media="print" />
	<script type="text/javascript"
        src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js">
    </script> 
	<script type="text/javascript" src="js/simpletabs.js"></script> 
	<link rel="stylesheet" type="text/css" href="css/lightbox.css" media="screen" />
	<script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.lightbox-0.5.js"></script>
	<!--[if IE]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
    <script type="text/javascript">
        $(function() {
        $('a[@rel*=lightbox]').lightBox(); // Select all links that contains lightbox in the attribute rel
        });
    </script>
    <!-- Einde stylesheets en scripts -->
</head>

<body>
    <div id="wrapper"><!-- #wrapper -->
        <header><!-- header -->
            <h1><a href="#"><?php echo $cWebsitenaam ; ?></a></h1>
            <h2><?php echo $cHeader1 ; ?>'</h2>
            <img src="<?php echo $cHeaderafbeelding ; ?>" width="940" height="200" alt="" /><!-- header image -->
        </header><!-- end of header -->
        
        <!-- Invoegen hoofdmenu -->
        <?php include "menu.inc" ; ?>
        <!-- Einde invoegen hoofdmenu -->
	
	<section id="main"><!-- #main content and sidebar area -->
        <section id="content"><!-- #content -->
            
                <!-- Contactformulier -->
                <article class="featured">
                    <div class="autokader">
                        <h3>Contactformulier</h3>
                        <form action="reactie.php" method="POST">
                            <label for="naam">Uw naam <sup>*</sup></label>
                            <input name="naam" placeholder="Uw volledige naam" required />
                                                        
                            <label for="email">Uw e-mailadres <sup>*</sup></label>
                            <input type="email" name="emailadres" placeholder="[email protected]" required />
                            
                            <label for="onderwerp">Onderwerp <sup>*</sup></label>
                            <input type="text" name="onderwerp" placeholder="Het onderwerp van uw reactie" required />
                            
                            <label for="bericht">Uw bericht <sup>*</sup></label>
                            <textarea rows="6" id="bericht" name="bericht" placeholder="Uw bericht" required="required" ></textarea>   
                             
                            <div class="regelhoogte50"></div>
                            
                            <label for="submit" class="centerit" title="KLik hier om uw bericht te verzenden">
                            <input type="submit" name="submit" value="Verzenden bericht" /></label>
                            
                        </form>
                    </div>
                </article>
                <!-- Einde contactformulier -->
                
            </section><!-- end of #content -->
            <aside id="sidebar"><!-- sidebar -->
                <div class="tabwidget"> 
                    <ul class="tabs"> 
                        <li><a href="#tab1">Nieuws</a></li> 
                        <li><a href="#tab2">Genealogie</a></li>
                        <li><a href="#tab3">Over mij</a></li>
                    </ul> 
                    <div class="tab_container"> 
                        <div id="tab1" class="tab_content"> 
                            <h3>Recente Artikelen</h3> 
                            <ul>
                                <?php 
                                    while($row = mysql_fetch_array($cResultTicker)) {
                                ?>
                                <li><a href="artikel.php?id=<?php echo $row['id'] ; ?>">*&nbsp;<?php echo $row['kop'] ; ?><br /></a></li>
                                <?php } ?>
                            </ul>
                        </div>
                        
                        <!-- Invoegen hyperlinken Genealogie -->
                        <?php include "genealogielinken.inc"; ?>
                        <!-- Einde invoegen genealogielinken -->
                          
                        <div id="tab3" class="tab_content"> 
                            <h3>Wie ben ik</h3> 
                            <img src="<?php echo $cMijnFoto ; ?>" alt="" /><p><?php echo $cMijnInfo ; ?></p>
                        </div>
                    </div>
                </div>
  	    
  	      <div class="standard">
            <!-- De jarige van de dag -->
            <?php
            $cDag = date('d');
            $cMaand = date('n');
            ?>
        	<h3>Geboren <?php echo $cDag . " ". $aMaanden[$cMaand] ; ?></h3>
            <?php 
                $cTest = "";
                while($row = mysql_fetch_array($cResultJarige)) {
                    $cX = "(". substr($row['g_sortdatum'],2,4) . ") " . $row['eerste'] ." " . $row['tussenvoeg'] . " " . $row['achternaam'];
                    $cIdnummer = $row['id'];
                    $cHyperlink = "kleinekaart.php?id=".$cIdnummer;
                    if($cIdnummer != $cTest){
                        $cTest  = $cIdnummer;
            ?>
                <p class="kleineletter"><a href="<?php echo $cHyperlink ; ?>"><?php echo $cX ; ?></p></a>
            <?php
            } }
            ?>
            <!-- Einde jarige van de dag -->
            
            <!-- Advertentie met hyperlink -->
            <h3></h3>
            <a href="<?php echo $cAdvHyperlink ; ?>" target="_blank"><img src="<?php echo $cSponsor ; ?>" alt="Sponsor" /></a><br /><br />
            <!-- Einde advertentie -->
            
            <!-- Sociale media -->
            <h3>Connect With Us</h3>
            <ul>
                <li><a href="http://www.twitter.com/opzondag" target="_blank"><img src="images/twitter-banner.jpg" alt="twitter" /></a></li>
                <li><a href="#">Facebook</a></li>
            </ul>
            <!-- Einde sociale media -->
        </div>
    </aside><!-- end of sidebar -->
    
	</section><!-- end of #main content and sidebar-->
	
	<!-- Invoegen kruimelpad footer -->
	<?php include "footer.inc" ; ?>
    <!-- Einde invoegen kruimelpad -->
</div><!-- #wrapper -->
<!-- Free template created by http://freehtml5templates.com -->
</body>
</html>


De bijbehorende CSS3-code:


	/*
    Deze css is bestemd voor het valideren van het invuldocument
    */
    
	.clear { clear: both; }

	form { 
		width: 		410px;  
		padding: 	20px 30px; 
		margin: 	0 auto; 
		color: 		#fff;
		overflow: 	hidden;
		-moz-border-radius:  	20px; 
		-webkit-border-radius:  20px; 
		border-radius: 			20px;  
		-moz-box-shadow:	0px 0px 10px #690011;
		-webkit-box-shadow:	0px 0px 10px #690011;
		-ms-box-shadow:	0px 0px 10px #690011;
		box-shadow:	0px 0px 10px #690011;
	}
	
	label { 
		position:	relative;
		clear:  	both; 
		display: 	block; 
		text-shadow: 0px -1px 0px #000; 
		text-shadow: 0 -1px rgba(0,0,0,0.5);  
		font-family: Arial,sans-serif; 
	}
	
	sup { color: red; }
	
	input { 
		font-size:			14px; 
		margin-bottom:		25px;
		border: 			2px solid #690011; 
		padding: 			8px; 
		background: 		#fff; 
		color: 				#696969; 
		width: 				385px;  
		-webkit-box-shadow: inset 0px 2px 2px rgba(0,0,0,0.2); 
		-moz-box-shadow: 	inset 0px 2px 2px rgba(0,0,0,0.2); 
		-ms-box-shadow: 	inset 0px 2px 2px rgba(0,0,0,0.2); 
		box-shadow: 		inset 0px 2px 2px rgba(0,0,0,0.2); 
	}
	
	input:focus { 
		border: 			2px solid #33c400; 
		-webkit-box-shadow:	none; 
		-moz-box-shadow: 	none; 
		box-shadow: 		none; 
	}
	
	input[type=date],
	input[type=number],
	input[type=submit] { 
		-moz-border-radius:  0px; 
		-webkit-border-radius:  0px; 
		border-radius:  		0px; 
		width: 				auto; 
	}

	input[type=checkbox] { 
		display: 			inline; 
		font-size:			14px; 
		border: 			none;
		width: 				auto;  
		padding: 			10px;
		margin: 			0px;
		margin-bottom: 		-7px;
	}
    
    textarea {
        width:              400px;
        height:             150px;
        color: 				#696969; 
        font-family:        Arial;
        font-size:          14px;
    }
    
	input:invalid { background: #efdee0 url(images/invalid.png) no-repeat center right; }
	input:valid { background: #f3f8ed url(images/valid.png) no-repeat center right; }
    
    textarea:invalid { background: #efdee0 url(images/invalid.png) no-repeat top right;}
	textarea:valid { background: #f3f8ed url(images/valid.png) no-repeat top right; }	
	
	
	input[type=submit] { 
		background: 		#F2D99C; 
		display: 			inline-block; 
		padding: 			5px 10px 6px; 
		color: 				#690011; 
		text-decoration: 	none; 
		font-weight: 		bold;  
		border: 			none; 
		position: 			relative; 
		cursor: 			pointer; 
		font-size: 			16px; 
		margin-top:			30px;
		font-family: 		Helvetica, Arial;
		-moz-border-radius: 5px; 
		-webkit-border-radius: 5px; 
		-ms-border-radius: 	5px; 
		border-radius: 		5px; 
		-moz-box-shadow: 	0 1px 3px #999; 
		-webkit-box-shadow: 0 1px 3px #999; 
		-ms-box-shadow: 	0 1px 3px #999; 
		box-shadow: 		0 1px 3px #999; 
		text-shadow: 		0 -1px 1px #fff; 		
		-webkit-transition: all 0.2s linear
	}
	
	input[type=submit]:hover	{ 
		background-color: 	#E5B96F;
		-webkit-transform:	scale(1.1); 
		-moz-box-shadow: 	0 1px 6px #000; 
		-webkit-box-shadow: 0 1px 6px #000; 
		box-shadow: 		0 1px 6px #000; 
	}
	
	
	.legal { 
		clear:				both;
		font-size:			10px; 
		margin: 			15px 0; 
		color: 				#fff; 
		text-shadow: 		0px -1px 0px #000; 
		text-shadow: 		0 -1px rgba(0,0,0,0.5); 
	}
	
	.centerit {
		text-align: 		center;
	}


Bezoek de site eens en probeer het contactformulier te verzenden zonder de velden in te vullen.

George van Baasbank
George van Baasbank op 08/08/2012 12:09:48


<?php

if(isset($_POST['submit'])) {
    
    $cNaam          = $_POST['naam'];
    $cEmailbezoeker = $_POST['emailadres'];
    $cOnderwerp     = $_POST['onderwerp'];
    $cBericht       = $_POST['bericht'];
    
    $cNaam          = htmlentities(trim(strip_tags($cNaam)));
    $cEmailbezoeker = htmlentities(trim(strip_tags($cEmailbezoeker)));
    $cOnderwerp     = htmlentities(trim(strip_tags($cOnderwerp)));
    $cBericht       = htmlentities(trim(strip_tags($cBericht)));
    
    // Converteer emailadres naar ondercast
    $cEmailbezoeker = TekstinOndercast($cEmailbezoeker);
            
    if($cOnderwerp != "" AND $cBericht != "" AND $cEmailbezoeker != "" AND $cNaam != "" ) {  // Alle velden correct ingevuld
        
        // Constanten voor mysql_connect() insluiten:
        require_once('mysql_connect.inc.php');

        // Databaseverbinding openen:
        $verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die("Verbinding mislukt: " . mysql_error());

        // Database selecteren:
        mysql_select_db("xxxxxxxxxxxx") or die("Kon de database niet openen: " . mysql_error());
        
        // Query samenstellen
        $sql = "INSERT INTO aanvullingen (ipadres, email, naam, bericht, persoon, datum)";
        $sql .= "VALUES ('$cIpadres','$cEmailbezoeker','$cNaam','$cBericht','$cOnderwerp',NOW())";
        
        $cResultMail = mysql_query($sql);
        
?>


Volgens mij is onderstaande al vaker tegen je gezegd, maar kennelijk is alleen belangrijk dat het (ogenschijnlijk) werkt :(
Controle of een formulier is verzonden niet met if(isset($_POST['submit']))
Waarom variabelen (onnodig) kopiëren. Tot 2x toe.
Geen 'or die' in een script, maar nette foutafhandeling (db-verbinding)
Variabelen buiten quotes in je query.
Mis volledige foutafhandeling bij je query.

Maar ach. Het werkt.....

Ten aanzien van je vraag:
Welke browser(versies) heb je het over? HTML5 schijnt nog niet door alle browsers te worden ondersteunt.
In Google Chrome en Chrome Canary werkt alles zoals bedoeld (met hint als veld niet is ingevuld) Safari 5.1 en IE9 reageren op dit moment helemaal niet en de mogelijke invoer wordt nu tegengegaan door regel 76 uit mijn HTML-code.

Leermoment: Iets eenmaal aangeleerd is moeilijk af te leren. Wat is de correcte vervanger voor if(isset($_POST['submit']))???

Wat is de nette foutafhandeling in de db-verbinding? (Vervanger voor "or die"???
if(isset($_POST['submit']))

Vervang je door

if($_SERVER['REQUEST_METHOD'] === 'POST')

In plaats van te vragen "Heeft iemand op de knop gedrukt", vraag je: "Gaat het hier om een POST, in plaats van een GET request"
dat komt omdat required pas na IE10 volledig ondersteunt wordt en na safari 5.0... dus safari zou het wel moeten doen?? maar IE kan inderdaad kloppen..

zie ook

Required
Nu, de vraag is maar of je dit echt erg moet vinden.

HTML is een taal die geschreven is om om te kunnen gaan met evolutie.
Ofwel begrijpt de browser het, ofwel wordt het genegeerd.

Neem als voorbeeld de <input>. Een input heeft standaard type="text".
Als je dit zou schrijven:
<input type="komkommer"> , wordt dat type genegeerd en wordt het gewoon een type="text".
Dit maakt dat je die types naar harte lust kan uitbreiden.

Nieuwe browsers weten dat <input type="email"> een e-mail moet bevatten. Oudere browsers negeren dit en behandelen het als type="text"

SOWIESO moet je in php alles nog eens dubbel checken.
In php moet je controleren of de de required velden ingevuld zijn, of de e-mailadressen geldig zijn, of numerieke waarden echt numeriek zijn, ... en dit ongeacht of dit al eens gecontroleerd is op client side.

Schrijf dus je code alsof je die required niet ter beschikking hebt, maar dat het een gebruiksvriendelijk extra'tje is voor de mensen met moderne browser.
Klopt niet elke browser ondersteund nog/al de 'nieuwe' opties van html5

in jou geval word Required nu nog alleen ondersteund door: Firefox, Chrome en Opera.

En ja sommige mensen zeggen wel dat IE alles al heeft alleen onder een andere benaming
maar ik zie niet in hoe je iets onder een andere benaming kan zetten of hebben als het een vaste Attribuut is... dus ze lopen gewoon achter in deze :P

Maar zoals hierboven ook al gezegd is moet je nu nog (en eigenlijk altijd) alles dubbel (3 dubbel: php, javascript/jquery/mootools/enze, html5) opvangen en controleren in PHP want niet alles en iedereen ondersteund het nog. of hebben een instelling waardoor ze andere dingen niet ondersteunen of accepteren.

Reageren