【问题标题】:Variables not being passed to class method变量未传递给类方法
【发布时间】:2016-01-01 21:30:21
【问题描述】:

我正在用 PHP 构建一个登录类,但是当我将它们传递给类方法时使用的变量是空的,即使它们不应该是空的。 我尝试只返回 $username 变量,但它仍然是空的,但如果我在不使用类的情况下返回它,我可以看到它被正确分配。

我正在使用多个其他类以及正确分配变量的方法。

我不知道我是不是一直盯着自己看,遗漏了一些明显的东西,或者是否有其他原因造成这种情况。

class Auth
{
    private $mysqli;

    public function __construct(mysqli $mysqli)
    {
        $this->mysqli = $mysqli;
    }

    public function login($username, $password) //These variables are empty, even when they shouldn't be
    {
        $return['error'] = true;

        $uid = $this->getUserId(strtolower($username)); //Returns false because $username variable is empty

        if (!$uid) {
            $return['message'] = 'No such user.'; //Output
            return $return;
        }

        $user = $this->getUser($uid);

        if (!password_verify($password, $user['password'])) {
            $return['message'] = 'Password incorrect';
            return $return;
        }

        $return['error'] = false;
        $return['message'] = 'Logged in';

        return $return;
    }

    private function getUserId($username)
    {
        $stmt = $this->mysqli->prepare("SELECT id FROM users WHERE username = ?");
        $stmt->bind_param('s', $username);
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($id);

        if ($stmt->num_rows < 1) {
            return false;
        }

        $stmt->fetch();

        return $id;
    }

    private function getUser($uid)
    {
        $stmt = $this->mysqli->prepare("SELECT username, password, email FROM users WHERE id = ?");
        $stmt->bind_param('s', $uid);
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($username, $password, $email);

        if ($stmt->num_rows < 1) {
            return false;
        }

        $stmt->fetch();

        $return['uid'] = $uid;
        $return['username'] = $username;
        $return['password'] = $password;
        $return['email'] = $email;

        return $return;
    }
}

表单分配发送的变量。

<form method="POST" action="post.php">
    <label>Username
    <input style="display:block;width:250px;" type="text" name="username" required></label>
    <label>Password
    <input style="display:block;width:250px;" type="password" name="password"></label>
    <button style="display:block;" class="default_btn">Log in</button>
</form>

if (isset($_POST['username'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $auth = new Auth($mysqli);
    $auth->login($username, $password);

    if ($auth->login()['error']) {
        echo 'error:' . $auth->login()['message'];
    } else {
        echo 'success:' . $auth->login()['message'];
    }
}

编辑:

如果我在类方法中分配变量,代码就可以工作:

public function login($username = 'user', $password = 'pass')

但如果我这样做,它就行不通了:

$username = 'User';
$password = 'pass';

$auth = new Auth($mysqli);
$auth->login($username, $password);

另外,如果我在 $auth->login() 之外使用 $_POST 值,它们会被分配,因此在将它们传递给类时它们不为空......

【问题讨论】:

  • 如果您在调用$auth-&gt;login 之前执行var_dump 并在方法内做第一件事,您会得到什么?也许 $_POST 是空的。
  • 我检查得很快,我的测试变量通过就好了。我 99% 确定 POST 变量只是空的
  • 这里"SELECT id FROM users WHERE username = '$username'" 将变量直接注入到 sql 字符串中(=> 手动构建)。这样做与不使用准备好的语句一样危险。相反,您应该执行类似"SELECT id FROM users WHERE username = :username 和稍后的$stmt-&gt;execute(array('username' =&gt; $username)); 之类的操作。
  • var_dump($username, $password, __FILE__.__LINE__); 作为Auth::login 函数的第一行。这将确保使用正确的class
  • @RyanVincent 我正在使用 PHP 5.6.10。谢谢,我很好奇你会得到什么结果。

标签: php class methods


【解决方案1】:

问题似乎是您没有存储结果,而是在没有值的情况下再次调用登录:if ($auth-&gt;login()['error']) {

试试这个:

<form method="POST" action="post.php">
    <label>Username
    <input style="display:block;width:250px;" type="text" name="username" required></label>
    <label>Password
    <input style="display:block;width:250px;" type="password" name="password"></label>
    <button style="display:block;" class="default_btn">Log in</button>
</form>

if (isset($_POST['username'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $auth = new Auth($mysqli);
    $login_result = $auth->login($username, $password);

    if ($login_result['error']) {
        echo 'error:' . $login_result['message'];
    } else {
        echo 'success:' . $login_result['message'];
    }
}

【讨论】:

  • 是的!这做到了,不敢相信我自己没有想到它,但我想这就是当你一直盯着自己瞎看时会发生的事情。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多