在我的Laravel 5.5应用程序中,调用DB :: select在Postgresql数据库上运行select查询失败,而不显示Apache或Laravel错误日志中的任何错误,并触发“连接已重置”消息。此代码示例按预期运行,因为函数get_users_with_roles
存在。
public function missing_function(Request $request) {
try{
$all = DB::select('SELECT * from get_users_with_roles()', []);
}catch(Illuminate\Database\QueryException $qe){
return json_encode($qe->getMessage());
}
return json_encode($all);
}
但是,如果我用不存在的函数替换该SQL字符串:
public function missing_function(Request $request) {
try{
$all = DB::select('SELECT * from test()', []);
}catch(Illuminate\Database\QueryException $qe){
return json_encode($qe->getMessage());
}
return json_encode($all);
}
重置连接,我在日志中看不到任何错误。如果我在本机Postgresql环境中运行此错误查询:
SELECT * from test();
我收到一条明确的错误消息:
ERROR: function test() does not exist
LINE 1: select * from test()
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
特别奇怪,因为这个问题并不一致。 try块有时会捕获QueryException并将Postgresql错误消息显示为例外。
我尝试过添加
php_flag xcache.cacher Off
php_flag xcache.size 0
php_flag xcache.stat Off
到.htaccess文件但无济于事。
我需要能够使用DB :: select方法,因为我在应用程序中严重依赖Postgresql用户定义的SQL和plpgsql函数。我有一个构造相关SQL的函数,并以编程方式将它传递给DB :: select方法,因此我需要能够捕获SQL中出现错误时抛出的异常,例如函数丢失时。
更新
这个问题似乎与DB :: select处理任何SQL错误的方式有关。我刚用一个存在但抛出SQL错误的函数尝试了这个。同样,不是允许我在PHP中使用try / catch块捕获它,而是重置连接,并且不会在Laravel日志或Apache日志中记录错误。
这question没有任何消息。那里接受的答案是指预期的行为。在我的环境中,不会抛出或捕获QueryException。
答案 0 :(得分:4)
这个棘手的部分是浏览器顽固拒绝透露任何形式的错误信息。当发生这种情况时,我喜欢转到命令行并尝试它,从而将Web服务器作为变量消除。
从聊天中,我们了解到命令行显示了预期的错误,但没有优雅地执行此操作:输出错误,并停止脚本。这是一次严重的崩溃,不属于网络服务器。
随着\Throwable
的引入,PHP死硬的场景越来越少。因此,为了抓住PHP的垂死气息,我们实施了一个register_shutdown_function
拉error_get_last
,试图弄清楚在爆炸之前是什么,如果有的话。
这简要地揭示了浏览器中的错误消息(这次是使用不同的浏览器)。但是,这是不可重复的。此时的洞察力是缓存:composer dump-autoload
解决了问题!
我怀疑发生了什么事:
Eloquent
抛出异常通过运行composer dump-autoload
,所有"缺失"课程被带入自动加载器的权限,再次尝试时,正确的代码序列发生了。
答案 1 :(得分:-2)
我认为它是一个Sql查询错误
`SELECT * from test()`
因为()括号表示功能所以尝试使用
`SELECT * from test` in your query
laravel的最佳方式
然后在控制器中使用
`use App\Test;'
然后获取记录
Test::all();
它将带来数据库中的所有记录,例如您的要求SELECT * from Test