Php 验证码响应测试

Php 验证码响应测试,php,captcha,Php,Captcha,我正在尝试测试用户对验证码输入的响应。每当用户输入错误的响应时,此代码都会工作并发出错误消息,但当用户输入正确的响应时,它不会返回成功消息。事实上,响应是空的。我已经玩了几天了,我不知道这里发生了什么。。事实上,我已经在我的应用程序的其他部分使用了这种结构,并且它工作得很好。你知道会发生什么吗 if ($recaptcha_response_field !== '') { require_once('recaptchalib.php'); $privatekey = "remo

我正在尝试测试用户对验证码输入的响应。每当用户输入错误的响应时,此代码都会工作并发出错误消息,但当用户输入正确的响应时,它不会返回成功消息。事实上,响应是空的。我已经玩了几天了,我不知道这里发生了什么。。事实上,我已经在我的应用程序的其他部分使用了这种结构,并且它工作得很好。你知道会发生什么吗

if ($recaptcha_response_field !== '') {

    require_once('recaptchalib.php');
    $privatekey = "removed_this_duh...";
    $resp = recaptcha_check_answer($privatekey, $_SERVER["REMOTE_ADDR"], 
            $recaptcha_challenge_field, $recaptcha_response_field);

    if (!$resp->is_valid) {
        $entry_display = 'Sorry, I know this sucks... 
                          but your entry was invalid, please try again.';
    } else {
        $entry_display = 'success';
    }
return $entry_display;
以下是客户端ajax业务:

function(data) {

    if (data == 'success') {
        alert('success');
        $('#mask').hide();  
        $('#modal_container').hide();

    } else {
        alert(data);
        $('#captcha_error_area').empty().append(data);
        javascript:Recaptcha.reload();
    }
关于成功,以下是我正在测试的对象:

Failure:     
ReCaptchaResponse Object ( [is_valid] => [error] => incorrect-captcha-sol )

Success: 
ReCaptchaResponse Object
        (
            [is_valid] => 1
            [error] => 
        )

如果您的代码达到
如果(!$resp->is_valid){…
对于失败案例,但在成功条件下未继续执行
else
块,则唯一的可能性是您的代码在成功后未被执行…这意味着:

if($recaptcha\u响应\u字段!=''){
没有被执行。我敢打赌验证码插件在返回值方面做了一些你不期望的事情。你可能想将你的
include
移到验证块之外,但在看不到其余代码的情况下,我无法评论这是否是直接的问题


编辑:这并不是最终的答案,公认的答案是正确的。但是,我的答案在类似但不同的情况下可能有用,所以我将其保留。

如果您的代码达到
如果(!$resp->有效){…
对于失败案例,但在成功条件下没有继续执行
else
块,唯一的可能性是代码在成功时没有执行…这意味着:

if($recaptcha\u响应\u字段!=''){
没有被执行。我敢打赌验证码插件在返回值方面做了一些你不期望的事情。你可能想将你的
include
移到验证块之外,但在看不到其余代码的情况下,我无法评论这是否是直接的问题


编辑:这并不是最终的答案,接受的答案是正确的。但是,我的答案在类似但不同的情况下可能有用,所以我将其保留。

从您的对象转储来看,当出现错误时,
是否有效
可能为NULL或空,并且
错误
填充了一些内容。在这种情况下,我将切换if的顺序,因为
1
将计算为
true
,而没有任何内容将计算为
false

if($resp->is_valid) {
    $entry_display = 'success'; // is_vald is 1

} else {  // is_valid is empty
    $entry_display = 'Sorry, I know this sucks...but your entry was invalid, please try again.';
}

从对象的转储来看,当出现错误时,
is\u valid
可能为NULL或空,并且
error
中填充了一些内容。在这种情况下,我将切换if的顺序,因为
1
将计算为
true
,而没有任何内容将计算为
false

if($resp->is_valid) {
    $entry_display = 'success'; // is_vald is 1

} else {  // is_valid is empty
    $entry_display = 'Sorry, I know this sucks...but your entry was invalid, please try again.';
}

嗯,我将required从if语句中移出,没有任何更改。如上所述,我添加了从recaptchalib.phpregardles返回的对象,
require
的位置为:
if($recaptcha\u response\u字段!==“”){
正在解析为false,并且下面的块没有运行。因此,
$recaptcha\u response\u field
确实
='
,这意味着您的问题来自于设置该变量的任何地方。嗯,我将required移出了if语句,并且没有任何更改。如上所述,我添加了从recaptchalib.ph返回的对象如果
require
不在前面,则为:
if($recaptcha\u response\u field!=''){
正在解析为false,并且下面的块没有运行。因此,
$recaptcha_response_field
执行
=''
,这意味着您的问题来自于设置该变量的任何地方。@Thomas运行
var_dump($resp->有效)时输出的内容
?为什么返回
$entry\u display
?这是在函数的上下文中还是包含的上下文中?我使用ajax提交,因此没有重新加载页面。为了简化问题,我发送了一个字符串,我用JS测试它-如果是一个字符串,我隐藏验证码框,如果是另一个,我显示一条错误消息。你应该使用
echo
打印
,而非
返回
返回
仅在函数内工作,或在包含的文件中工作(如果像这样包含它)(
$return\u value=include('thisHasAReturn.php'))
。尝试用
echo
替换您的
返回值
。第一个简单的答案是,我会看到您在运行
var\u dump($resp->is\u valid)时写入+@Thomas输出的内容
?为什么返回
$entry\u display
?这是在函数的上下文中还是包含的上下文中?我使用ajax提交,因此没有重新加载页面。为了简化问题,我发送了一个字符串,我用JS测试它-如果是一个字符串,我隐藏验证码框,如果是另一个,我显示一条错误消息。你应该使用
echo
打印
,而不是
返回
返回
只在函数中有效,或者在包含的文件中有效,如果你像这样包含它
$return\u value=include('thisHasAReturn.php');
。试着用
echo
替换你的
返回
。第一个简单的答案我会看到你写出来+