【问题标题】:Getting wrong return value from PHP function从 PHP 函数获取错误的返回值
【发布时间】:2014-05-04 20:45:54
【问题描述】:

我正在尝试创建一个 php 函数来检查数据库中是否存在某些内容,并根据此检查返回“1”或“null”。它在第一次检查是否找到匹配时成功返回“1”,但之后它总是返回“1”,直到页面没有刷新。

所以,我认为这与缓存或类似的东西有关。我使用 jQuery/AJAX 从我的 HTML 页面提交表单。

让我通过示例代码更清楚地说明。

functions.php(检查用户名功能):

 if(!defined('INCLUDE_CHECK')) die('You are not allowed to execute this file directly');

 // some functions
 function checkUser($email){
   $userFound = null;
   // check condition with if and for-each
   foreach.......
       if(......
         // user found
         $userFound = 1;
         break;
       }
     }
     return $userFound;
   }

现在我用

将这个文件包含在我的“main.php”中
 define('INCLUDE_CHECK',true);
 include('functions.php');  // also tried : require 'functions.php';

 $email = $_POST['email'];

并将其初始化为:

 if(!checkUser($email)){
   // perform action when user is not found
 }else{
   // echo an error msg
 }

这是负责这种情况的整个代码,现在谁能告诉我如何在每次提交时重置函数的返回值?或任何解决方案。

更新(HTML 代码):

 $('html').on('click','.submit',function(e){
   window.clearTimeout(formreply);
   var $frm = $(this).parents('form');
   var serial = $frm.serialize();
   var name = $(this).attr('name');
   $.ajax({
     url: $frm.attr('action')+'?'+name+'=true',
     type: $frm.attr('method'),
     data: serial,
     success: function(response){
       if($frm.find('#formreply').length <= 0){
         $frm.prepend('<span id="formreply"></span><hr/>');
       }
       if(response.err){
         $frm.find('#formreply').empty().attr('class','formerr').html(response.err);
         return false;
       }else if(response.info){
         $frm.find('#formreply').empty().attr('class','forminfo').html(response.info);
       }else if(response.msg){
         $frm.find('#formreply').empty().attr('class','formmsg').html(response.msg);
       }
     },
     error: function(jqXHR, textStatus, errorThrown){
       if($frm.find('#formreply').length <= 0){
         $frm.prepend('<span id="formreply"></span><hr/>');
       }
       $frm.find('#formreply').empty().attr('class','formerr').text(textStatus);
     }
   });
   formreply = window.setTimeout(function(){
     $('#formreply,hr').empty().remove();
   },4500);
   e.preventDefault();
 });

更新(提供更多代码以获得更好的评估(main.php)):

 define('INCLUDE_CHECK',true);
 include('functions.php');
 header('Content-Type: application/json');

 $admin = array(
   'err'=>null,
   'info'=>null,
   'msg'=>null
 );

 // more vars & REQUESTS

 if($_REQUEST['Register']){
   if(strlen($name)<4 || strlen($name)>32){
     $admin['err'] .= "Your name must be between 3 and 32 characters!";
   }
   if(!checkName($name)){
     $admin['err'] .= "Your name contains invalid characters!";
   }
   if($email){
     if(!checkEmail($email)){
       $admin['err'] .= "Your email is not valid!";
     }
   }else{
     $admin['err'] .= "Please enter your Email ID.";
   }
   if(strlen($password)<6 || strlen($password)>32){
     $admin['err'] .= "You must enter your password!! (6-32)";
   }
   if(!count($admin['err'])){
     if(checkUser($email) !== 1){ // also tried "!checkUser($email)"
       $admin['msg'] = "Thanks".checkUser($email);
     }else{
       $admin['info'] = "echoing info ".getName($email).checkUser($email);
     }
   }
 }

 echo json_encode($admin);

【问题讨论】:

  • "但是在那之后如果总是返回 "1" 直到页面没有刷新" 你需要在不刷新页面的情况下继续检查这个值吗?如果你是用AJAX来检查,你为什么include('functions.php')
  • 没错... bcz 表单是通过 ajax 从 HTML 提交到 PHP 的,因此不需要刷新页面。我使用“include('functions.php')”bcz 如果在functions.php中定义的所有函数和类,“main.php”返回JSON格式的结果。
  • 看起来问题不在服务器端,而是在客户端(javascript)端。你能提供一些html/javascript代码吗?

标签: php jquery html ajax web-applications


【解决方案1】:

您的if 中可能需要break

function checkUser($email) {
    $userFound = null;
    // check condition with if and for-each
    foreach.......
        if(...) {
             // user found
             $userFound = 1;
             break;
        }
    }
    return $userFound;
}

【讨论】:

  • 我使用了“break;”在我的功能中。但忘了写到我的问题中。
【解决方案2】:

你在讨论什么?如果您从未将 $userFound 重置回 null ,则在第一次更改后它将始终为 1。您可以在将 foreach 更改为 1 时退出 foreach,在将其更改为 1 时返回函数(您可以只返回 1 而不是设置 temp 变量),或者在 if 条件之后将其设置回 null(尽管我认为如果你不做任何事情,这可能毫无意义)。

【讨论】:

  • 我使用了“break;”找到用户后。
  • 了解您正在寻找的内容可能仍然会有所帮助。此外,您可以在 if 之后返回 1 并在最后返回 null 。您不需要 $userCheck 变量。您也可以尝试将检查更改为 if(checkUser($email) !== null) 而不是检查 !的返回值。因为 PHP 是松散类型的,它可能会做一些奇怪的事情,最好尽可能多地检查类型(===/!== 是类型安全的比较)。您确定该函数每次都返回 1 吗?或者它只是那样出现?试着在你的代码中加入一些探针,看看变量是如何变化的。
  • 是的,我确信在执行第一次用户检查后返回值始终为“1”(使用 echo $checkUser($email))
  • 你的 $email 变量每次都在变化吗?
  • 是的,这是用户输入的值
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多