我对安装扩展没有真正的了解。我被困住了,因为我无法在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
- 它编译了这些数据:libsqlitefunctions.dylib 使用 php -
- -ini 如果发现我的 php.ini 位于/usr/local/etc/php/7.1/php 中.ini
- 现在我查找了 sqlite3 并发现这个评论;sqlite3.extension_dir =
我把它改成了
sqlite3.extension_dir =/usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib
并创建了扩展文件夹并将 dylib 文件放入其中
我用sudo apachectl重新启动了我的apache
并尝试了我的查询,但仍然失败。我做错了什么?
对于未来的读者
要在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);
似乎您想将其与PDO一起使用。问题是加载扩展只能直接使用 SQLite3::loadExtension 方法与 SQLite3 api一起使用。
PDO驱动程序不允许加载扩展(请参阅"安全注意事项"下有关可加载扩展的维基条目(。
因此,您可以直接使用 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
}
扩展提供的大多数数学函数都 1:1 映射到 PHP 函数名称(如sqrt
(,因此创建所需的函数应该很容易。
您似乎将sqlite3.extension_dir
属性指向文件而不是目录。根据sqlite3
手册,extension_dir
属性为:
[该] SQLite 的可加载扩展所在的目录的路径。
我认为如果你改变它可能会起作用
sqlite3.extension_dir = /usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib
自
sqlite3.extension_dir = /usr/local/etc/php/7.1/extension
但是,我会为 SQLite3 扩展创建一个单独的目录,这样它们就不会与 PHP 扩展混合;我之所以这样说,是因为您当前似乎正在使用sqlite3.extension_dir
属性的 PHP 扩展目录。(如果您不是,请忽略此注释。我假设 SQLite3 只是扫描配置的目录中的可加载模块并使用类似dlopen
的内容加载它们。如果它尝试加载 PHP 扩展,这可能会发生冲突。(谁知道呢,它可能会优雅地处理这个问题。