2012-01-06 12 views
7

Najpierw chcę poinformować o sprawie, aby uniknąć nieporozumień.Jak załadować rozszerzenie sqlite w PDO?

Przez rozszerzenie sqlite, wspominam rozszerzenie Sqlite jak FTS, a nie rozszerzenie sqlite PHP.

Używam PDO Sqlite w mojej aplikacji, nie można go zmienić.

jak widziałem here, SQLite Rozszerzenia mogą być ładowane jako kwerendy widać poniżej:

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'); 

Uwaga: myfunction jest metoda myextension

Ale kiedy test z tego zapytania z PDO, to return "nie autoryzowany" wiadomość.

Tylko do testowania celów, próbowałem PHP's Sqlite3 extension załadować rozszerzenie za pomocą poniższego kodu:

$db = new SQLite3('qwer.db'); 
$db->loadExtension('xyz.so'); 

Działa

Ponieważ wiem, że PDO Sqlite hasnot metody takie jak loadExtension rozszerzeń załadowczych

Każdy pomysł, jak sobie z tym poradzić?

+0

Należy dodać swój kod, jak połączyć się z bazą danych i sqlite, który pokazuje w jaki sposób ogień 'select load' zapytania. – hakre

+0

Gdzie pojawia się błąd? Podczas ładowania rozszerzenia lub podczas wywoływania 'myfunction'? –

+0

Podczas ładowania rozszerzenia – WebolizeR

Odpowiedz

6

nie można znaleźć flagi kompilatora, a my rozwiązaliśmy ją za pomocą szybkiego i brudnego hacka w rozszerzeniu pdo_sqlite. naprawiono plik sqlite_driver.c z sqlite3_enable_load_extension() z interfejsu 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); 
    } 

Nadzieja to pomaga ...