【问题标题】:How to load sqlite extension in PDO?如何在 PDO 中加载 sqlite 扩展?
【发布时间】:2012-02-04 01:59:12
【问题描述】:

首先,我想通报一下这个案子,以免引起误解。

通过sqlite扩展,我提到了类似FTS的Sqlite扩展,而不是PHP的sqlite扩展。

我一直在我的应用程序中使用 PDO Sqlite,它无法更改。

正如我看到的here,可以加载 Sqlite 扩展,如下所示:

SELECT load_extension('xyz.so');
$db = new PDO ( 'sqlite:qwert.db' );
$db->query("SELECT load_extension('myextension.so');");
$db->query("SELECT myfunction(name) FROM table");
$rows = $db->fetchAll(PDO::FETCH_CLASS, 'stdClass');

注意:myfunction 是 myextension 的方法

但是当我从 PDO 使用这个查询进行测试时,它返回“not authorized”消息。

仅出于测试目的,我尝试PHP's Sqlite3 extension 使用以下代码加载扩展:

$db = new SQLite3('qwer.db');
$db->loadExtension('xyz.so');

有效

据我所知,PDO Sqlite 没有类似 loadExtension 的方法来加载扩展

知道我该如何处理吗?

【问题讨论】:

  • 您应该添加您的代码如何连接到 sqlite 数据库,并显示您如何触发 SELECT load 查询。
  • 错误出现在哪里?加载扩展程序或调用myfunction 时?

标签: php sqlite pdo


【解决方案1】:

找不到编译器标志,我们已经通过 pdo_sqlite 扩展中的 quick'n dirty hack 解决了这个问题。使用 sqlite3 API 中的 sqlite3_enable_load_extension() 修补了 sqlite_driver.c。

--- php-5.3.7.old/ext/pdo_sqlite/sqlite_driver.c    2012-01-06 11:04:44.000000000 -0500
+++ sqlite_driver.c 2012-01-06 08:16:58.000000000 -0500
@@ -718,6 +718,8 @@
        goto cleanup;
    }
 
+   sqlite3_enable_load_extension(H->db, 1);
+
    if (PG(safe_mode) || (PG(open_basedir) && *PG(open_basedir))) {
        sqlite3_set_authorizer(H->db, authorizer, NULL);
    }

【讨论】:

  • 在 7 年后再次修复了同样的问题,谢谢 :)
【解决方案2】:

除了上面提到的解决方法之外,现在没有其他方法。如果您想在将来的某个地方查看进度,可以使用an issue on PHP bugtracker

【讨论】:

    【解决方案3】:

    我已经为 PHP 7.4+ 实现了a library 解决方案,该解决方案不涉及重新编译 PDO 驱动程序。简而言之,它使用 PHP 的 FFI 扩展和 Z-Engine(使用 FFI 读取 PHP 的内部内存结构)直接调用 SQLite C API。您可以在this blog post 中找到更详细的背景信息。我不建议在生产中使用此解决方案,但它可能是测试或开发工作流程的可行解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 2010-11-13
      • 2017-01-12
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      相关资源
      最近更新 更多