在我的代码中出现对错误的非对象的成员函数fetchColumn()的调用

时间:2016-02-23 18:53:12

标签: php

我想创建一个登录系统 但不幸的是,这个错误出现了:

在错误的非对象上调用成员函数fetchColumn()

请有人可以帮助我,因为这是本论坛的第一篇文章...

<form action="login_controller.php" method="POST">
        <span class="user_label">Username: </span>
        <input class="username" type="text" name="username"><p>
        <span class="pass_label">Password: </span>
        <input class="password" type="password" name="password"><p>
        <input class="submit" type="submit" name="submit" value="Login">
</form>
<?php
    require_once 'config/config.php';

if (isset($_POST['submit']) && $_POST['submit'] == 'Login') {

    $username = $_POST['username'];
    $password = $_POST['password'];

    if (!empty($username) && !empty($password)) {


        $users_count = $pdo->query("SELECT COUNT(username) 
                                    FROM users
                                    WHERE username = {$username}");
        $count_all = $users_count->fetchColumn();

        print_r($count_all);

    }

    else {
        header('Location: login.php');
    }

}

6 个答案:

答案 0 :(得分:1)

您需要在{$username}附近的SQL中添加引号:

SELECT COUNT(username)
FROM users
WHERE username = '{$username}'

因为您的SQL中有错误,所以返回FALSE。

您应该始终检查SQL错误。您可以按如下方式执行此操作:

$users_count = $pdo->query("SELECT COUNT(username) 
                            FROM users
                            WHERE username = '{$username}'");
if ($users_count == false) {
    print_r($pdo->errorInfo());
    exit();
}

当出现问题时,这将为您提供错误信息。

最后,请注意在SQL中注入字符串会使您容易受到SQL注入攻击。相反,您应该prepare your statements和用户参数:

$stmt = $pdo->prepare("SELECT COUNT(username)
                       FROM users
                       WHERE username = ?");
if (!$stmt->execute($username)) {
    print_r($pdo->errorInfo());
    exit();
}
$count_all = $stmt->fetchColumn();

答案 1 :(得分:1)

您在SQL中错过{$username}周围的引号。但最好使用准备好的查询。

$stmt = $pdo->prepare("SELECT COUNT(username) FROM users
                       WHERE username = :username");
$stmt->bindParam(':username', $username);
if ($stmt->execute()) {
    $count_all = $stmt->fetchColumn();
} else {
    $count_all = null;
}

答案 2 :(得分:0)

检查$users_count包含的内容。它不是对象(可能是NULL或false,因为在db中找不到用户名)。

您的错误意味着NULL->fetchColumn()

答案 3 :(得分:0)

您的$users_count可能是null,这就是您收到此错误的原因。

答案 4 :(得分:0)

使用:

   $users_count = $pdo->query("SELECT COUNT(username) 
                                            FROM users
                                            WHERE username = {$username}");
        if($users_count){
            $count_all = $users_count->fetchColumn();
        }
    else{
        $count_all = null)
    }

避免这种错误

答案 5 :(得分:0)

正如其他用户建议的那样,您的$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 变量可能设置为Null,这意味着您的SQL查询中存在错误。要启用错误日志记录,您可以将以下代码行添加到PDO连接中:

json

通过这种方式,您将能够确切地看到您获得的错误,然后进行相应的调试。

希望这有帮助!