【问题标题】:PDO SQLite difficultiesPDO SQLite 困难
【发布时间】:2012-03-15 04:53:48
【问题描述】:

谁能告诉我我的代码有什么问题。当我尝试使用该功能时,我得到:

Fatal error: Call to a member function setFetchMode() on a non-object in ...

使用:

if (!$IDq) { print_r($dbh->errorInfo()); } 

给我: 文件已加密或不是数据库

我多年来一直在搞乱它,但似乎无法让它发挥作用。

function user_registered($user_id){
$dbh = new PDO("sqlite:datastore/userids.db");
$IDq = $dbh->query("SELECT * FROM users_identify WHERE identifier = '$user_id'");
$IDq->setFetchMode(PDO::FETCH_ASSOC);
$IDf = $IDq->fetch();
if($IDf['id']){
return $IDf['id'];
}else{
return 0;
}
}

谢谢。

编辑:啊,谢谢你的帮助。我发现了问题,当我需要一个 sqlite 3 数据库时,我使用的是一个 sqlite 2 数据库。

【问题讨论】:

  • 在你的query之后添加这个:if (!$IDq) { print_r($dbh->errorInfo()); }
  • @calummc - 最好添加您自己的答案,而不是编辑您的问题以添加它。您可以为自己打勾,但不要忘记为您认为有帮助的任何人 +1。
  • 是的,我正打算这样做,但 SO 说了一些关于无法以少于 100 次代表回答您自己的问题。 7 小时内。

标签: php sqlite pdo


【解决方案1】:

我会说,您的 SQL 查询和行中有错误

$dbh->query('...')

返回 false - 根据 manual。那么你就不能在false上调用setFetchMode方法了。

启用抛出异常,它应该可以帮助你:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

【讨论】:

    【解决方案2】:

    默认情况下,如果查询失败,PDO 不会从 PDO::query() 返回 PDOStatement。相反,$IDq 将设置为 false,这是一个非对象。

    您的查询或 PDO 对象有问题,您可以通过以下方式检查:

    var_dump($dbh->errorInfo());
    

    此外,PHP 建议如果您要使用 PDO::query(),请以这种方式保护您的查询:

    $IDq = $dbh->query("SELECT * FROM users_identify WHERE identifier = " . $dbh->quote($user_id));
    

    【讨论】:

    • 谢谢,我得到:文件已加密或不是数据库。我可以用 phpLiteAdmin 打开 userids.db...
    • 不推荐使用 PDO::query() 的文件在哪里?
    • @thetaiko 我可能对 PDO::query() 有误解,但是... php.net/manual/en/pdo.quote.php "如果您使用此函数构建 SQL 语句,强烈建议您使用 PDO:: prepare() 来准备带绑定参数的 SQL 语句,而不是使用 PDO::quote() 将用户输入插入到 SQL 语句中。带绑定参数的准备好的语句不仅更便携、更方便、不受 SQL 注入的影响,而且通常执行起来比插值查询快得多,因为服务器端和客户端都可以缓存查询的编译形式。”
    • @Deltik - 如果您传入数据,PHP 建议准备然后执行查询。但是没有建议反对使用->query,就其本身而言。不过,我现在有争议,对此我深表歉意。我真的很好奇我错过的文档中是否存在某种性能影响或安全影响。
    • @thetaiko 所以我想我错了 PDO::query() 没有明确推荐。我已编辑我的答案以修正我的错误。
    【解决方案3】:

    我发现了问题,当我需要一个 sqlite 3 数据库时,我正在使用一个 sqlite 2 数据库。我猜这是“文件已加密或不是数据库”消息的来源。

    var_dump($dbh->errorInfo());
    

    帮助我找到了问题的根源。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 2016-12-24
      • 2019-07-16
      相关资源
      最近更新 更多