Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么事先准备好的声明没有';不行?_Php_Sql_Mysqli - Fatal编程技术网

Php 为什么事先准备好的声明没有';不行?

Php 为什么事先准备好的声明没有';不行?,php,sql,mysqli,Php,Sql,Mysqli,我使用此代码检查用户是否已登录: function login_check_admin($mysqli) { // Check if all session variables are set if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) { $user_id = $_SESSION['user_id']; $login_string =

我使用此代码检查用户是否已登录:

    function login_check_admin($mysqli) {
   // Check if all session variables are set
   if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {

     $user_id = $_SESSION['user_id'];
     $login_string = $_SESSION['login_string'];
     $username = $_SESSION['username'];

     $user_browser = $_SERVER['HTTP_USER_AGENT']; // Get the user-agent string of the user.

     if ($stmt = $mysqli->prepare("SELECT admin_pas FROM admins WHERE admin_id = ? LIMIT 1")) { 
        $stmt->bind_param('i', $user_id); // Bind "$user_id" to parameter.
        $stmt->execute(); // Execute the prepared query.
        $stmt->store_result();

        if($stmt->num_rows == 1) { // If the user exists
           $stmt->bind_result($password); // get variables from result.
           $stmt->fetch();

           $login_check = hash('sha512', $password.$user_browser);

           if($login_check == $login_string) {
              // Logged In!!!!
              return true;
           } else {
              // Not logged in
              return false;
           }
        } else {
            // Not logged in
            return false;
        }
     } else {
        // Not logged in
        return false;
     }
   } else {
     // Not logged in
     return false;
   }
}
问题是它只适用于添加到
admins
表的最后一个成员。一旦我将另一个成员添加到
admins
表中,当我与所有其他成员一起登录时,它将返回false,只有当我与最近添加的成员一起登录时,它才会返回true。我把代码改成了这个,现在它可以正常工作了。我不知道为什么事先准备好的声明不起作用

function login_check_admin($mysqli) {
   // Check if all session variables are set
   if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {
     $user_id = $_SESSION['user_id'];
     $login_string = $_SESSION['login_string'];
     $username = $_SESSION['username'];

     $user_browser = $_SERVER['HTTP_USER_AGENT']; // Get the user-agent string of the user.
     if ($result = $mysqli->query("SELECT admin_pas FROM admins WHERE admin_id = ? LIMIT 1")) { 
        if($obj = $result->fetch_object()) { // If the user exists
           $password = $obj->admin_pas; 
           unset($obj);
           $result->close();
           $login_check = hash('sha512', $password.$user_browser);
           if($login_check == $login_string) {
              // Logged In!!!!

              return true;
           } else {
              // Not logged in
              return false;
           }
        } else {
            // Not logged in
            return false;
        }
     } else {
        // Not logged in
        return false;
     }
   } else {
     // Not logged in
     return false;
   }
} 

这是函数的改进版本

function login_check_admin() {
    if(isset($_SESSION['user_id']) 
       && $_SESSION['user_agent'] == $_SERVER['HTTP_USER_AGENT'])
    {
        return TRUE;
    }
}
回答字面上的问题

程序员应该永远不要通过间接结果来判断代码。始终只验证直接的。假设准备好的声明不起作用?创建仅包含此语句的代码段,并验证所涉及的每个变量的状态,以及每个函数和运算符的结果。你会有一个清晰的画面——如果它真的不起作用,为什么会这样


此例程称为“调试”
,只能由程序员自己完成,不能由任何人观看代码

顺便说一下,您不需要所有其他分支。您只需在函数末尾返回
false
。@YourCommonSense因为我将代码更改为不使用prepared语句,现在它可以工作了。老实说,您的第二个代码永远不会工作。@YourCommonSense非常感谢您。这就是我真正想听的!是的,没错。现在,知道你的假设是错误的,你可以开始寻找真正的原因了。我编辑了我的答案,给你一个想法。然后创建一个可复制的代码段,只包含准备好的语句,并提供一个输出,清楚地证明它不起作用。谢谢你的回复。我这样做了,问题在于prepared语句,它返回了错误的密码,我更改了代码,使其不使用sql prepared语句,并且工作正常。此外,我认为您的“改进”版本在这种情况下不起作用:假设我将一个用户从admins表中删除,这样他就不再具有管理权限,在这种情况下,如果用户已经从他的计算机登录,在他注销之前,他仍然拥有管理员权限,但使用我的代码,一旦我从admins表中删除他的名字,他将立即失去管理员权限。如果我错了,请纠正我。如果您取消用户会话并删除,这将起作用。