Door
Mohamed nvt
op 21-09-2022 23:21
gewijzigd op 21-09-2022 23:33
3.201 views
Wanneer ik onderstaand pagina oproep, dan krijg ik een wit pagina.
Er is blijkbaar een syntax fout,maar ik kan het niet vinden.
live voorbeeld: jocke-overwater.nl/contact.php
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// define variables and set to empty values
$vnaamErr = $anaamErr = $emailErr = "";
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (empty($_POST["voornaam"])) {
$vnaamErr = "Graag uw voornaam invullen";
} else {
$voornaam = test_input($_POST["voornaam"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z-' ]*$/",$voornaam)) {
$vnaamErr = "Uw voornaam mag alleen letters en spaties bevatten";
}
}
if (empty($_POST["achternaam"])) {
$anaamErr = "Graag uw achternaam invullen";
} else {
$achternaam = test_input($_POST["achternaam"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z-' ]*$/",$achternaam)) {
$anaamErr = "Uw achternaam mag alleen letters en spaties bevatten";
}
}
if (empty($_POST["mailadres"])) {
$emailErr = "Graag uw mailadres invullen";
} else {
$email = test_input($_POST["email"]);
// check if e-mail address is well-formed
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Het formaat van het ingevoerde mailadres is niet correct";
}
}
$uwvraag = $_POST["mailadres"] ;
if (empty($vnaamErr && $anaamErr && $emailErr)) {
//mail versturen
$to = "Naar het mailadres";
$subject = "Mail afkomstig uit de website";
$body = "";
$body. = "Voornaam: " . $voornaam . "\r\n";
$body. = "Achternaam: " . $achternaam . "\r\n";
$body. = "Het mailadres: " . $voornaam . "\r\n";
$body. = "Uw vraag: " . $uwvraag. "\r\n";
$headers ="From: [email protected] \r\n";
$headers .="MIME-Version: 1.0" . "\r\n";
$headers .="Content-type:text/html;charset=UTF-8" . "\r\n";
if (mail($to,$subject,$body)) {
echo "bedankt voor uw mail. We nemen zsm contact met je op!";
} else {
echo "Mail niet verstuurd!";
}
} else {
echo "Er is iets mis gegaan met het contactformulier.";
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$page = "contact";
include "Inc/header.php";
?>
<div class="main">
<div class="formulier">
<h2>Contact formulier</h2><br/><br/>
<span>* verplichte velden</span><br/><br/>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
<label for="Voornaam">Voornaam</label><br />
<input type="text" id="voornaam" name="voornaam" value="<?php if (isset($_POST['voornaam']))echo htmlspecialchars($_POST['voornaam'], ENT_QUOTES); ?>" required><span>*</span><br /><br />
<label for="achternaam">Achternaam</label><br />
<input type="text" id="achternaam" name="achternaam" value="<?php if (isset($_POST['achternaam']))echo htmlspecialchars($_POST['achternaam'], ENT_QUOTES); ?>" required><span>*</span><br /><br />
<label for="Mailadres">Mailadres</label><br />
<input type="email" id="mailadres" name="mailadres" value="<?php if (isset($_POST['mailadres']))echo htmlspecialchars($_POST['mailadres'], ENT_QUOTES); ?>" required><span>*</span><br /><br />
</br>
<label for="uwvraag">Uw vraag:</label></br>
<textarea id="uwvraag" name="uwvraag" rows="4" cols="50"></textarea></br></br>
<input type="submit" value="Verzenden"> <input type="reset" value="Reset">
</form>
</div>
</div>
<?php
include "Inc/footer.php";
?>
of zet dit in een .htaccess file op je ontwikkel-omgeving:
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
Dat zou ook parse-errors moeten weergeven.
Als je script een } mist of een ; dan kan het script niet starten. Dan komt hij dus ook niet op regel 2,3 en 4 om error-reporting aan te zetten en eindig je met een wit scherm als de webserver standaard uitgaat van "geen errors tonen"
Het probleem heb ik opgelost!
Vanaf regel 44 t/m 48 was er te veel ruimte tussen . en =.
Vanaf regel 37 check ik of alle variabelerrors leeg zijn, zo dan verstuur ik het formulier en anders wordt er een bericht weergegeven dat er iets mis gegaan met het formulier.
En juist nadat ik alles correct heb ingevuld in het formulier en dus de variabelerrors leeg zijn, wordt het formulier niet verzonden.
Iemand een idee waar ik het moet dan gaan zoeken?
[size=xsmall]Toevoeging op 22/09/2022 22:35:51:[/size]
Ik ben weer een stapje verder en nu kom ik twee bijzondere foutmeldingen tegen!
Om het formaat van het mailadres te controleren gebruik ik op regel 33 een functie om dit te doen. Nadat ik het juiste mailadres formaat heb ingevuld krijg ik toch de melding dat het formaat niet correct is!
En schijnbaar lijkt alles goed te gaan, want de controle of alle variabelerrors leeg zijn, gaat goed op regel 37 en de controle op regel 50 gaat ook goed, want na alles op het formulier verschijnt de melding van regel 51 en toch krijg ik geen mail binnen.
Hoe kan dit dan?
Iemand een idee!
Ik sla alle validatie-fouten altijd op in een array, en zodra die leeg is ( controleer met: count($errors) == 0 ) kan je aan het e-mail proces beginnen.
Als er iets fout gaat kan je altijd een hele rits met foutmeldingen tonen.
[size=xsmall]Toevoeging op 22/09/2022 22:47:35:[/size]
En probeer ook zulke foutmeldingen als dit te vermijden.
"Er is iets mis gegaan met het contactformulier."
Vermeld wát er aan de hand is als het een foutmelding voor de gebruiker is. En als het een foutmelding is omdat je script niet werkt, vermeld dan dat het aan de website ligt. En log de fout op de achtergrond voor de programmeurs.
Niets is zo vervelend als onduidelijke foutmeldingen.
if (empty($vnaamErr) && empty($anaamErr) && empty($emailErr)) {
$uwvraag = $_POST["mailadres"] ;
if (empty($vnaamErr && $anaamErr && $emailErr)) {
uwvraag is gelijk aan mailadres???
Het mailadres is gelijk aan $voornaam.
Consequent hoofdlettergebruik. Overal hoofdletter behalve "bedankt voor uw".
Wat doet $page = "contact";? $page wordt niet meer gebruikt.
Vermijd afkortingen en indien toch graag juist. zsm ==> z.s.m..
je functie test_input() test helemaal niets. deze functie verandert je data.
En ook nog eens onnodig. Ja, het kan handig lijken om al je input-data "schoon te maken" zodat deze "onschadelijk" is.
Maar data kan voor verschillende toepassingen op verschillende manieren lastig zijn.
* In een SQLquery is een ' vervelend, aangezien dat de begrenzing van een string aangeeft.
* in html is een < het begin van een html-tag, en dat wil je niet op je scherm hebben, danwel je wilt niet dat iemand javascript opneemt in de invoer
* ooit in een grijs verleden leek het de bouwers van PHP verstandig om bepaalde tekens direct te escapen met \ om een en ander ook veilig te hebben voor duffe programmeurs die zelf niet opletten. Daarom was vaak de stripslashes functie nodig. Maar dat is volgens mij ook al in php 5.weinig opgeheven.
Anyway:
trim(). Ok, kan ik me in vinden.
stripslashes() alleen als je php 4 draait. Ander kan iemand die het over C:\Windows heeft zijn tekst zien veranderen
htmlspecialchars() alleen in combinatie met het printen van tekst op scherm, of opbouwen van de body van de mail.
je verandert nu ook tekens die in een mail-adres voor voor mogen komen.
Ik heb bijvoorbeeld een mail adres ivo'[email protected] . En dat is een legaal formaat. Maar jij sloopt die ' tot '
---
preg_match("/^[a-zA-Z-' ]*$/",$voornaam)) {
$vnaamErr = "Uw voornaam mag alleen letters en spaties bevatten";
Wat is er toch mis met namen die andere tekens dan A-Z bevatten?
Ik ken zat mensen die een é of ë in de naam hebben.
Een naam die uit 1 spatie (of 10 voor mijn part), sta je weer wel toe.
Eerst constateer je dat de invoer niet leeg is (if (empty($_POST["voornaam"])) {)
Daarna haal je de data door test_input, zodat je de spaties trimt.
En tenslotte gebruik je * in je regex die ook 0 tekens prima vindt....
Naar aanleiding van jullie feedback, heb ik het eea aangepast, helaas ontvang ik nog steeds geen mail vanuit het contactformulier.
Momenteel loop ik tegen de volgende errors aan:
1. Blijkbaar is de errors array leeg en ik krijg netjes de bevestiging dat het alles goed gaat, regel 53 en toch krijg ik geen mail binnen, ook niet in de spam map.
Iemand een idee waar ik het moet zoeken?
<?php
// define variables and set to empty values
$errors = array();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (empty($_POST["voornaam"])) {
$errors['voornaam'] = "Graag uw voornaam invullen";
} else {
$voornaam = test_input($_POST["voornaam"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z-' ]*$/",$voornaam)) {
$errors['voornaam'] = "Uw voornaam mag alleen letters en spaties bevatten";
}
}
if (empty($_POST["achternaam"])) {
$errors['achternaam'] = "Graag uw achternaam invullen";
} else {
$achternaam = test_input($_POST["achternaam"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z-' ]*$/",$achternaam)) {
$errors['achternaam'] = "Uw achternaam mag alleen letters en spaties bevatten";
}
}
if (empty($_POST["mailadres"])) {
$errors['mailadres'] = "Graag uw mailadres invullen";
} else {
$email = test_input($_POST["mailadres"]);
// check if e-mail address is well-formed
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['mailadres'] = "Het formaat van het ingevoerde mailadres is niet correct";
}
}
$uwvraag = test_input($_POST["uwvraag"]) ;
if (count($errors) == 0) {
//mail versturen
$to = "[email protected]";
$subject = "Mail afkomstig uit de website";
$message= "";
$message.= "Voornaam: " .$voornaam. "\r\n";
$message.= "Achternaam: " .$achternaam. "\r\n";
$message.= "Het mailadres: " .$email. "\r\n";
$message.= "Uw vraag: " . $uwvraag. "\r\n";
$headers ="From: [email protected] \r\n";
$headers.="MIME-Version: 1.0" . "\r\n";
$headers.="Content-type:text/html;charset=UTF-8" . "\r\n";
if (mail($to,$subject,$message,$headers)) {
echo "Bedankt voor uw mail. Er wordt contact met u opgenomen!";
} else {
echo "Mail niet verstuurd!";
}
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$page = "contact";
include "Inc/header.php";
?>
<div class="main">
<div class="formulier">
<h2>Contact formulier</h2><br/><br/>
<span>* verplichte velden</span><br/><br/>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
<label for="Voornaam">Voornaam</label><br />
<input type="text" id="voornaam" name="voornaam" value="<?php if (isset($_POST['voornaam']))echo htmlspecialchars($_POST['voornaam'], ENT_QUOTES); ?>" required><span>*</span><br /><br />
<span>
<?php
if (isset($errors['voornaam'])) {
echo $errors['voornaam'];
}
?>
</span>
<label for="achternaam">Achternaam</label><br />
<input type="text" id="achternaam" name="achternaam" value="<?php if (isset($_POST['achternaam']))echo htmlspecialchars($_POST['achternaam'], ENT_QUOTES); ?>" required><span>*</span><br /><br />
<span>
<?php
if (isset($errors['achternaam'])) {
echo $errors['achternaam'];
}
?>
</span>
<label for="Mailadres">Mailadres</label><br />
<input type="email" id="mailadres" name="mailadres" value="<?php if (isset($_POST['mailadres']))echo htmlspecialchars($_POST['mailadres'], ENT_QUOTES); ?>" required><span>*</span><br /><br />
</br>
<span>
<?php
if (isset($errors['mailadres'])) {
echo $errors['mailadres'];
}
?>
</span>
<label for="uwvraag">Uw vraag:</label></br>
<textarea id="uwvraag" name="uwvraag" rows="4" cols="50"></textarea></br></br>
<input type="submit" value="Verzenden"> <input type="reset" value="Reset">
</form>
</div>
</div>
<?php
include "Inc/footer.php";
?>