我正在尝试创建一个脚本来检查提供的用户名是否在表“users”中,但“if”语句总是返回false。 users表只有一列“username”,列出了所有用户。我做错了什么?
$dbh = new PDO("sqlite:db.sqlite");
$stmt = $dbh->prepare("SELECT username from users where username = :name");
$stmt->bindParam(":name", $user);
$stmt->execute();
if($stmt->rowCount() > 0)
{
//in the table
}
else{
//not in the table
}
整个剧本:
<?php
require_once 'mclogin.class.php';
$api = new MinecraftAPI();
$user = $_POST['user'];
$password = $_POST['pword'];
if($api->login($user, $password)){
print $user;
$dbh = new PDO("sqlite:db.sqlite");
$stmt = $dbh->prepare("SELECT username from users where username = :name");
$stmt->bindParam(":name", $user);
$stmt->execute();
if($stmt->rowCount() > 0)
{
echo "You are whitelisted";
}
else{
echo "You are not whitelisted";
}
}else{
echo "Bad login";
}
?>
发送信息的页面:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<form name="input" action="login.do.php" method="post">
Username: <input type="text" name="user">
Password: <input type="password" name="pword">
<input type="submit" value="Submit">
</form>
</body>
</html>
答案 0 :(得分:4)
注意:强> 的
PDOStatement :: rowCount()返回受影响的行数 最后 DELETE,INSERT或UPDATE 语句由相应的执行 PDOStatement对象。
如果关联的PDOStatement执行的最后一条SQL语句是 一个SELECT语句,一些数据库可能会返回行数 由该声明返回。但是,无法保证此行为 适用于所有数据库,不应依赖便携式 的应用程序。强> 的
您应该使用以下代码,只需使用fetch()
方法检查结果是否为空。
$dbh = new PDO("sqlite:db.sqlite");
$stmt = $dbh->prepare("SELECT 1 from users where username = :name");
$stmt->bindParam(":name", $user);
$stmt->execute();
// use fetch instead of rowCount
if ($stmt->fetch()) {
// in the table
} else {
// not in the table
}
答案 1 :(得分:0)
将第2行更改为
$stmt = $dbh->prepare("SELECT username from users where username = :name");
它会起作用。在PDO中使用参数背后的整个想法是,如果需要,它们会以SQL注入安全方式自动引用。
对于像你这样的目的,我通常使用:
$stmt = $dbh->prepare("SELECT COUNT(*) from users where username = :name");
这将返回一个结果,我可以直接在if后直接使用,因为如果用户存在则返回一个,如果不存在则返回0,或者在数据库错误时返回false。