【问题标题】:PHP jQuery validationPHP jQuery 验证
【发布时间】:2011-07-03 22:27:23
【问题描述】:

这几天一直在为此苦苦挣扎。这是设置 - 我有一个父页面“support.php”有标签,当你点击一个标签时,它会通过 ajax 进入适当的表单。 (各部分的相关代码:)

AJAX 页面上的表单输入

<input type="text" class="numbers" name="captchaImage" id="SupportNumbers" size="6" value="" readonly>
<input type="text" class="numbers" name="SupportMath"  id="SupportMath" size="6" maxlength="6" tabindex="9">

父页面 - support.php 调用“validation.js”,这是我的 jQuery.validate 脚本。

...
SupportMath: {
    required: true,
    equal: "<?php echo $randomNumTotal; ?>" 
}

文件“random.php”的父页面上有一个.get命令

$.get('PHP/random.php', function (data){
    $("#SupportNumbers").val(data);
});

<?php
    $randomNum = rand(0,9);
    $randomNum2 = rand(0,9);
    echo $randomNum ."+". $randomNum2;
    $randomNumTotal = $randomNum + $randomNum2;
?>

它会生成两个随机数,因此您可以将它们相加。验证检查以确保 生成的两个数字被正确相加。我似乎无法让所有这些部分都使用相同的数字,我可以让文本框“SupportNumbers”填充两个随机数字,比如“2 + 5”但是当我在“#SupportMath”中输入“7”时它显示错误消息。它应该是 $randomNumTotal 但我无法将它放到页面上,并让验证脚本检查它。 帮助。

我知道这很清楚,所以我试着解释更多 我的支持页面上有 5 个表格。为了减少混乱,我将它们放在垂直标签集中。我不希望我的 js 验证脚本出现在页面上,并且由于某些机器人遇到的一些问题,我不希望所有 5 个表单都隐藏/显示在页面上。所以我的解决方案是使用 AJAX(完成)引入表单并链接到验证脚本(完成)除了我们的“随机数学验证码”之外一切都很好,我可以将它放在一个文件中并使用“.get”命令填充包含两个随机数学问题的框,但无法获得验证的答案。希望这会有所帮助,下面的代码。

【问题讨论】:

  • 使用 $_SESSION 变量来保存结果值,然后将产生结果的两个数字放在页面上。执行查询时,检查您的会话变量。
  • 因此,如果我正确理解了新问题,那么您有一个 AJAX 脚本调用一个 PHP 文件,它执行两件事:创建一个数学问题和解决方案。它返回问题本身,但“存储”答案(至少在页面被调用时)。我认为您的问题是当您更改上下文时答案已经消失(即从“random.php”回到“validation.js”)我假设validation.js 在调用ajax 之前就已加载,因此您' 永远不会在没有使用其他东西的情况下对齐数字——正如我推荐的会话,但这似乎不是一个选择。
  • 是的,这是正确的。我想用 ajax 引入我的表单,将验证加载到父页面和某种类型的验证码中。这可能吗?还是有更好的解决方案?

标签: php jquery validation


【解决方案1】:

解释:一步一步

  • 我们使用您的方法在页面加载时生成从 1 到 9 的两个随机数
  • 我们添加了一个额外的输入 &lt;input type="hidden" name="math" id="math"/&gt; 这个字段是必需的,因为您使用的是 readonly 字段,现在 readonly 字段未提交。 ..通过表单,这样我们将一个显示给用户,另一个隐藏,这个将被提交;
  • 我们得到#math 值,它是一个string 例如:5+2,所以我们需要将其转换为两个int 并将其相加。
  • 最后我们检查SUM 与用户输入#SupportMath

PHP检查匹配...

if ( isset($_POST['post']) ) {  
  $math = explode('+',trim($_POST['math']));
  $sum = ( (int)$math[0] + (int)$math[1] );
  $message = 'error';
  if ( (int)$sum === (int)$_POST['SupportMath'] ) {
  $message = 'success';
  }
  echo $message;
}

jQuery伪代码...

$(function() {
    $.get('random.php',function(data) {
        $("#SupportNumbers,#math").val(data);
    });
    $('#form').submit(function(e) {
        e.preventDefault();
        var query = $(this).serialize();
        $.ajax({
            type: "POST",
            url: "post.php",
            data: "post=post&" + query,
            success: function(msg) {
                if (msg.indexOf('success') == -1) {
                    alert('error');
                } else {
                    alert('cURL');
                }
            }
        });
    });
});

HTML

<input type="text" class="numbers" name="captchaImage" id="SupportNumbers" size="6" readonly>
<input type="hidden" name="math" id="math"/>
<input type="text" class="numbers" name="SupportMath"  id="SupportMath" size="6" maxlength="6" tabindex="9">

【讨论】:

  • 下载源代码,一切都应该清楚了:ask.altervista.org/demo/php-jquery-validation/… 加上同时我将为您展开解释......
  • @aSeptik - 谢谢,我有点明白这里发生了什么。 SupportNumbers 得到两个随机数,而“math”也得到随机数——为什么?当我尝试这个时,我试图将答案放在隐藏的输入中,然后对照它检查 SupportMath。不幸的是,它将两个数字和解决方案放在同一个盒子里。我仍然不确定它如何检查两个数字的总和。对不起,我很笨。
  • 我的“post.php”文件中需要什么才能使其工作?我在我的服务器上有它,但它在那个服务器上返回 404 ..
  • 源码下载了吗?
  • 当我点击链接时它已损坏。一堆ascii或一些这样的符号。我复制了源代码,但显然没有得到你的 PHP 文件。
【解决方案2】:

这是我所指内容的自给自足版本。

<?php
  session_start();

  if (isset($_GET['validate']))
  {
    $passed = (session_is_registered('validate') && (int)$_GET['validate'] == $_SESSION['validate']);

    header('Content-Type: application/json');
    echo sprintf('{"validation":"%s"}', $passed?'OK':'FAIL');

    exit;
  }

  function generate_check()
  {    
    // generate a result (incompleted)
    $result = Array(
      'num1' => rand(0,10),   // first random number
      'num2' => rand(0,10),   // second random number
      'problem' => null,     // actual math problem
      'answer' => null       // the answer
    );

    // random method
    switch (rand(0,999) % 3)
    {
      case 0: // addition
        $result['problem'] = sprintf('%d + %d',$result['num1'],$result['num2']);
        $result['answer'] = $result['num1'] + $result['num2'];
        break;
      case 1: // subtraction
        $result['problem'] = sprintf('%d - %d',$result['num1'],$result['num2']);
        $result['answer'] = $result['num1'] - $result['num2'];
        break;
      case 2: // multiplication
        $result['problem'] = sprintf('%d * %d',$result['num1'],$result['num2']);
        $result['answer'] = $result['num1'] * $result['num2'];
        break;
    }

    return $result;
  }

  $check = generate_check();
  session_register('validate');
  $_SESSION['validate'] = $check['answer'];
?>
<html>
  <head>
    <title>Sample Validation</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <Script type="text/javascript">
      $(function(){
        $('#check').click(function(){
          $('#result').css('color','').text('Checking...');
          $.getJSON('<?php echo $_SERVER['PHP_SELF']; ?>',{'validate':$('#answer').val(),'_':(new Date()).toString()},function(data){
            if (data.validation=='OK')
              $('#result').css('color','green').text('PASSED!');
            else
              $('#result').css('color','red').text('FAILED!');
          });
        });
      });
    </script>
  </head>

  <body>
    <p>What is <b><?php echo $check['problem']; ?></b>?</p>
    <input type="text" name="answer" id="answer" /><input id="check" type="button" value="Check" />
    <p id="result"></p>
    <br /><br />
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>"><input type="submit" value="New problem" /></form>
  </body>
</html>

【讨论】:

  • 布拉德,谢谢。如果我不通过 cURL 将表单提交到另一个域,那将是完美的。我需要一个解决方案来解决我上面的问题。
  • Brad - 不知道如何将它整合到我的 jQuery 验证中,我可以将它黑入我的 SS val,但不确定客户端。不过它很甜。我真的需要某种类型的解决方案。
  • @DirtyBirdDesign:有什么可以破解的?您可以进一步划分它并进行 ajax 调用以检索问题并设置解决方案,然后再进行调用以进行验证。老实说,根据您提供的解释和代码,我不能 100% 确定您要做什么。 (我认为对架构有点困惑)
  • “hack”指的是我的技能水平……你所做的很棒。我也很困惑。我会尝试更清楚地解释。
  • @Brad 这真是太棒了。我对它了解更多,但有疑问。我想我必须制作一个“Validator.addMethod”来检查数字的总和?我不知道如何将它与我当前使用的 jquery .validate.js 合并
【解决方案3】:

我曾经做过这样的页面,直到我发现了这个美妙的inline Jquery validator 您只需将一个包含相关信息的类添加到您的表单对象中,剩下的就交给它了。没有必要为了这件事而玩弄重定向或会话。我已经在大约 25 个站点上进行了将近一年的生产,没有任何问题。

编辑:看起来你正在尝试做某种验证码,也许吧?也许看看ReCaptcha,它不仅可以验证用户是否正确,而且还有助于改进 OCR。或者,你可以做一个slidelock

正如我们在我的店里所说,“没有理由去写一辆小型货车......”

【讨论】:

  • 我正在使用 jQuery 验证 - 通过 AjAX 将表单引入时,它会变得混乱,链接验证脚本并尝试进行数学验证码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多