Recaptcha警报在同一页面上不正确

时间:2013-11-07 06:33:59

标签: javascript php recaptcha

我有代码

<form name="input" action="messagesave.php" method="POST">
    <table style="margin-left: auto; margin-right: auto;">
        <tr>
            <td style="font-family:'Comic Sans MS', cursive; font-size:20px; text-shadow: 0 0 10px #FFFFFF;">Subject:</td>
        </tr>
        <tr>
            <td><input type="text" value="(Optional)" name="sub" onblur="this.value=!this.value?'(Optional)':this.value;" onfocus="this.select()" onclick="this.value='';"></td>
        </tr>
        <tr>
            <td style="font-family:'Comic Sans MS', cursive; font-size:20px; text-shadow: 0 0 10px #FFFFFF;">Message (Required):</td>
        </tr>
        <tr>
            <td><textarea name="comment" id="comment" cols="60" rows="6"></textarea></td>
        </tr>
        <tr>
            <td>
            <?php
                require_once('recaptchalib.php');
                $publickey = "6LeSzekSAAAAAL32gFlK_vGcqI3-kuoz990KSJHU"; // you got this from the signup page
                echo recaptcha_get_html($publickey);
            ?>
            </td>
        </tr>
        <tr>
            <td><input type="submit" class="submit" value="Submit Message"></td>
        </tr>
    </table>
</form>
主页上的

,操作为

require_once('recaptchalib.php');

$privatekey = "6LeSzekSAAAAAAdAxcsVugyScb8B1D6UoKpjrX2W";
$resp = recaptcha_check_answer ($privatekey,
                            $_SERVER["REMOTE_ADDR"],
                            $_POST["recaptcha_challenge_field"],
                            $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." . "(reCAPTCHA said: " . $resp->error . ")");
} 
else {
    $comment = $_POST['comment'];
    $to = "jsmith@example.com";
    $subject = $_POST['sub'];
    $message = $comment;
    $from = "jsmith@example.net";
    $headers = "From:" . $from;
    mail($to,$subject,$message,$headers);
    echo "Mail Sent.";
    header( 'Location: success.html' ) ;
}

当用户不正确地输入reCAPTCHA代码时,页面会移动到一个空白页面上,表示未正确输入recaptcha。

我想问一下,如何实现主页上显示的javascript警报或红色文字,这样用户就不必一直按下后退按钮。

由于

3 个答案:

答案 0 :(得分:0)

您必须将表单发送到相同的PHP脚本本身,并带有一个参数,表明表单已发送(在这种情况下为send):

<form name="input" action="?send" method="POST">

在同一个PHP脚本的开头,检查表单是否已发送且输入的数据是否正确;

<?php

$errorArr = array();

if(isset($_GET['send'])) {
    // form is sent, do your captcha and other checks here and save the errors in an array
    if($captcha->wrong())
        $errorArr[] = 'You entered the captcha wrong';

   if(count($errorArr) <= 0) {
       // No errors occured so do stuff with the correct input of the user
       // save it to db for example
   }
}

?>

然后您可以在页面的某个位置打印出错误消息,例如

<?php echo (count($errorArr) > 0)?implode('<br>', $errorArr):null; ?>

或者你可以使用两个不同的页面和会话变量完成整个事情,但这很复杂且不必要。

如果您使用Ajax检查您的验证码,您仍然需要在发送表单时再次检查服务器端,因为有人可以禁用javascript(因为大多数spambot无法解释javascript)并且您的验证码通知失败。

在你的情况下,你最终会得到像

这样的东西
<?php

require_once('recaptchalib.php');

$errorArr = array();
$privatekey = "6LeSzekSAAAAAAdAxcsVugyScb8B1D6UoKpjrX2W";
$resp = recaptcha_check_answer ($privatekey,
                            $_SERVER["REMOTE_ADDR"],
                            $_POST["recaptcha_challenge_field"],
                            $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    $errorArr[] = 'The reCAPTCHA wasn\'t entered correctly. Go back and try it again. (reCAPTCHA said: ' . $resp->error . ')';
} 

if(count($errorArr) <= 0) {
    $comment = $_POST['comment'];
    $to = "jsmith@example.com";
    $subject = $_POST['sub'];
    $message = $comment;
    $from = "jsmith@example.net";
    $headers = "From:" . $from;

    if(mail($to,$subject,$message,$headers) === false)
        $errorArr[] = 'Mail could not be sent to us due to a technical error';

    // if headers are sent after output already sent you get an error
    //echo "Mail Sent."; 
    header( 'Location: success.html' ) ;
}

?>
<form name="input" action="messagesave.php" method="POST">
    <?php echo (count($errorArr) > 0)?implode('<br>', $errorArr):null; ?>
    <table style="margin-left: auto; margin-right: auto;">
        <tr>
            <td style="font-family:'Comic Sans MS', cursive; font-size:20px; text-shadow: 0 0 10px #FFFFFF;">Subject:</td>
        </tr>
        <tr>
            <td><input type="text" value="(Optional)" name="sub" onblur="this.value=!this.value?'(Optional)':this.value;" onfocus="this.select()" onclick="this.value='';"></td>
        </tr>
        <tr>
            <td style="font-family:'Comic Sans MS', cursive; font-size:20px; text-shadow: 0 0 10px #FFFFFF;">Message (Required):</td>
        </tr>
        <tr>
            <td><textarea name="comment" id="comment" cols="60" rows="6"></textarea></td>
        </tr>
        <tr>
            <td>
            <?php
                require_once('recaptchalib.php');
                $publickey = "6LeSzekSAAAAAL32gFlK_vGcqI3-kuoz990KSJHU"; // you got this from the signup page
                echo recaptcha_get_html($publickey);
            ?>
            </td>
        </tr>
        <tr>
            <td><input type="submit" class="submit" value="Submit Message"></td>
        </tr>
    </table>
</form>

答案 1 :(得分:0)

它会进入不同的页面,因为我猜你发布的是表格。您可以做的是将提交按钮更改为简单按钮。那么

 $( "#button" ).click(function() {
     //your ajax call to validating php
//on success $( "#formId" ).submit();
    });

如果您不想使用javascript只是发布表单,您可以使用变量集将其重定向到验证php的同一页面。

header("Location:http://localhost/login.php?x=1")

检查

if(isset($_GET('x'))){
//your html for error message
}

也许This POST 可以提供帮助

答案 2 :(得分:0)

将您的表单和操作处理代码合并到一个脚本中,该脚本通过以下格式发布到自身:

if ($POST['submit'] && $resp->is_valid) {
    // Form sent and captcha ok

} else {
    // Check, was it submitted already?
    if (isset($resp) && !$resp->is_valid) {
        echo "<div><p>The reCAPTCHA wasn't entered correctly. Go back and try it again." . "(reCAPTCHA said: " . $resp->error . ")</p></div>"; 
    }
    // All the form code here.

}