Pdo Sqlite and php


Pdo Sqlite and php

我有一个与php/pdo和sqlite相关的问题。我已经将一些代码从 mysql 后端移植到 sqlite 后端。我在这个项目中经常使用 rowCount()。

在我的原始Mysql应用程序中,我这样做了:

$stmt = $db->query("SELECT id FROM table where id = $id "); 
$rc = $stmt->rowCount();
if ($rc == 1) {
// do something 
    }

文档说此方法仅用于从更新、插入、删除查询返回受影响的行,使用 PDO_MYSQL 驱动程序(仅限此驱动程序)您可以获取 SELECT 查询的行计数。

那么,如何使用 sqlite 后端实现同样的事情呢?

这就是我最终做到的方式:

$stmt = $db->query("SELECT count(id) as cnt FROM table where id = $id "); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    if ($row['cnt'] == "1") {
        // do something
    } else {
        return false;
        }
    }
}

我正在寻找一个更优雅的解决方案,同时实现与rowCount()相同的目标。

这是在 pdo 中执行此操作的方法:

$stmt = $db->query('SELECT * FROM table');
if ($stmt->rowCount() == 1) {
    //...
} else {
    //...
}
echo $row_count.' rows selected';

(与XD相同)

顺便说一句,我不建议做这样的事情

$stmt = $db->query("SELECT count(id) as cnt FROM table where id = $id "); 

这样的语句中使用变量是不好的。 使用类似以下内容:

$stmt = $db->query('SELECT id FROM table where id = ?');
$stmt->execute(array($id));
if ($stmt->rowCount() == 1)
{
    $arr = $stmt->fetch(PDO::FETCH_ASSOC);
    foreach($arr as $element)
    {
        echo '<pre>'.print_r($element).'</pre>';
    }
}
else
{
    //...
}

这是我正在使用的一些代码的一部分:

$stmt = $db->prepare('SELECT * FROM users WHERE id=?');
$stmt->execute(array($id));
if ($stmt->rowCount() == 1) {
    $currentUser = $stmt->fetchAll(PDO::FETCH_ASSOC)[0];
} else {
    return false;
}

编辑:(针对兼容性问题)

$stmt = $db->query('SELECT * FROM table');
$arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (($arr === false) || (sizeof($arr) == 0)) {
    return false;
} else {
    //... do ....
    echo sizeof($arr);
}