ik heb een probleem met een captcha script wat ik heb overgenomen. Het script draait op zich goed en de code wordt ook goed in de sessie variabele opgenomen. Alleen het probleem dient zich voor wanneer er een error in het register script wordt weergegeven (het register script is het script waar de captcha staat). Als er een error wordt weergegeven (de error handling zit op dezelfde pagina) dan moet de captcha een nieuwe code genereren (dit gebeurt door de code_generator functie). Deze functie werkt ook gewoon goed want in eerste instantie wordt er gewoon een goeie code weergegeven maar op de een of andere manier werkt het niet wanneer een error wordt weergegeven
Hier de relevante code:
<?php
// dit gaat dus goed!
if ($_SERVER['REQUEST_METHOD'] != "POST"){
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
}
// hier komt het script niet lijkt het wel!
if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($errors)){
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
}
if (empty ($_SESSION['code'])){
$_SESSION['code'] = $code;
}
?>
stukje verderop:
<?php
//dit zorgt voor de code in de captcha en genereerd een image.
captcha_generator ($_SESSION['code']);
?>
en weer verderop de captcha weergeven:
<img src="captcha.png" alt="captcha">
P.S. ik gebruik de array $errors om de errors in op te slaan en ik gebruik een POST form voor het verzenden van de gegevens.
Je gebruikt om de captcha op te slaan een $_SESSION en die vul je als volgt:
<?php
if (empty ($_SESSION['code'])){
$_SESSION['code'] = $code;
}
?>
Als er nu een fout voorkomt maakt hij een nieuwe code, maar die nieuwe code slaat hij niet op in de $_SESSION, omdat deze nu wel al bestaat. Je controle is immers, alleen in de $_SESSION opslaan als deze nog niet bestaat. Probeer in plaats van die controle met empty eens
@php newbie
mijn form afhandeling ziet er als volgt uit:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST'
&& (empty($_POST["gbnaam"])
|| empty($_POST["wachtwoord"])
|| empty($_POST["ww"])
|| empty($_POST["vnaam"])
|| empty($_POST["anaam"])
|| empty($_POST["email"])
|| empty($_POST["captcha"]))){
$errors[] = "Vul alle velden in aub!";
}
elseif ($_SERVER['REQUEST_METHOD'] == 'POST'
&& isset($_POST["gbnaam"])
&& isset($_POST["wachtwoord"])
&& isset($_POST["ww"])
&& isset($_POST["vnaam"])
&& isset($_POST["anaam"])
&& isset($_POST["email"])
&& isset($_POST["captcha"])){
//hier volgen dan wat if statements om de inputs te controleren op geldige waarden.
?>
Hier heb ik in de elseif ook al een stuk geschreven als
<?php
if(count($errors) > 0){
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
?>
maar dit had ook geen effect!
Wat wel effect heeft is als ik in elke if statement (wat er meer dan 10 zijn)
<?php
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
?>
invul, maar dit moet toch korter kunnen!
@Ferluci
als ik er
<?php
$_SESSION['code'] = $code;
?>
van maak dan geeft ie een notice dat $code niet bestaat nadat ik het form verzend met een error! Wat dus bevestigd dat ie nooit
<?php
if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($errors)){
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
}
?>
hier komt want dan zou $code gevuld zijn!
Ook moet dat empty() geen probleem geven want ik stel de SESSION['code'] telkens gelijk aan ""! waardoor die toch empty is?
<?php
if ($_SERVER['REQUEST_METHOD'] != "POST"){
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
}
if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($errors)){
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
}
if ($_SERVER['REQUEST_METHOD'] == 'POST'
&& (empty($_POST["gbnaam"])
|| empty($_POST["wachtwoord"])
|| empty($_POST["ww"])
|| empty($_POST["vnaam"])
|| empty($_POST["anaam"])
|| empty($_POST["email"])
|| empty($_POST["captcha"]))){
$errors[] = "Vul alle velden in aub!";
$_SESSION['code'] = "";
$code = code_generator(rand (4,5));
}
elseif ($_SERVER['REQUEST_METHOD'] == 'POST'
&& isset($_POST["gbnaam"])
&& isset($_POST["wachtwoord"])
&& isset($_POST["ww"])
&& isset($_POST["vnaam"])
&& isset($_POST["anaam"])
&& isset($_POST["email"])
&& isset($_POST["captcha"])){
$gbnaam = trim($_POST["gbnaam"]);
$wachtwoord = trim($_POST["wachtwoord"]);
$ww = trim($_POST["ww"]);
$vnaam = trim($_POST["vnaam"]);
$anaam = trim($_POST["anaam"]);
$email = trim($_POST["email"]);
//hier volgen dan wat if statements om de inputs te controleren op geldige waarden.
?>
in de elseif test ik meteen of de POST variabele geset zijn en dan ga ik ermee aan de slag! Anders moet ik voor elke POST variabele eerst alsnog gaan testen of ze geset zijn!
Maar ik zie nu in dat:
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(isset($alle_vars)){
//doe de foutafhandeling
}
else{
errors[] = "Vul alle velden in aub!";
}
if($_SERVER['REQUEST_METHOD'] != 'POST' || !empty($errors))
{
$_SESSION['code'] = code_generator(rand (4,5));
//toon je form
}
?>
zo'n gek idee nog niet is idd!
Ik ga is kijken of ik het in deze setup werkend kan krijgen en of het me dan ook lukt met de captcha...