Programim dhe zhvillim, javascript, python, php, html

Kur telefononi DB:: zgjidhni pse marr një mesazh Lidhja u rivendos?

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.


  • Çfarë përmban $all kur përjashtimi nuk hidhet? 21.04.2018
  • A keni provuar të kapni \Throwable (në vend të QueryException) për të parë nëse ndoshta është duke u hedhur një përjashtim tjetër dhe më pas është gëlltitur nga një mbajtës tjetër në aplikacionin tuaj? 21.04.2018
  • $all përmban çdo gjë që kthen deklarata Select. Në këtë rast, ai kthen një tabelë si një grup objektesh, por unë kam shembuj të tjerë ku thjesht po kthej një vlerë skalare. Megjithatë, unë kam të njëjtin problem që nuk mund ta kap gabimin sql nëse nuk kthehet. 21.04.2018
  • Provova të kapja \Throwable por nuk pati asnjë ndryshim. 21.04.2018
  • Pra, ju po thoni, ky kod $all = DB::select('SELECT * from test()', []); prodhon një $all që përmban një grup objektesh, edhe pse test supozohet se nuk ekziston? 21.04.2018
  • Nr. $all = DB::select('SELECT * from get_users_with_roles()', []); ka sukses siç pritej. Kur ndryshoj SQL në një që shkakton një gabim në Postgresql, blloku Laravel try/catch nuk e kap përjashtimin. Testi i funksionit () nuk ekziston kështu që shkakton një gabim. 21.04.2018
  • Le të të vazhdojmë këtë diskutim në chat. 21.04.2018

Përgjigjet:


1

Pjesa e ndërlikuar e kësaj ka qenë refuzimi kokëfortë i shfletuesit për të zbuluar çdo formë mesazhi gabimi. Kur kjo ndodh, më pëlqen të shkoj në vijën e komandës dhe ta provoj, duke eleminuar kështu serverin në internet si një variabël.

Nga biseda, mësuam se linja e komandës tregoi gabimin siç pritej, por nuk e bëri këtë me hijeshi: gabimi doli dhe skripti u ndal. Ky është një përplasje e rëndë, që nuk i atribuohet serverit të uebit.

Me futjen e \Throwable, skenarët ku PHP vdes fort po bëhen gjithnjë e më të pakta. Pra, në një përpjekje për të kapur frymën e vdekjes së PHP-së, ne zbatuam një register_shutdown_function që tërhoqi error_get_last në një përpjekje për të kuptuar se çfarë, nëse ka ndonjë gjë, u tha pak para se të hidhej në erë.

Kjo zbuloi, shkurtimisht, mesazhin e gabimit në shfletues (këtë herë duke përdorur një shfletues tjetër). Megjithatë, kjo nuk ishte e përsëritshme. Vështrimi në këtë pikë ishte në caching: composer dump-autoload e rregulloi problemin!

Dyshoj se ajo që ka ndodhur është kjo:

  • Eloquent bëri një përjashtim
  • PHP po e shpërndante atë përmes klasave të trajtimit të përjashtimeve të Laravel
  • Në një moment, PHP u përpoq të ngarkonte një klasë që nuk ishte në ngarkuesin automatik
  • PHP u rrëzua fort (ky është një nga ato raste kur PHP 7.0 lirohet)

Duke ekzekutuar composer dump-autoload, të gjitha klasat "të munguara" u futën në fushëveprimin e ngarkuesit automatik dhe, kur u provua përsëri, ndodhi sekuenca e saktë e kodit.

21.04.2018
  • Ju lutemi kontrolloni pyetjen time të fundit në stackoverflow.com/questions/54130437/ Problemi është kthyer dhe është edhe më i vështirë. Ndërsa shkruaj, po përmirësoj në PHP 7.3 dhe Laravel 5.7 me shpresën e kotë për të hedhur përjashtime kur priten! 10.01.2019

  • 2

    Unë mendoj se është një gabim i pyetjes Sql

     `SELECT * from test()` 
    

    Meqenëse kllapa () tregon funksionin, prandaj përpiquni të përdorni like

     `SELECT * from test` in your query 
    

    Mënyra më e mirë në Laravel

    Krijo një model me php artisan make:model Test

    Pastaj përdorni në kontrollues si

         `use App\Test;'
    

    dhe më pas për të marrë të dhënat Test::all(); do të sjellë të gjitha të dhënat nga baza e të dhënave si kërkesa juaj SELECT * nga Testi

    25.04.2018
  • Jay, e di që është një gabim SQL. E kam ndezur qëllimisht për qëllime testimi. Siç e shpjegova në pyetjen time, unë mbështetem në funksionet Postgres kështu që më duhet të përdor DB::select me SQL të papërpunuar. Modeli Elokuent i Laravel punon me tabela, jo me funksione. Ju lutemi lexoni përgjigjen që i dhashë bonusin. Unë jam i detyruar të të votoj kundër sepse e ke keqkuptuar pyetjen. 28.04.2018
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..