如何在Mac上本地安装SQLite中的扩展程序?

时间:2018-06-18 14:24:32

标签: php macos sqlite php-extension

我对安装扩展程序并不了解。我被困了因为我不能在SQLite中使用SQRT。

我在本地计算机上使用Laravel,我正在进行PHPunit测试。在一个测试中,我使用的是具有一些重要数学函数的查询。

我收到错误:

Caused by
PDOException: SQLSTATE[HY000]: General error: 1 no such function: SQRT

我发现SQLite有一个扩展名为: extension-functions.c

我下载了它,但我不确定我是否正确地做了一切(显然不是因为它不起作用):

  1. 我已将其下载并在终端中使用

    gcc -fno-common -dynamiclib extension-functions.c -o libsqlitefunctions.dylib
    
  2. 编译了这些数据:libsqlitefunctions.dylib
  3. 使用php --ini如果发现我的php.ini位于/usr/local/etc/php/7.1/php.ini
  4. 现在我查找sql​​ite3并发现此注释; sqlite3.extension_dir =
  5. 我将其更改为

    sqlite3.extension_dir =/usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib
    
  6. 并创建了扩展文件夹并将dylib文件放在

  7. 我用sudo apachectl restart

  8. 重新启动了我的apache
  9. 并尝试了我的查询,但仍然失败了。我做错了什么?

  10. 面向未来的读者

    要在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);
    

2 个答案:

答案 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扩展,则可能会发生冲突。 (谁知道,它可以优雅地处理这个。)