我正在一个非常大的表单上实现reCaptcha(在PHP中) - 如果reCaptcha失败,我如何保留表单数据?

时间:2013-09-05 14:58:46

标签: php forms recaptcha

基本上我有一个巨大的形式,任何人都需要重新填充是一种痛苦。我们必须实施reCaptcha以防止垃圾邮件机器人。

我想这样做,如果用户输入错误的reCaptcha,他们的表单数据不会丢失。

表单,reCaptcha lib和reCaptcha初始化代码位于标题为Application.php的文件中。此表单POST到application_confirm.phpapplication_confirm包含另一个文件,该文件将表单数据处理为电子邮件格式并将其发送给管理员。

Application.php在另一个php页面上是必需的(具有讽刺意味的是也标题为application.php - 这是用户访问的那个,然后通过{{1}从前面提到的Application.php中包含表单html }

我真的不知道我需要做什么或者我需要在哪里进行验证码有效性检查 - 任何帮助都非常感谢!

4 个答案:

答案 0 :(得分:3)

我喜欢将$ _POST数据存储到$ _SESSION而不是javascript方法。提交表单时,将$ _POST数组推送到$ _SESSION变量。如果recaptcha失败,请使用$ _SESSION中的值重新加载表单。成功发布表单后,销毁会话,以便在返回表单时,不会使用旧信息自动填充。

<?php
    session_start();
    $response = recaptcha_check_answer ($privatekey,
            $_SERVER["REMOTE_ADDR"],
            $_POST["recaptcha_challenge_field"],
            $_POST["recaptcha_response_field"]);
    if(isset($_POST['submit']) && !$response->is_valid)
    {
        $_SESSION['form'] = $_POST;
    }
    else
    {
        //Handle form processing
    }
?>

将输入字段的值设置为$ _SESSION

中的值
<input type="text" name="email" value="<?= $_SESSION['form']['email'] ?>" />

答案 1 :(得分:1)

为此滥用JavaScript和localStorage ...

<强>要求

我假设你安装了jQuery。如果没有,您必须将其包含在您的页面上或重写一些基本JavaScript的功能。

我还假设你的用户正在运行一个相对较新的浏览器(虽然你可以用cookie做同样的事情,解释如何设置它是另一个自己的答案)并且没有禁用JavaScript。

保留表单

首先,在您希望存储值的每个输入对象上附加一个input-to-store类,然后当您的用户按下提交按钮,而不是立即提交您的表单时,让它首先调用一个名为{的函数{1}}然后提交表单:

storeValues()

注意:function storeValues() { if(typeof(Storage) !== "undefined") { localStorage.setItem('preserve', true); $('.input-to-store').each(function() { localStorage.setItem($(this).attr('id'), $(this).val()); }); } } 普遍支持,因此此方法仅支持较新的浏览器(Firefox 3.5 +,Chrome 4 +,IE 8+)。如果不支持此方法,您可能希望使用localStorage语句在Cookie中设置这些值。

根据您的表单,您可能希望保留未存储在else访问者中的值。在这种情况下,添加另一个类并对每个类执行.val()函数。

在重新加载表单时检索值

加载表单后,检查保留的值。如果找到,请将旧值重新加载到这些字段中:

.each()

在您完成后清除if(typeof(Storage) !== "undefined") { if(localStorage.getItem('preserve') === true) { localStorage.setItem('preserve', false); $('.input-to-store').each(function() { if(value = localStorage.getItem($(this).attr('id')){ $(this).val(value); } } } }

在您的成功页面上(成功提交表单后),您需要清除localStorage以防止您的应用浪费用户的硬盘空间:

localStorage

希望这有帮助,避免测试语法,但它应该让您了解如何使用localStorage.clear(); 保留数据并绕过可怕的丢失表单。

答案 2 :(得分:0)

您可以使用AJAX使用事件onsubmit将值发送到表单标记到将表单值保存到会话中的页面

然后基本上说你有一个名为'FirstName'的输入

<form onsubmitup='PreserverValues();'/>

然后基本上你将所有输入改为

<input type='text' name='FirstName' value='<?php if isset($_SESSION['FirstName']) echo $_SESSION['FirstName']; ?>'/>

答案 3 :(得分:0)

如果reCaptcha失败,这是一个重新保存表单数据的工作示例吗?

<script type="text/javascript">
    var RecaptchaOptions = {
        lang: 'en',
        theme: 'custom',
        custom_theme_widget: 'recaptcha_widget'
    };
</script>               

<div class="control-group">

    <div id="recaptcha_widget" style="display:none">

        <input type="text" id="recaptcha_response_field" name="recaptcha_response_field" class="required"/>

        <div id="recaptcha_image"></div>

        <div class="recaptcha_only_if_incorrect_sol" style="color:red">Incorrect please try again</div>

        <div><a href="javascript:Recaptcha.reload()">Get another CAPTCHA code</a></div>
    </div>

    <script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=YOURKEY"></script>

    <noscript>
    <iframe src="http://www.google.com/recaptcha/api/noscript?k=YOURKEY" height="300" width="500" frameborder="0"></iframe><br>
    <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
    <input type="hidden" name="recaptcha_response_field" value="manual_challenge">
    </noscript>                                                 

    <?php
    require_once('captcha/recaptchalib.php');
    $publickey = "YOURKEY"; // you got this from the signup page
    echo recaptcha_get_html($publickey);
    ?>      

</div><!-- control grp captcha -->