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>
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? –
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. –