我对安装扩展程序并不了解。我被困了因为我不能在SQLite中使用SQRT。
我在本地计算机上使用Laravel,我正在进行PHPunit测试。在一个测试中,我使用的是具有一些重要数学函数的查询。
我收到错误:
Caused by
PDOException: SQLSTATE[HY000]: General error: 1 no such function: SQRT
我发现SQLite有一个扩展名为: extension-functions.c
我下载了它,但我不确定我是否正确地做了一切(显然不是因为它不起作用):
我已将其下载并在终端中使用
gcc -fno-common -dynamiclib extension-functions.c -o libsqlitefunctions.dylib
我将其更改为
sqlite3.extension_dir =/usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib
并创建了扩展文件夹并将dylib文件放在
我用sudo apachectl restart
并尝试了我的查询,但仍然失败了。我做错了什么?
面向未来的读者
要在Laravel中使用它,你可以这样称呼它:
$pdo = DB::connection()->getPdo();
$pdo->sqliteCreateFunction('SQRT', 'sqrt', 1);
$pdo->sqliteCreateFunction('ASIN', 'asin', 1);
$pdo->sqliteCreateFunction('SIN', 'sin', 1);
$pdo->sqliteCreateFunction('COS', 'cos', 1);
$pdo->sqliteCreateFunction('POWER', 'pow', 2);
$pdo->sqliteCreateFunction('pi', 'pi', 0);
答案 0 :(得分:2)
您似乎想在PDO中使用它。问题是加载扩展只能使用SQLite3::loadExtension方法直接使用SQLite3 api。
PDO驱动程序不允许加载扩展(请参阅“安全注意事项”下的this wiki entry regarding LoadableExtensions)。
因此,您可以直接切换到SQLite3 api,也可以使用PDO的“用户定义函数”。例如,如果您需要SQRT
函数:
$db = new PDO('sqlite:testdb.sqlite', null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$db->sqliteCreateFunction('SQRT', 'sqrt', 1);
$stmt = $db->query("SELECT sqrt(25)");
foreach ($stmt as $row) {
echo $row[0], PHP_EOL; // output: 5.0
}
您的扩展程序提供的大多数数学函数都为PHP函数名称(如sqrt
)提供了1:1的映射,因此创建所需的函数应该很容易。
答案 1 :(得分:0)
您似乎将sqlite3.extension_dir
属性指向文件而不是目录。根据{{1}}的{{3}},sqlite3
属性为:
[The] SQLite可加载扩展所在目录的路径。
我认为如果你改变
可能会有用extension_dir
到
sqlite3.extension_dir = /usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib
然而,我会为SQLite3扩展创建一个单独的目录,这样它们就不会与PHP扩展混合在一起;我这样说是因为你好像正在使用sqlite3.extension_dir = /usr/local/etc/php/7.1/extension
属性的PHP扩展目录。 (如果你不是,那么请忽略这个注释。)我假设SQLite3只扫描配置目录中的可加载模块,并使用sqlite3.extension_dir
之类的东西加载它们。如果它尝试加载PHP扩展,则可能会发生冲突。 (谁知道,它可以优雅地处理这个。)