首先,我想通知案件以避免误解。
通过sqlite扩展,我提到了Sqlite的扩展,就像FTS,而不是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中的此查询进行测试时,它会返回“未授权”消息。
仅出于测试目的,我尝试PHP's Sqlite3 extension使用以下代码加载扩展程序:
$db = new SQLite3('qwer.db');
$db->loadExtension('xyz.so');
它有效
我知道PDO Sqlite没有像loadExtension这样的方法来加载扩展
我知道如何处理这个问题?
答案 0 :(得分:6)
无法找到编译器标志,我们已经用pdo_sqlite扩展中的一个快速的黑客攻击来解决它。使用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);
}
希望这会有所帮助......
答案 1 :(得分:2)
我已经为a library实现了PHP 7.4+这个问题的解决方案,该解决方案不涉及重新编译PDO驱动程序。简而言之,它使用PHP的FFI扩展名和Z-Engine(通过FFI读取PHP的内部内存结构)直接调用SQLite C API。您可以在this blog post中找到更详细的背景信息。我不会在生产中推荐这种解决方案,但是对于测试或开发工作流来说,这可能是一个可行的解决方法。