$ _POST突然抛出一个错误

时间:2016-02-15 10:01:30

标签: php mysql apache

我有这个检查登录的代码。它一直很好,但突然停止工作。

public function checkLogin($_POST) {
        // fetching user by email
        $stmt = $this->conn->prepare("SELECT password_hash FROM users WHERE email = ?");

        $stmt->bind_param("s", $email);

        $stmt->execute();

        $stmt->bind_result($password_hash);

        $stmt->store_result();

        if ($stmt->num_rows > 0) {
            // Found user with the email
            // Now verify the password

            $stmt->fetch();

            $stmt->close();

            if (PassHash::check_password($password_hash, $password)) {
                // User password is correct
                return TRUE;
            } else {
                // user password is incorrect
                return FALSE;
            }
        } else {
            $stmt->close();

            // user not existed with the email
            return FALSE;
        }
    }

检查我的apache错误日志后,我看到了这个错误:

PHP Fatal error:  Cannot re-assign auto-global variable _POST

围绕这个做什么工作?

3 个答案:

答案 0 :(得分:3)

自PHP 5.4起,您不能使用superglobal作为函数的参数

$_POST可全球访问。所以你不必转到你的职能部门。

这就是你的功能应该是这样的

public function checkLogin() {
$email = $_POST['email'];
$password = $_POST['password'];

        // fetching user by email
        $stmt = $this->conn->prepare("SELECT password_hash FROM users WHERE email = ?");

        $stmt->bind_param("s", $email);

        $stmt->execute();

        $stmt->bind_result($password_hash);

        $stmt->store_result();

        if ($stmt->num_rows > 0) {
            // Found user with the email
            // Now verify the password

            $stmt->fetch();

            $stmt->close();

            if (PassHash::check_password($password_hash, $password)) {
                // User password is correct
                return TRUE;
            } else {
                // user password is incorrect
                return FALSE;
            }
        } else {
            $stmt->close();

            // user not existed with the email
            return FALSE;
        }
    }

答案 1 :(得分:1)

那是因为$_POST是超全球的。 From Superglobals on PHP.net

  

从PHP 5.4开始,您不能使用超全局作为函数的参数。这会导致致命错误:

function foo($_GET) {
   // whatever
}
     

它被称为“影视”超级全球,我不知道为什么人们会这样做,但我已经在那里看到了它。简单的解决方法是在函数中重命名变量$ get,假设名称是唯一的。

您可以在函数中访问$_POST

function foo(){
    print_r($_POST);
}

或者您可以将$_POST传递给类似的函数:

foo($_POST);

function foo($post){
    print_r($post);
}

答案 2 :(得分:0)

$_POST是超全局变量。你为什么要在参数中传递它。您可以在以下函数中直接使用它:

public function checkLogin() {
     print_r($_POST);
     //your rest of code
}