Në aplikacionin tim Laravel 5.5, thirrjet në DB::select të cilat ekzekutojnë një pyetje të përzgjedhur në një bazë të dhënash Postgresql dështojnë pa shfaqur ndonjë gabim në regjistrat e gabimeve të Apache ose Laravel dhe shkaktojnë një mesazh "Lidhja u rivendos". Ky mostër kodi ekzekutohet siç pritej sepse funksioni get_users_with_roles
ekziston.
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);
}
Sidoqoftë, nëse e zëvendësoj atë varg SQL me një funksion që nuk ekziston:
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);
}
Lidhja është rivendosur dhe nuk mund të shoh ndonjë gabim në regjistrat. Nëse e drejtoj këtë pyetje të gabuar në një mjedis vendas Postgresql:
SELECT * from test();
Unë marr një mesazh të qartë gabimi:
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.
Është veçanërisht e çuditshme sepse ky problem nuk është konsistent. Blloku provo ndonjëherë kap QueryException dhe shfaq mesazhin e gabimit Postgresql si përjashtim.
Kam provuar të shtoj
php_flag xcache.cacher Off
php_flag xcache.size 0
php_flag xcache.stat Off
në skedarin .htaccess por pa dobi.
Më duhet aftësia për të përdorur metodën DB::select sepse mbështetem shumë në funksionet SQL dhe plpgsql të përcaktuara nga përdoruesi Postgresql në aplikacion. Unë kam një funksion që ndërton SQL-në përkatëse dhe ia kalon metodën DB::select në mënyrë programore, kështu që duhet të jem në gjendje të kap përjashtimet e hedhura kur ka një gabim në SQL, si për shembull kur funksioni mungon.
Përditëso
Ky problem duket të jetë me mënyrën se si DB::select trajton çdo gabim SQL. Sapo e kam provuar këtë me një funksion që ekziston, por që hedh një gabim SQL. Përsëri, në vend që të më lejojë ta kap këtë në PHP me një bllok try/catch, ai thjesht rivendos lidhjen dhe nuk regjistron një gabim as në regjistrin e Laravel ose në regjistrin e Apache.
Kjo pyetje nuk hedh dritë. Përgjigja e pranuar atje i referohet sjelljes së pritur. Në mjedisin tim, QueryException nuk hidhet ose kapet.