如何在PDO中加载sqlite扩展?

时间:2012-01-06 10:05:39

标签: php sqlite pdo

首先,我想通知案件以避免误解。

通过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这样的方法来加载扩展

我知道如何处理这个问题?

2 个答案:

答案 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中找到更详细的背景信息。我不会在生产中推荐这种解决方案,但是对于测试或开发工作流来说,这可能是一个可行的解决方法。