我想创建一个登录系统 但不幸的是,这个错误出现了:
在错误的非对象上调用成员函数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');
}
}
答案 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
通过这种方式,您将能够确切地看到您获得的错误,然后进行相应的调试。
希望这有帮助!