【问题标题】:Laravel: Connecting to sqlite database throws "PDOException: Could not find driver"Laravel:连接到 sqlite 数据库抛出“PDOException:找不到驱动程序”
【发布时间】:2015-02-23 20:59:45
【问题描述】:

我正在将 Laravel 项目部署到共享主机并添加了一个 php.ini:

extension=pdo.so
extension=pdo_sqlite.so
extension=sqlite.so

在 phpinfo 中,我还可以看到 sqlite 扩展已加载。使用以下代码 sn-ps 连接到数据库的测试也有效:

<?php
try { 
    $dbh = new PDO("sqlite:app/database/production.sqlite");
    echo "Connected to database!";
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

但是,当尝试使用 Laravel 连接到数据库时,应用程序会抛出 PDOException 错误。

感谢您对此的任何帮助。提前致谢!

【问题讨论】:

  • 您是否完成了How to determine if PDO is enabled in PHP? 中的步骤 - 特别是在此分析器中:stackoverflow.com/a/6113496/367456。如果没有,请做他们。然后或如果是,请在您的问题中提供结果。这对于了解是什么让您的问题与现有的关于 sqlite 的问题不同并且具有相同的错误消息非常重要。
  • 使用 extension_loaded('pdo') 和 extension_loaded('pdo_sqlite') 返回 true。还有其他地方可以查吗?好像只有 laravel 应用在抱怨找不到驱动。
  • 这些结果对我来说看起来很有希望,驱动程序已加载。我要检查的下一点是是否可以找到 sqlite-database-file。请提供app/database/production.sqlite的绝对路径,从根目录开始,以/开头。
  • 数据库路径位于/public_html/mockup/app/database/production.sqlite,database.php中路径为DIR.'/../ database/production.sqlite' 我在本地机器上查看网站时没有问题。
  • 是的,不是文件名,只是看到。

标签: php sqlite laravel


【解决方案1】:

你得到的异常:

PDOException: 找不到驱动程序

当无法找到数据库的驱动程序时,由 PHP 的 PDO 给出。 PDO 需要一个驱动程序来操作不同的数据库(例如 Sqlite、Mysql 等)。 PDO 根据 DSN 查找驱动程序。在您的情况下,DSN 是:

sqlite:app/database/production.sqlite

并且对于驱动程序只在第一个冒号之前的部分(“:”)进行查看:

sqlite

字符串sqlite 用于查找sql​​ite3 驱动程序(参见PDO_SQLITE DSN in the PHP manual)。

在所有 PDO 中只有一个地方会引发此异常 (php 5.4 lxr),并且仅在 DSN 中冒号前的文本找不到驱动程序的情况下才会引发此异常。这也是您可以从错误消息中得到的结果。

由于您已经完成了the best answer to "How to determine if PDO is enabled in PHP" 中概述的检查,您已经确定 PDO sqlite extension 已加载。

澄清一下:包含用于 sqlite 的 PDO 驱动程序的 PHP 扩展名为 pdo_sqlite,您已检查它是否已加载。

我唯一的解释是您确实加载了 extension 但 PHP 无法加载 驱动程序。根据 PHP 来源 (php 5.4 lxr),这可能有两个原因:

  1. PDO 驱动程序需要不同的 PDO API 版本
  2. 必须在加载任何 PDO 驱动程序之前加载 PDO

(技术上还有第三个原因,但应该忽略:将驱动程序添加到 PDO 驱动程序的哈希表失败,这是非常内部的,与 PDO 无关)

由于加载了扩展,但没有找到驱动程序,我怀疑注册 PDO 驱动程序有问题。您应该检查 PHP 错误日志以了解启动错误。正如您所说,您在共享主机上遇到此问题,您需要联系支持人员,您可以在其中找到 PHP 错误日志。您正在寻找启动错误。有时这些错误也会显示在网络服务器的错误日志中,具体取决于使用的 PHP SAPI 接口。

还请提供来自phpinfo() 的信息,以便提供更多指导。根据您提供的信息,您可以放心 PDO 的 sqlite 驱动程序尚未加载。这是一个配置问题。

【讨论】:

  • 在配置命令中,列出了'--with-pdo-sqlite=shared'和'--with-sqlite=shared'。此外,phpinfo() 显示 sqlite 的 PDO 驱动程序已启用,并且 SQLite 库被列为 3.7.7.1 我将尝试查看是否可以获取 PHP 错误日志。
  • 共享主机的高级技术支持已包含默认 php.ini 并取消了我在第一篇文章中包含的行的注释,并且页面加载正常。我不确定做了什么,但我会保留这个 ini 文件以供进一步使用。
  • 扩展很可能是在服务器本身上配置的。您不需要在自己的 php.ini 中加载扩展。有关如何配置扩展以及默认情况下可用的扩展的更多信息,请参阅您的托管商 PHP 文档。 - 我仍然不明白这是如何阻止司机被发现的。也许驱动程序已经加载了两次?
猜你喜欢
  • 2015-06-22
  • 2018-11-08
  • 2019-01-22
  • 2014-12-16
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多