Joyride Posted July 18, 2007 Report Share Posted July 18, 2007 (edited) Izmantoju pasa rakstitu vienkarsu klasi, kura ir wrapotas mysql funkcijas, piem., $DB->Query($sql) veic pieprasijumu, saglaba mainigaja atgriezto ierakstu skaitu un izveido datu masivu, lai uzreiz varetu operet ar datiem... Jautajums ir - ka butu pareizak Query() funkciju veidot. Paslaik ir ta, ka ja mysql_query() atgriez false (kluda vaicajuma), tad ir die('DB ERROR'). Pec idejas, labak jau ir atgriezt vertibu, ko atgriez mysql_query(), nevis likt skriptam mirt. Savukart, saja gadijuma naktos VISUR parbaudit, ko tas kverijs atgriezis un ja atgriez false, tad VISUR paredzet attiecigu darbibu. Ja, piemeram, pieprasam menu items, bet kverijs atgriez false, vai tad ir jega skriptam vispar talak izpildities? Kadas ir jusu domas? EDIT: Ja kads nesaprata, tad mysql_query() tiek izsaukta ieks klases $DB->Query() funkcijas :) Edited July 18, 2007 by Joyride Link to comment Share on other sites More sharing options...
bubu Posted July 18, 2007 Report Share Posted July 18, 2007 kļūdas gadījumā izsauc kautkādu kļūdas funkciju, kurā izvadi smuku kļūdas paziņojuma lapu, lai iekļaujas lapas kopējā stilā (tipa: Atvainojiet notikusi kautkāda kļūda. Pienāciet vēlāk!). Link to comment Share on other sites More sharing options...
v3rb0 Posted July 18, 2007 Report Share Posted July 18, 2007 (edited) throw new MyDatabaseException('cauri i, šitais kverijs neizpildās'); un, ja gribi, MyDatabaseException() konstruktorā ar sataisi savu smuko datubāzes kļūdu parādīšanu/logošanu. Edited July 18, 2007 by v3rb0 Link to comment Share on other sites More sharing options...
Delfins Posted July 18, 2007 Report Share Posted July 18, 2007 Savukart, saja gadijuma naktos VISUR parbaudit, ko tas kverijs atgriezis un ja atgriez false, tad VISUR paredzet attiecigu darbibu. Imho tas jādara jau vienmēr bez iebildumiem. Ir slikts stils rakstīt līku kodu, kurā nav pārbaudes uz resursiem. Link to comment Share on other sites More sharing options...
black Posted July 18, 2007 Report Share Posted July 18, 2007 Visu cieņu, taču atļaušos nepiekrist Delfinam. Exception handling jau tieši tāpēc tika radīts, lai kļūdas nevajadzētu pārbaudīt VISUR. Ar exceptioniem kļūdas var pārbaudīt tajās, vietās, kur nepieciešams, lieki nepiedrazojot kodu ar nevajadzīgiem "if($kluda) ... else". Link to comment Share on other sites More sharing options...
bubu Posted July 18, 2007 Report Share Posted July 18, 2007 A kā tu zināsi, kad mest exceptionu? - pārbaudot visās vietās ko kverijs atgriež ar if! Tieši to ko Delfins saka. Link to comment Share on other sites More sharing options...
black Posted July 18, 2007 Report Share Posted July 18, 2007 Nu viņam ir viena funkcija, kas izsauc SQL ("$DB->Query($sql)"). Tur arī jāpārbauda/jāmet exception, kas sanāk tikai VIENĀ vietā. Es sapratu, ka viņa uztraukums un Delfina atbilde ir par to, ka kaut ko vajag pārbaudīt VISĀS vietās. Link to comment Share on other sites More sharing options...
v3rb0 Posted July 18, 2007 Report Share Posted July 18, 2007 1x ierakstīts. if(mysql_query() == false) throw .. cik sapratu, tad black teica ka variants $res = $db -> query(); if($res == 'kluda') { // ai,ai nedaram neko, kuda } else { //daram kaut ko taalaak $res2 = $db -> query(); if($res2 == 'kluda') { // vai, vai, nu pavisam nav labi, te ar kluda } else { // viss oki doki } } ir nesmuki, un mans ar ar tāpat domāt. Link to comment Share on other sites More sharing options...
Delfins Posted July 18, 2007 Report Share Posted July 18, 2007 Bet vai tas ir pareizi !? Ka pie exception izlido viss ārā.. tas ir tas pats DIE. KĀ tu zini kurā brīdī throw-ot !? Jūsu f-ju tad ir jāpartaisa par: public bool DB::query($throw = false) bet vienalga, ir vai nu katru reizi jāraksta try/catch vai IF bloks. Tā kā SQL attiecās pie non-fatal (vairākos gadījumos), tad try/catch ir pārslogojums. Link to comment Share on other sites More sharing options...
black Posted July 18, 2007 Report Share Posted July 18, 2007 Exception aaraa laist nekad nevajag. Vajag vismaz vienu try/catch bloku ap kodu, kursh var taisīt exceptionus, un catch blokā smuki izdrukājam normālu error message (pārslēdzam templeites uz error templeiteem, utt., utjpr.), kas ir krietni labaak par die("error"); Link to comment Share on other sites More sharing options...
v3rb0 Posted July 18, 2007 Report Share Posted July 18, 2007 Tā kā SQL attiecās pie non-fatal (vairākos gadījumos), tad try/catch ir pārslogojums. bet vajadzētu būt fatal (un vēl javascriptu, kas ar strāvu pa pirkstiem sit) Link to comment Share on other sites More sharing options...
Joyride Posted July 18, 2007 Author Report Share Posted July 18, 2007 Imho tas jādara jau vienmēr bez iebildumiem. Ir slikts stils rakstīt līku kodu, kurā nav pārbaudes uz resursiem. Bet tapec jau ir die(), skripts mirst un vairs nekas nav japarbauda. Tik drakoniski tapec, ka nav jegas talak neko darit, piemeram., neizdodas atlasit lietotaja sesiju no db. Prieks kam tur taisit 101 parbaudi un paradit - "atvainojiet, jus nevarat ielogoties, lidz ar to iepirkties, jo nobrukusi db / vaicajums sacakarets ar cross-site scripting, pagaidiet, kamer likrocigais admins savedis kartiba lapu" :) Pasakiet, kadel puleties ar parbaudem? Manuprat, vertiba true/false jaatgriez ir cita veida funkcijas - validacija, logging utml, bet ne tik svariga vieta ka SQL. Bez DB lapa neiet, tatad fatal error, manuprat. Link to comment Share on other sites More sharing options...
bubu Posted July 18, 2007 Report Share Posted July 18, 2007 Fatal, vai ne-fatal, kļūdu vajag smuki parādīt lietotājam, nevis pateikt, ka viss nokrašojis. Kā tu justos, ja savā bankas kontā operētu ar naudas pārskaitījumu un uzspiežot kautkādu submit pogu, pretī saņemtu tukšu baltu lapu ar vienu vienīgu tekstu "error"? Man jau labāk patiktos kas šāds - tas nekas, ka tā ir 404 lapa, arī sql errora gadījumā gribētu saņemt sakarīgu aprakstu, ka kautkas neiet: http://www.bbc.co.uk/asdasd http://www.microsoft.com/blah http://sourceforge.net/zazazaa Link to comment Share on other sites More sharing options...
v3rb0 Posted July 18, 2007 Report Share Posted July 18, 2007 Joyride, uzskati exceptiona izmešanu par gudrāku die(), kas nebeidzas tajā vietā kur izsauci, bet atļauj tālāk apstrādāt kļūdu - sataisīt smukās kļudu lapas priekš bubu, pielogot ka kāds spēlējies ar aplamu id padošanu utt. Link to comment Share on other sites More sharing options...
Delfins Posted July 18, 2007 Report Share Posted July 18, 2007 (edited) Tik drakoniski tapec, ka nav jegas talak neko darit, piemeram., neizdodas atlasit lietotaja sesiju no db. tieši tā.. ne viss ir tik viennozīmīgs, bet die vispār kā tāds pats galējs variants, ja neko citu nevar izdomāt. Dēļ viena sql nevajag krešot visu webu... jo iesp. tai pašā laikā 98% pārēja weba strādā korekti. Piemērs iz dzīves - vienubrīd hansabankā pārskati nestrādāja uz predefinētiem periodiem (tip tekošais,iepriekšējais mēnesis un t.t.), bet varēja norādīt pats savu periods - jā links viņiem bija atstāts, bet viņi laipni "pasūtīja mani" tālāk, un tai pašā laikā pārējais viss strādāja labi (respektīvi bija pieejami visi pārējie linki). Tādejādi, ja seko pricipam catch-ot visu, tad vai nu jātaisa globāls try/catch, vai nu katrā vietā tas bloks jāliek, kas nemaz nav izcilāks par IF-u, bet tā kā xxx_query nav fatāls iznākums, tad arī jēga pašam throw-ot nav. Turklāt apstrādāt ar IF daudz vienkāršāk, nekā izejot no try jāpieglabā šis tas temp mainīgajos, lai zināt vai "viss ķedā" ... te jau sākās tas marazms. Kopumā es to redzu visu kā DB::query($throw = false) { $res = null; try { $res = xxx_query(...) if ($throw && !$res) throw Exception; } catch (...) { // ja nu paspruukst kaut kas, modulis nav ieladets vai vel kkas ... return false; } return $res; } PS: līdzīgi kā ar include PHP ir jāatstāj izvēlēs brīvība - include, include_once, require, require_once (kur visi virtuāli reducējās uz f-ju include_file($require = false, $once = false) ) Edited July 18, 2007 by Delfins Link to comment Share on other sites More sharing options...
Recommended Posts