2017-03-24 7 views
0

Ich arbeite an einem Formular, und alles scheint gut zu funktionieren, außer für das benutzerdefinierte Captcha. Unabhängig davon, ob ich eine falsche oder die tatsächlich richtige Antwort eingibt, wird das Formular nicht an die Datenbank gesendet und lädt das Formular erneut mit der Fehlermeldung "Bitte versuchen Sie es noch einmal" ... Ich möchte, dass die Validierung für dieses Feld dem gleichen Format folgt wie die anderen, aber nicht wissen, ob das möglich ist (es ist das $ captchaValid im Validierungsabschnitt). Hier ist der PHP-Code, den ich in meiner Form haben:CAPTCHA nicht ordnungsgemäß validieren

<?php 
//captcha 
session_start(); 
$digit1 = mt_rand(1, 10); 
$digit2 = mt_rand(1, 10); 

$math ="$digit1 + $digit2"; 
$_SESSION['answer'] = $digit1 + $digit2; 

//error reporting 
error_reporting(E_ALL); 
ini_set('display_errors','1'); 

//include validation file here!! 
include_once('validationresult.php'); 

//results 
$firstnameValid = new ValidationResult("", "", "", true); 
$lastnameValid = new ValidationResult("", "", "", true); 
$emailValid = new ValidationResult("", "", "", true); 
$captchaValid = new ValidationResult("", "", "", true); 

//validation 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    $firstnameValid = ValidationResult::checkParameter("firstname", '/^[a-zA-Z ]*$/', 'Only Letters and Spaces Allowed'); 
    $lastnameValid = ValidationResult::checkParameter("lastname", '/^[a-zA-Z ]*$/', 'Only Letters and Spaces Allowed'); 
    $emailValid = ValidationResult::checkParameter("email", '/(.+)@([^\.].*)\.([a-z]{2,})/', 'Please enter valid e-mail'); 
    $captchaValid = ValidationResult::checkParameter("captcha", $_SESSION['answer'] == $_POST['answer'], 'Please try again'); 
//redirection 

if ($firstnameValid->isValid() && $lastnameValid->isValid() && $emailValid->isValid() && $captchaValid->isValid()) { 
    require "connectiontest.php"; 
    header('Location: thankyou.html'); 
    exit; 
    } 
} 


?> 

Und finden Sie meine separaten Validierungsdatei:

<?php 

class ValidationResult 
{ 
    private $value; 
    private $cssClassName; 
    private $errorMessage; 
    private $isValid = true; 


    function __construct($cssClassName, $value, $errorMessage, $isValid) 
    { 
     $this->cssClassName = $cssClassName; 
     $this->value = $value; 
     $this->errorMessage = $errorMessage; 
     $this->isValid = $isValid; 
    } 

    public function getCssClassName() { return $this->cssClassName;} 
    public function getValue() { return $this->value;} 
    public function getErrorMessage() { return $this->errorMessage;} 
    public function isValid() { return $this->isValid;} 

    static public function checkParameter($queryName, $pattern, $errMsg) { 
     $error = ""; 
     $errClass = ""; 
     $value = ""; 
     $isValid = "true"; 

     if (empty($_POST[$queryName])) { 
      $error = $errMsg; 
      $errClass = "error"; 
      $isValid = false; 
     } 
     else { 
      $value = $_POST[$queryName]; 
      if (! preg_match($pattern, $value)) { 
       $error = $errMsg; 
       $errClass = "error"; 
       $isValid = false; 
      } 
     } 
     return new ValidationResult($errClass, $value, $error, $isValid); 
    } 
} 

?> 

Ich habe versucht, Changning diesen Teil:

$captchaValid = ValidationResult::checkParameter("captcha", $_SESSION['answer'] == $_POST['answer'], 'Please try again'); 

ein einige verschiedene Möglichkeiten zu sehen, ob ich es vielleicht funktionieren lassen könnte, aber wie gesagt, ich weiß nicht einmal, ob das möglich ist (da es nicht wirklich ein regulärer Ausdruck ist?). Ich habe versucht, den Teil "== $ _ POST ..." zu entfernen, ihn in einfache und doppelte Anführungszeichen usw. einzuschließen und entweder einen Fehler oder das gleiche Ergebnis wie zuvor zu erhalten. Wenn Sie wollen, ich will nicht möglich ist, schätze ich Vorschläge für alternative Lösungen ...

Ein paar Anmerkungen: Ich bin sehr neu in PHP und nicht wirklich so gut wie nichts wissen, so halten Sie bitte, dass im Hinterkopf. Auch ich weiß noch nicht Javascript (nicht dass es in diesem Fall wichtig ist). HTML, CSS und PHP sind meine größten Kenntnisse. Dies ist für eine Schulaufgabe.

BEARBEITEN Hier ist der vollständige Code, mit dem HTML mit dem Formular enthalten. Es gab ein paar Änderungen wurden auf dem vorherigen Vorschlag basiert:

<?php 
//captcha 
if (!isset($_SESSION['answer'])) { 
    $digit1 = mt_rand(1, 10); 
    $digit2 = mt_rand(1, 10); 

    $math ="$digit1 + $digit2"; 
    $_SESSION['answer'] = $digit1 + $digit2; 
} 


//error reporting 
error_reporting(E_ALL); 
ini_set('display_errors','1'); 

//include validation file here!! 
include_once('validationresult.php'); 

//results 
$firstnameValid = new ValidationResult("", "", "", true); 
$lastnameValid = new ValidationResult("", "", "", true); 
$emailValid = new ValidationResult("", "", "", true); 
$captchaValid = new ValidationResult("", "", "", true); 

//validation 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    $firstnameValid = ValidationResult::checkParameter("firstname", '/^[a-zA-Z ]*$/', 'Only Letters and Spaces Allowed'); 
    $lastnameValid = ValidationResult::checkParameter("lastname", '/^[a-zA-Z ]*$/', 'Only Letters and Spaces Allowed'); 
    $emailValid = ValidationResult::checkParameter("email", '/(.+)@([^\.].*)\.([a-z]{2,})/', 'Please enter valid e-mail'); 
    $captchaValid = ValidationResult::checkParameter("captcha", "/" . $_POST['answer'] . "/" , 'Please try again'); 

    //redirection 

    if ($firstnameValid->isValid() && $lastnameValid->isValid() && $emailValid->isValid() && $captchaValid->isValid()) { 
     require "connectiontest.php"; 
     header('Location: thankyou.html'); 
     exit; 
    } 
} 


?> 

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Registration</title> 
</head> 

<body> 

    <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>" > 

     <?php echo $firstnameValid->getCssClassName(); ?> 
     <label for="firstname">First name:</label> <input type="text" name="firstname" value="<?php echo $firstnameValid->getValue(); ?>" required> <br> 
     <span class="help-inline" id="errorFirstname"> <?php echo $firstnameValid->getErrorMessage(); ?> </span> <br> 

     <?php echo $lastnameValid->getCssClassName(); ?> 
     <label for="lastname">Last name:</label> <input type="text" name="lastname" value="<?php echo $lastnameValid->getValue(); ?>" required> <br> 
     <span class="help-inline" id="errorLastname"> <?php echo $lastnameValid->getErrorMessage(); ?> </span> <br> 


     <?php echo $emailValid->getCssClassName(); ?> 
     <label for="email">E-mail:</label> <input type="email" name="email" value="<?php echo $emailValid->getValue(); ?>" required> <br> 
     <span class="help-inline" id="errorEmail"> <?php echo $emailValid->getErrorMessage(); ?> </span> <br> 

     <label for="optin">Opt In??</label><!--add legal-ese later--> <input type="checkbox" name="optin" required> <br> 

     <?php echo $captchaValid->getCssClassName(); ?> 
     <label for="captcha">captcha</label> <?php echo $math; ?> = <input type="text" name="captcha" value="<?php echo $captchaValid->getValue(); ?>" required><br> 
     <span class="help-inline" id="errorCaptcha"> <?php echo $captchaValid->getErrorMessage(); ?> </span> <br> 

     <input type="submit" value="Submit"> 

    </form> 

</body> 
</html> 

Antwort

0

ich fast über diese Frage vergessen haben, so dass ich weiß, ich bin total spät, aber trotzdem: paar Dinge.

  1. Eingang mit dem Namen answer ist nicht vorhanden. Also wird der Wert $_POST['answer'] immer Null sein - und dann wird das Muster "/" . $_POST['answer'] . "/" immer // sein, was allem entspricht. Ich habe das letzte Mal nicht bemerkt. Sie möchten wahrscheinlich gegen $_SESSION['answer'], nicht $_POST['answer'] validieren.

  2. session_start() verschwunden - so wird die Antwort jedes Mal erneut generiert.

  3. Wenn der Benutzer nicht richtig geantwortet hat, möchten Sie das Captcha neu generieren - also im Block in Zeile 38 if ($firstnameValid->isValid() && ... möchten Sie else Block hinzufügen. Und erzeugen neues Wort ein und speichern sie auf die Sitzung in der neuen else

=============== zweiten Vermutung ========== =====

Ich sehe nicht die Seite (Datei), wo Sie das HTML-Formular anzeigen. Also ich denke, es ist in einer anderen eingeschlossenen Datei.

erste Vermutung ist, am Boden, aber es gibt wichtigeres Thema, an der Linie

$captchaValid = ValidationResult::checkParameter("captcha", $_SESSION['answer'] == $_POST['answer'], 'Please try again'); 

der Teil $_SESSION['answer'] == $_POST['answer'] zuerst ausgewertet wird, und das Ergebnis wird als Muster übergeben. Sie passieren entweder true oder false. Auch. Ich bin nicht sicher, wie Sie die Werte $ _POST ['Captcha'] und $ _POST ['Antwort'] erhalten. Füllen Sie automatisch den versteckten Eingabecaptcha mit der richtigen Antwort aus?

Sie übergeben captcha und false zu ValidationResult->checkParameter(). Wenn Sie überprüfen wollen, ob $_POST['captcha'] die gleiche wie $_POST['answer'] ist, würde ich als Muster (zweiter Parameter) etwas passieren wie

"/" . $_POST['answer'] . "/". 
// for example: /12/ 

also, dass sie Muster erzeugt. Sie werden $ _POST ['Captcha'] gegen dieses Muster validieren.

=============== ursprüngliche Vermutung ===============

Ich denke, auch, dass, wenn Sie das Formular abschicken , laden Sie die gesamte Seite neu. Damit der folgende Baustein wieder geladen wird:

<?php 
//captcha 
session_start(); 
$digit1 = mt_rand(1, 10); 
$digit2 = mt_rand(1, 10); 

$math ="$digit1 + $digit2"; 
$_SESSION['answer'] = $digit1 + $digit2; 

Wenn das stimmt, validieren Sie gegen falsche Nummer. Sie generieren zuerst eine neue Antwort und überprüfen dann die alte Antwort darauf.

Die Überprüfung, ob die Antwort bereits gesetzt ist, wäre:

if(!isset($_SESSION['answer'])) //If the answer doesn't already exists 
{ 
    // generate new answer 
    $digit1 = mt_rand(1, 10); 
    $digit2 = mt_rand(1, 10); 

    $math ="$digit1 + $digit2"; 
    $_SESSION['answer'] = $digit1 + $digit2; 
} 

Ich bin neu in Stackoverflow, so Ich bin nicht ganz sicher, ob dies eine Antwort oder ein Kommentar sein soll, aber trotzdem Ich kann wegen meines guten Rufes noch keine Kommentare schreiben.

Hoffe es hilft :-)

+0

Vielen Dank für Ihre Antwort! Ich habe den HTML-Code für das Formular mit einigen Änderungen hinzugefügt, die auf dem basieren, was Sie oben am Ende meines Beitrags vorgeschlagen haben. Ich dachte nicht, dass es um 3 Uhr morgens wichtig war ... Wie auch immer, ich habe deine Vorschläge ausprobiert, und sie haben die Dinge ein wenig verbessert, aber sie arbeiten immer noch nicht zu 100%. Nach dem Ändern des Codes wie in der obigen Bearbeitung beschrieben, werden * alle * Antworten auf das Captcha als korrekt validiert und an die Datenbank gesendet. Ich weiß nicht, ob vielleicht etwas nicht stimmt mit der Benennung meiner Variablen oder wie sie angeordnet sind? –

+0

var_dump ($ Variable); kann hilfreich sein - es druckt Inhalte der Variablen aus (auch wenn seine leere Zeichenfolge oder falsch), oder Null, wenn die Variable nicht festgelegt ist. –