Stránka: 1 z 1
| [ Príspevkov: 12 ] | |
Autor | Správa |
---|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 | 35 Bydlisko: BA - WESTSIDE |
No, po dlhšom čase aj ja zakladám tému.
Mám projekt, ktorý spracúva číselné údaje, vyhodnocuje ich, radí do tabuliek atď. Všetky číselné údaje sú v databázi. Je tam aj jeden špeciálny prípad, tzv. vzorec. Slúži na vykonávanie matematických výpočtov medzi jednotlivými údajmi.
V týchto vzorcoch potrebujem ošetriť jednu vec - delenie nulou. V zásade sa všetky chyby syntaxe (neuzavreté zátvorky, zlá desatiná čiarka, resp. bodka, ...) vyriešiť dajú jednotným chybovým hlásením, avšak delenie nulou medzi ne nechcem dať (a ani to nefunguje, zobrazí sa aj chybové hlásenie PHP stroja, aj chybové hlásenie mojej aplikácie).
Jedno riešenie mám, operátor na potláčanie chýb @, ale nie je to ideálne, pretože sa potom vypíše všeobecné chybové hlásenie mojej aplikácie a ja by som to veľmi rád nejak odlíšil.
Vzorce sa vyhodnocujú funkciou eval(), to je vlastne ekvivalentné normálnemu spusteniu ako v bežnom PHP kóde.
Ak by ste k tomu niečo vedeli, bol by som rád za vaše postrehy, nápady či riešenia.
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 16.05.07 Prihlásený: 01.08.17 Príspevky: 837 Témy: 6 | 6 |
skusil si to cez podmienky?
_________________ getch();?{readkey;?} na konci? !A naco! Riesenie je (Alt+F5)
99% pochopí a shaggy je druhá kategória |
|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 | 35 Bydlisko: BA - WESTSIDE |
Ako to myslíš?
Predstav si dlhý výraz, niečo ako "((123 + 85) * (31 - 2))/6 - 4". To je v pohode, lebo je to len o číslach. Ale potom si predstav, že máš aj možnosť vložiť do výrazu referenciu na iný znak alebo výraz (vyslovene ako matematickú premennú). Tá má formát [číslo] (napr. [1], [2], [3], ...) a keďže to môže byť nie len číslo, ale aj iný vzorec, niekedy môže byť výsledkom nula a niekedy nemusí.
Mojím zámerom je nejak odlíšiť možné vzniknuté chyby, aby užívateľ vedel, čo je zle.
Kde by podľa teba mali byť aplikované tie podmienky?
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 02.07.06 Prihlásený: 30.01.20 Príspevky: 1635 Témy: 137 | 137 Bydlisko: Slovakia - ... |
hmm neviem si predstavit tu tvoju apliakaciu (kodovo) ale mas dajme tomu ten vysledok, neda sa z neho proste vybrat prva cislica a overit ci nie je nula?
_________________ Zivot je jednoduchy , staci sa rozhodnut a neobzerat sa spat. Poriadok je pre blbcov, inteligent zvlada chaos. |
|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 | 35 Bydlisko: BA - WESTSIDE |
No lenže ona môže byť nulová, len pri delení to robí problémy, iba vtedy nemôže byť nulová.
Kód: function val2num($cislo) { $key = preg_replace("/\[|\]/", "", $cislo['0']); /* * Tu budu prikazy na ziskanie pola zaznamov, * v tomto priklade si zaznamy nadefinujeme, * pretoze ich ziskanie nesuvisi s nasim problemom */ $array = array(10, 6, "", "4 + 10", 4, 2); if ($array[$key] == "") { $output = 0; } elseif (!preg_match("/\d+/",$array[$key])) { $output = check_patt($array[$key]); } else { $output = $array[$key]; } return "(".$output.")"; }; function check_patt($input) { // BEGIN function check_patt $re="/\[([0-9][0-9]*)\]/"; $function_name="val2num"; if ($input == "") { $result = 0; } elseif (preg_match($re,$input)) { $result=preg_replace_callback($re,$function_name,$input); } else { $result = $input; } if(!eval("\$output = ".$result.";")){ $output = "Chyba pri spracovani vyrazu!"; } return $output; } // END function check_patt
echo check_patt("(([3]*[0])/2+3)/0");
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
Pri deleni nulou ti vznikne chyba "Division by zero" a podla toho zistis, ze prave tato operacia nastala. Pozri si napr funkciu set_error_handler()
|
|
Registrovaný: 16.05.07 Prihlásený: 01.08.17 Príspevky: 837 Témy: 6 | 6 |
stravil som 10 minut hladanim vyznamu slova referencia, ale aj tak nechapem co si tym myslel. ja ze to je od anglickeho refer a ono to fakt je, ale s tym spojenim tomu fakt nerozumiem.
neviem co presne chces, ale sak s tym vypnutim kontroly chyb to nieje dobre?
Kód: @$a=5/0; if(!$a) echo "delenie nulou";
_________________ getch();?{readkey;?} na konci? !A naco! Riesenie je (Alt+F5)
99% pochopí a shaggy je druhá kategória |
|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 | 35 Bydlisko: BA - WESTSIDE |
Referencia - > postupnosť znakov [ číslo] sa regulárnym výrazom nahradí za premennú $array[$key] kde $array je nejaké pole hodnôt a $key je číslo. Potom pri volaní funkcie eval("výraz"); sa z $array[$key] stane hodnota s ktorou chcem počítať. Čiže ak je v databázi uložené pod číslom 5 číslo 200 000, tak ak napíšem "[5] / 1000" výsledkom by malo byť to isté ako "200 000 / 1000" čiže 200. Je to takto robené kvôli tomu, že ak by vo výraze boli znamienka ako plus, mínus, deleno a krát, PHP by to bralo ako obyčajný string a nie ako matematické operátory.
Citácia: Kód: @$a=5/0; if(!$a) echo "delenie nulou";
ok, ale aj toto je chyba a pritom to nie je delenie nulou: Kód: @$a=(5/1; if(!$a) echo "delenie nulou?";
stenley píše: Pri deleni nulou ti vznikne chyba "Division by zero" a podla toho zistis, ze prave tato operacia nastala. Pozri si napr funkciu set_error_handler()
Pozerám pozerám, ale popri tom ešte parketové lišty montujem tak nemám takú koncentráciu... Každopádne neviem prísť na to, ako tie chybové hlásenia dostať do premennej, lebo to čo oni ponúkajú cez error_log() je buď hneď výstup, emailová správa, PHP debugging connection, alebo logový súbor. Ani jedno mi nevyhovuje.
Ideála funkcia je error_get_last();, ale tá bohužiaľ nie je na mojom hostingu k dispozícii...
EDIT:
Heuréééka, už som na to prišiel, fakt cez set_error_handler(). Že som si to skôr nevšimol...
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 16.05.07 Prihlásený: 01.08.17 Príspevky: 837 Témy: 6 | 6 |
ok, ale aj toto je chyba a pritom to nie je delenie nulou:
Kód: @$a=(5/1; if(!$a) echo "delenie nulou?";
ale sak (5/1 by mal byt string ..
(5/1 -- taketo nieco dokaze vyrobit ten eval()?
_________________ getch();?{readkey;?} na konci? !A naco! Riesenie je (Alt+F5)
99% pochopí a shaggy je druhá kategória |
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 | 51 Bydlisko: Bratislava |
p360t píše: Heuréééka, už som na to prišiel, fakt cez set_error_handler(). Že som si to skôr nevšimol...
nemas zac
asi zacnem tuto funkciu tiez pouzivat, vyzera celkom slusne...
|
|
Registrovaný: 30.05.06 Prihlásený: 08.10.14 Príspevky: 1756 Témy: 35 | 35 Bydlisko: BA - WESTSIDE |
No eval spúšťa PHP kód uložený v reťazci. Pretože tie vzorce sú v databázi uložené ako reťazce a ako som už písal, znaky +-/* by nebralo ako matematické operátory, ale ako obyčajné znaky. Keď to vhodne doplním a preženiem cez eval, ten výraz sa vypočíta a uloží do premennej. Predtým však musí obsahovať len čísla, operátory a zátvorky.
Keby si spustil takéto niečo:
Kód: $result = (5/1; eval("\$output = ".$result.";");
napíše ti Parse error.
_________________
A. S. Tanenbaum píše: The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice. |
|
Registrovaný: 01.01.06 Prihlásený: 25.12.21 Príspevky: 366 Témy: 47 | 47 Bydlisko: TT |
Este Napadla ma taka klukata cesta....
Najprv si cely vyraz das ako retazec a vyhladas lomitka. Ak sa za lomitkom nachadza 0 (a po nej nejake znamienko), je to zle. (to je to iste co eval?)
Ale ovela elegantnejsie riesenie je to set_error_handler()
_________________ He who laughs last has not yet heard the bad news.
-- Bertolt Brecht
medicine student |
|
Stránka: 1 z 1
| [ Príspevkov: 12 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Databázy | 1 | 715 | 14.07.2009 0:02 drozdo | | v PHP, ASP | 2 | 440 | 04.11.2014 13:53 PepperSK | | v PHP, ASP | 13 | 1092 | 05.10.2008 20:09 Roko | | v Ostatné | 9 | 1266 | 18.02.2009 14:07 bloger7 | | v ATI/AMD grafické karty | 14 | 1048 | 31.10.2013 18:11 MAREJ | | v Externé zariadenia | 0 | 344 | 14.01.2012 19:25 blabla630 | | v ATI/AMD grafické karty | 6 | 1271 | 27.01.2010 3:28 foxXx | | v Operačné systémy Microsoft | 6 | 563 | 27.06.2008 19:40 Flety | | v PHP, ASP | 6 | 968 | 15.07.2008 16:18 vladooo | | v Ostatné programy | 10 | 1100 | 27.12.2011 15:15 Ominous | | v Assembler, C, C++, Pascal, Java | 6 | 905 | 24.01.2011 23:43 vital | | v Pevné disky a radiče | 12 | 764 | 05.06.2013 21:52 sp33d | | v Pevné disky a radiče | 7 | 542 | 21.09.2015 4:45 branci6138 | | [ Choď na stránku: 1, 2 ] v Pevné disky a radiče | 43 | 2847 | 21.05.2008 16:24 tommy1104 | | v Ostatné | 4 | 530 | 06.01.2011 14:51 blazej44800 | | v Spoločnosť, politika, psychológia, filozofia, náboženstvo | 17 | 2059 | 10.11.2009 16:10 Tech |
|