Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<h1>Version 1 (omitting AJAX)</h1> <p>Well, pretty much you have it done, as far as for adding new items:</p> <pre><code>&lt;form id="ContactForm" action="php/contact.php" method="post"&gt; </code></pre> <p>Then, further adjustments should be done at server-side validation and presenting result stage:</p> <pre><code>/* Errors exist */ if($this-&gt;countErrors() &gt; 0){ $json = array( 'result' =&gt; -1, 'errors' =&gt; array( array('name' =&gt; 'contactpersoon' ,'value' =&gt; $this-&gt;error_value('contactpersoon')), array('name' =&gt; 'bedrijfsnaam' ,'value' =&gt; $this-&gt;error_value('bedrijfsnaam')), array('name' =&gt; 'email' ,'value' =&gt; $this-&gt;error_value('email')), array('name' =&gt; 'telefoon' ,'value' =&gt; $this-&gt;error_value('telefoon')), array('name' =&gt; 'vraag1_antwoorden' ,'value' =&gt; $this-&gt;error_value('vraag1_antwoorden')), array('name' =&gt; 'vraag2_antwoorden' ,'value' =&gt; $this-&gt;error_value('vraag2_antwoorden')), ) ); // The code below is an example and was not tested // you have to do similar thing for "insert into db" section echo("&lt;ol&gt;"); echo("Please correct the followin errors:") foreach ($json['errors'] as $item) { echo("&lt;li&gt;".$item['value']."&lt;/li&gt;"); } echo("&lt;/ol&gt;"); } /* No errors, insert in db*/ else{ if(($ret = $this-&gt;db-&gt;dbNewMessage($contactpersoon, $bedrijfsnaam, $email, $telefoon, $vraag1_antwoorden, $vraag2_antwoorden)) &gt; 0){ $json = array('result' =&gt; 1); if(SEND_EMAIL) $this-&gt;sendEmail($contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden); //the code below is an example, it includes result.php file include('result.php'); } else $json = array('result' =&gt; -2); /* something went wrong in database insertion */ $encoded = json_encode($json); echo $encoded; unset($encoded); } </code></pre> <p>Hints:</p> <ol> <li>You don't need JSON here.</li> <li>If you want to keep it simple, just echo HTML with errors or inserted data, where $encoded = json_encode($json) variable gets assigned (both cases, if and else).</li> <li>Make sure, that HTML form action points to you contact.php file.</li> <li>Then, result.php won't be needed.</li> <li>Major disadvantage is that reloading your page will keep adding new contact info if it's not checked at server-side validation.</li> </ol> <h1>Version 2 (displaying errors to your users)</h1> <p>This case will require you to redesign flow of your form, and this is what we want to achieve:<br> 1. A form is presented to your user (form.php).<br> 2. User fills out form (form.php).<br> 3. Form is being submitted (form.php, data is being sent to form.php).<br> 4a. Form is valid, insert data to database and present result page (form.php, then result php), OR<br> 4b. Form is invalid, present errors to user (form.php, submit will bring user back to point 3). </p> <p>Therefore: Form code you posted has to be adjusted: 1. First, put your current php/contact.php file's contents on top of it. 2. Then, each table row containing form input field has to be adjusted to present errors that were made.<br> 3. If-else block has to be adjusted to have header("Location: "); to produce redirect to result page. </p> <p>So, it'll be somewhere along the following.</p> <p>form.php (code wasn't tested but should have no semantic errors, you should put your html and meta definitions just after '?>' and before ''):</p> <pre><code>&lt;?php require_once("db.php"); /* Database Class */ require_once('utils/is_email.php'); /* Email Validation Script */ /* Handle Ajax Request */ if(isset($_POST['newcontact'])){ $contact = new Contact(); //We'll refer to that later on, to display errors. //unset($contact); } else{ //header('Location: ../result.php'); } /* Class Contact */ class Contact{ private $db; /* the database obj */ //private $errors = array(); /* holds error messages */ //we have to init $errors array, as otherwise form will produce errors on missing array entry private $errors = array( /* holds error messages */ 'bedrijfsnaam' =&gt; '', 'email' =&gt; '', 'telefoon' =&gt; '', 'vraag1_antwoorden' =&gt; '', 'vraag2_antwoorden' =&gt; '' ); private $num_errors; /* number of errors in submitted form */ public function __construct(){ $this-&gt;db = new DB(); if(isset($_POST['newcontact'])) $this-&gt;processNewMessage(); /* We don't need this anymore * else header('Location: ../result.php');*/ } public function processNewMessage(){ $contactpersoon = $_POST['contactpersoon']; $bedrijfsnaam = $_POST['bedrijfsnaam']; $telefoon = $_POST['telefoon']; $email = $_POST['email']; $vraag1_antwoorden = $_POST['vraag1_antwoorden']; $vraag2_antwoorden = $_POST['vraag2_antwoorden']; /* Server Side Data Validation */ /* Contactpersoon Validation */ if(!$contactpersoon || mb_strlen($contactpersoon = trim($contactpersoon)) == 0) $this-&gt;setError('contactpersoon', 'Vul uw contactpersoon in'); else if(mb_strlen(trim($contactpersoon)) &gt; 120) $this-&gt;setError('contactpersoon', 'Te lang! 120 karakters max.'); /* Bedrijfsnaam Validation */ if(!$bedrijfsnaam || mb_strlen($bedrijfsnaam = trim($bedrijfsnaam)) == 0) $this-&gt;setError('bedrijfsnaam', 'Vul uw bedrijfsnaam in'); else if(mb_strlen(trim($bedrijfsnaam)) &gt; 120) $this-&gt;setError('bedrijfsnaam', 'Te lang! 120 karakters max.'); /* Telefoon Validation */ if(!$telefoon || mb_strlen($telefoon = trim($telefoon)) == 0) $this-&gt;setError('telefoon', 'Vul uw telefoonnummer in'); else if(mb_strlen(trim($telefoon)) &gt; 120) $this-&gt;setError('telefoon', 'Te lang! 120 karakters max.'); /* Vraag 1 Validation */ if(!$vraag1_antwoorden || mb_strlen($vraag1_antwoorden = trim($vraag1_antwoorden)) == 0) $this-&gt;setError('vraag1_antwoorden', 'Selecteer een antwoord a.u.b.'); /* Vraag 2 Validation */ if(!$vraag2_antwoorden || mb_strlen($vraag2_antwoorden = trim($vraag2_antwoorden)) == 0) $this-&gt;setError('vraag2_antwoorden', 'Selecteer een antwoord a.u.b.'); /* Email Validation */ if(!$email || mb_strlen($email = trim($email)) == 0) $this-&gt;setError('email','Vul uw e-mail in'); else{ if(!is_email($email)) $this-&gt;setError('email', 'Vul een correct email adres in'); else if(mb_strlen($email) &gt; 120) $this-&gt;setError('email', 'Te lang! 120 karakters max.'); } /* Errors exist */ /*if($this-&gt;countErrors() &gt; 0){ $json = array( 'result' =&gt; -1, 'errors' =&gt; array( array('name' =&gt; 'contactpersoon' ,'value' =&gt; $this-&gt;error_value('contactpersoon')), array('name' =&gt; 'bedrijfsnaam' ,'value' =&gt; $this-&gt;error_value('bedrijfsnaam')), array('name' =&gt; 'email' ,'value' =&gt; $this-&gt;error_value('email')), array('name' =&gt; 'telefoon' ,'value' =&gt; $this-&gt;error_value('telefoon')), array('name' =&gt; 'vraag1_antwoorden' ,'value' =&gt; $this-&gt;error_value('vraag1_antwoorden')), array('name' =&gt; 'vraag2_antwoorden' ,'value' =&gt; $this-&gt;error_value('vraag2_antwoorden')), ) ); } /* No errors, insert in db else*/ if($this-&gt;countErrors() == 0) { if(($ret = $this-&gt;db-&gt;dbNewMessage($contactpersoon, $bedrijfsnaam, $email, $telefoon, $vraag1_antwoorden, $vraag2_antwoorden)) &gt; 0){ //$json = array('result' =&gt; 1); if(SEND_EMAIL) $this-&gt;sendEmail($contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden); //This is for relocating to successful result page header('Location: ../result.php'); } else { // else // $json = array('result' =&gt; -2); /* something went wrong in database insertion */ //This will need special treatment. You have to prepare an errorpage //for database-related issues. header("Location: database-error.html"); } /*$encoded = json_encode($json); echo $encoded; unset($encoded);*/ } } public function sendEmail($contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden){ /* Just format the email text the way you want ... */ $message_body = "&lt;div style=\"font-size:12px; font-weight:normal;\"&gt;Hallo,&lt;br&gt;&lt;br&gt;" ."Het volgende bedrijf heeft zich zojuist aangemeld:&lt;/div&gt;&lt;br&gt;" ."&lt;table cellpadding=\"1\" cellspacing=\"1\" width=\"550px\"&gt;&lt;tr&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;Bedrijfsnaam:&lt;/td&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;".$bedrijfsnaam."&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;Contactpersoon:&lt;/td&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;".$contactpersoon."&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;Telefoonnummer:&lt;/td&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;".$telefoon."&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;E-mail:&lt;/td&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;".$email."&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;Antwoord vraag 1:&lt;/td&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;".$vraag1_antwoorden."&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;Antwoord vraag 2:&lt;/td&gt;&lt;td style=\"font-size:12px; color:#000000\"&gt;".$vraag2_antwoorden."&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;"; // Geef GELDIGE adressen op // Een korte benaming voor jouw website $website_naam = 'Aanmelding'; // Jouw eigen geldige emailadres $eigen_emailadres = 'EMAIL'; // Een geldig emailadres voor errors $error_emailadres = 'EMAIL'; // De naam van de verzender $naam_verzender = ''.$bedrijfsnaam.''; // Het geldige emailadres van de afzender $email_verzender = ''.$email.''; // Een geldig emailadres of helemaal leeg laten $bcc_emailadres = ''; // HTML mail? True/False $html = true; // De headers samenstellen $headers = 'From: ' . $website_naam . ' &lt;' . $eigen_emailadres . '&gt;' . PHP_EOL; $headers .= 'Reply-To: ' . $naam_verzender . ' &lt;' . $email_verzender . '&gt;' . PHP_EOL; $headers .= 'Return-Path: Mail-Error &lt;' . $error_emailadres . '&gt;' . PHP_EOL; $headers .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . PHP_EOL : ''; $headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL; $headers .= 'X-Priority: Normal' . PHP_EOL; $headers .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : ''; $headers .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL : ''; mail(EMAIL_TO,MESSAGE_SUBJECT,$message_body,$headers); } public function setError($field, $errmsg){ $this-&gt;errors[$field] = $errmsg; $this-&gt;num_errors = count($this-&gt;errors); } public function error_value($field){ if(array_key_exists($field,$this-&gt;errors)) return $this-&gt;errors[$field]; else return ''; } public function countErrors(){ return $this-&gt;num_errors; } }; ?&gt;&lt;table&gt; &lt;form id="ContactForm" action="php/contact.php" method="post"&gt; &lt;tr class="rij_contactpersoon"&gt; &lt;td class="left_td"&gt;Contactpersoon&lt;/td&gt; &lt;td&gt; &lt;input id="contactpersoon" name="contactpersoon" class="inplaceError" maxlength="120" type="text" class="error" autocomplete="off" onFocus="window.scrollTo(0, 0);"/&gt; &lt;span class="error" style="display:none; margin-left:40px;"&gt; &lt;!-- You have to repeat that for every input field below. --&gt; &lt;?php echo($contact-&gt;error_value('contactpersoon')) ?&gt; &lt;/span&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr class="rij_bedrijf"&gt; &lt;td class="left_td"&gt;Bedrijfsnaam&lt;/td&gt;&lt;td&gt;&lt;input id="bedrijfsnaam" name="bedrijfsnaam" class="inplaceError" maxlength="120" type="text" autocomplete="off" onFocus="window.scrollTo(0, 0);"/&gt;&lt;span class="error" style="display:none; margin-left:40px;"&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="left_td"&gt;E-mail&lt;/td&gt;&lt;td&gt;&lt;input id="email" name="email" class="inplaceError" maxlength="120" type="text" autocomplete="off" onFocus="window.scrollTo(0, 0);"/&gt;&lt;span class="error" style="display:none; margin-left:40px;"&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="left_td"&gt;Telefoonnummer&lt;/td&gt;&lt;td&gt;&lt;input id="telefoon" name="telefoon" class="inplaceError" maxlength="120" type="text" autocomplete="off" onFocus="window.scrollTo(0, 0);"/&gt;&lt;span class="error" style="display:none; margin-left:40px;"&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="left_td"&gt;Question 1&lt;/td&gt;&lt;td&gt;&lt;div class="sizer"&gt;&lt;label class="label_radio" for="vraag1_A"&gt;&lt;input name="vraag1_antwoorden" id="vraag1_A" value="A" type="radio" /&gt;A) 10 Ohm&lt;/label&gt;&lt;label class="label_radio" for="vraag1_B"&gt;&lt;input name="vraag1_antwoorden" id="vraag1_B" value="B" type="radio" /&gt;B) 1 Ohm&lt;/label&gt;&lt;label class="label_radio" for="vraag1_C"&gt;&lt;input name="vraag1_antwoorden" id="vraag1_C" value="C" type="radio" /&gt;C) 0,1 Ohm&lt;/label&gt;&lt;label class="label_radio" for="vraag1_D"&gt;&lt;input name="vraag1_antwoorden" id="vraag1_D" value="D" type="radio" /&gt;D) Geen eis&lt;/label&gt;&lt;/div&gt;&lt;span id="vraag1_antwoorden" class="foutmelding_quiz" style="display:none;"&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="left_td"&gt;Question 2&lt;/td&gt;&lt;td&gt;&lt;div class="sizer"&gt;&lt;label class="label_radio" for="vraag2_A"&gt;&lt;input name="vraag2_antwoorden" id="vraag2_A" value="A" type="radio" /&gt;A) 10 Ohm&lt;/label&gt;&lt;label class="label_radio" for="vraag2_B"&gt;&lt;input name="vraag2_antwoorden" id="vraag2_B" value="B" type="radio" /&gt;B) 1 Ohm&lt;/label&gt;&lt;label class="label_radio" for="vraag2_C"&gt;&lt;input name="vraag2_antwoorden" id="vraag2_C" value="C" type="radio" /&gt;C) 0,1 Ohm&lt;/label&gt;&lt;label class="label_radio" for="vraag2_D"&gt;&lt;input name="vraag2_antwoorden" id="vraag2_D" value="D" type="radio" /&gt;D) Geen eis&lt;/label&gt;&lt;/div&gt;&lt;span id="vraag2_antwoorden" class="foutmelding_quiz" style="display:none;"&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="left_td"&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="button" class="button_verzenden black" id="send" value="VERSTUUR" /&gt;&lt;input type="hidden" id="newcontact" name="newcontact" value="1"&gt;&lt;/input&gt;&lt;/form&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload