1

我是一个 SQL 菜鸟,正在学习如何使用 PDO。我正在做一门介绍基本用户登录功能的课程。在登录页面的示例中,他们根据 MySQL 数据库检查用户名/密码。我稍微编辑了他们的代码,以便能够同时检查用户/密码组合是否存在并获取用户的名字:

$sql = sprintf("SELECT firstname FROM users WHERE username='%s' AND password='%s'",
    mysql_real_escape_string($_POST["username"]),
    mysql_real_escape_string($_POST["password"]));

        // execute query
        $result = mysql_query($sql);

    if (mysql_num_rows($result) == 1) {
        $_SESSION["authenticated"] = true;

        // get contents of "firstname" field from row 0 (our only row) 
        $firstname = mysql_result($result,0,"firstname");
        if ($firstname != '')
            $_SESSION["user"] = $firstname;
    }

我想做的是改用 SQLite 并做同样的事情。四处搜索只会导致人们说您应该使用SELECT COUNT(*)语句,但如果可能的话,我不想使用额外的查询。由于我正在选择该firstname字段,因此如果用户存在,我应该只返回 1 行,如果不存在,我应该只返回 0 行。我希望能够使用该号码来检查登录是否正确。

到目前为止,我有这个:

$dsn = 'sqlite:../database/cs75.db';
$dbh = new PDO($dsn);

$sql = sprintf("SELECT firstname FROM users WHERE username='%s' AND password='%s'",
                    $_POST["username"],
                    $_POST["password"]);

// query the database and save the result in $result
$result = $dbh->query($sql);

// count number of rows
$rows = sqlite_num_rows($result);

if ($rows == 1) { ...

但这正在返回警告: sqlite_num_rows() 期望参数 1 是资源,给定对象

有没有一种方法可以像在 MySQL 中一样有效地做到这一点,还是我必须使用第二个查询?


编辑

我发现了这个,不确定它是否是最好的方法,但它似乎有效:如何获取按列分组的行数?

这段代码让我在没有第二个查询的情况下做到这一点:

// query the database and save the result in $result
$result = $dbh->query($sql);

// count number of rows
$rows = $result->fetch(PDO::FETCH_NUM);

echo 'Found: ' . $rows[0];

$rows是一个数组,所以我可以数它来检查它是否 > 0。

感谢所有评论的人。直到现在我才知道有 2 种不同的方法(过程和面向对象),所以这很有帮助。

4

2 回答 2

1

通常,您可以使用PDOStatement::rowCount(),但是 SQLite v3 似乎没有为查询提供行数。

您需要单独查询计数(*),或创建自己的计数查询函数。

文档评论有一个例子

于 2013-07-01T20:36:55.663 回答
-1

有点晚了,但我用 SQLite3 成功尝试了这个:

$result = $db->query('SELECT * FROM table_xy');
$rows = $result->fetchAll();
echo count($rows);
于 2015-08-21T07:45:46.840 回答