如何在 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 扩展?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 chrome 扩展中加载 Google Analytics 和 Facebook SDK?
如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件
如何在按钮单击事件中的模式弹出扩展器中的iframe中加载页面?