PHP SQLite PDO检查用户是否在表中?

时间:2012-10-04 05:14:53

标签: php sqlite pdo

我正在尝试创建一个脚本来检查提供的用户名是否在表“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>

2 个答案:

答案 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。