sqlite3 - 在不使用COUNT()的情况下计算PHP中SELECT语句返回的行的有效方法

时间:2013-07-01 20:14:14

标签: php sql sqlite

我是一个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一样高效地完成这项工作,还是必须使用第二个查询?

<小时/> 的修改

我发现了这一点,不确定这是否是最好的方式,但似乎有效:How to get the number of rows grouped by column?

此代码允许我在没有第二个查询的情况下执行此操作:

// 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是一个数组,所以我可以算一下来检查它是否是&gt; 0

感谢所有评论的人。直到现在我还不知道有两种不同的方法(程序和面向对象),因此帮助很大。

2 个答案:

答案 0 :(得分:1)

通常,您可以使用PDOStatement::rowCount(),但SQLite v3似乎不提供查询的行计数。

您需要单独查询count(*),或创建自己的count-query-function。

文档评论有an example of this

答案 1 :(得分:-1)

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

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