Как загрузить расширение sqlite в PDO?
Во-первых, я хочу сообщить об этом случае, чтобы избежать недоразумений.
По расширению sqlite я упоминаю расширение Sqlite, такое как FTS, а не расширение sqlite PHP.
Я использую PDO Sqlite в своем приложении, его нельзя изменить.
Как я видел здесь , расширения 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 - это метод моего расширения
Но когда я тестирую этот запрос из PDO, он возвращает "не авторизовано" сообщение.
Только для целей тестирования я попытался Расширение PHP Sqlite3 загрузить расширение, используя приведенный ниже код:
$db = new SQLite3('qwer.db');
$db->loadExtension('xyz.so');
Это работает
Поскольку я знаю, что PDO Sqlite не имеет такого метода, как loadExtension для загрузки расширений
Есть идеи, как я могу с этим справиться?
1 answers
Не удалось найти флаг компилятора, и мы решили эту проблему с помощью быстрого и грязного взлома в расширении pdo_sqlite. исправлен файл sqlite_driver.c с помощью функции sqlite3_enable_load_extension() из API sqlite3.
--- 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);
}
Надеюсь, это поможет...