【问题标题】:Pdo Sqlite and phpPdo Sqlite 和 php
【发布时间】:2014-12-09 21:13:49
【问题描述】:

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

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

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

文档说此方法仅用于从 UPDATE、INSERT、DELETE 查询中返回受影响的行,使用 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,您仍然可以使用rowCount()
  • Row count with PDO的可能重复

标签: php pdo sqlite


【解决方案1】:

这是在 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);
}

【讨论】:

  • 正如我在问题中所说,根据文档和我的经验,如果您使用 Mysql 作为后端,rowCount() 仅适用于 select 语句,而不适用于 sqlite。 @DevPGSV
猜你喜欢
  • 2012-08-30
  • 2013-04-02
  • 2017-03-29
  • 2019-03-02
  • 2021-12-27
  • 2011-12-16
  • 2013-01-30
  • 2016-03-27
  • 2017-08-18
相关资源
最近更新 更多