sqlite3—在PHP中计算SELECT语句返回的行的有效方法,无需使用count()

sqlite3—在PHP中计算SELECT语句返回的行的有效方法,无需使用count(),php,sql,sqlite,Php,Sql,Sqlite,我是一个SQLNoob,正在学习如何使用PDO。我正在学习一门介绍基本用户登录功能的课程。在登录页面的示例中,他们根据MySQL数据库检查用户名/密码。我稍微编辑了他们的代码,以便能够同时检查user/pass组合是否存在,并获取用户的名字: $sql = sprintf("SELECT firstname FROM users WHERE username='%s' AND password='%s'", mysql_real_escape_string($_POST["usernam

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

$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

感谢所有发表评论的人。直到现在,我才知道有两种不同的方法,即过程式和面向对象的方法,因此非常有用。

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

您需要单独查询count*,或者创建自己的counting查询函数


文档注释有点晚了,但我用SQLite3成功地尝试了这一点:

$result = $db->query('SELECT * FROM table_xy');
$rows = $result->fetchAll();
echo count($rows);

抱歉,这是数据库处理程序。将立即编辑您不能混合数据库库。