如何在 PDO 中加载 sqlite 扩展?

Posted

技术标签:

【中文标题】如何在 PDO 中加载 sqlite 扩展?【英文标题】:How to load sqlite extension in PDO? 【发布时间】: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 时? 【参考方案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 中找到更详细的背景信息。我不建议在生产中使用此解决方案,但它可能是测试或开发工作流程的可行解决方法。

【讨论】:

以上是关于如何在 PDO 中加载 sqlite 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何插入带有 PDO 扩展的 SQLite?

如何在 chrome 扩展中加载 Google Analytics 和 Facebook SDK?

如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件

如何在按钮单击事件中的模式弹出扩展器中的iframe中加载页面?

如何使用 NGINX、PHP-FPM 在 docker-compose.yml 文件中加载 mysqli 扩展

如何在html文件中加载css文件已经在django中扩展了另一个html文件(base.html)