Autor | Zpráva | ||
---|---|---|---|
VelkyBubak Profil * |
#1 · Zasláno: 11. 9. 2013, 14:02:12
Hledám PHP funkci, jež by byla podobná or die, ale ale aby script neskončil
|
||
juriad Profil |
#2 · Zasláno: 11. 9. 2013, 14:07:56
A jak by se ta funkce měla chovat?
function notDie($message) { echo $message; } function doSomething() { # simulujeme chybu; return false; } doSomething() or notDie("Ouha, chyba nastala!"); |
||
Joker Profil |
#3 · Zasláno: 11. 9. 2013, 14:10:05
VelkyBubak:
Moc nechápu dotaz. die vypíše text a ukončí skript (je to alias pro exit ).
Čili to samé, ale bez ukončení skriptu, znamená jen vypsat text. To dělá echo .
|
||
VelkyBubak Profil * |
#4 · Zasláno: 11. 9. 2013, 19:51:25
Joker:
$tabulka = substr($_FILES["souborName"]["name"], 0, -4); mysql_query("CREATE TABLE `$tabulka`(ID_anime int,status varchar(10))") or die ("Tabulka nevytvořena (" . mysql_error() . ")<P> </P><A Href=\"./NactiCsv.php\"> Zpět </A><BR>");//když třeba tabulka existuje takhle to fungovalo celkem dobře, jenže já bych chtěl aby script pokračoval i po části or die - a tedy bych to rád něčím nahradil. Něco jako or echo bohužel nefunguje, a else bez if také ne ;) PS: pokud je die alias pro exit, pak exit také vypisuje zprávu, že? |
||
han5vk Profil |
#5 · Zasláno: 11. 9. 2013, 20:04:56
Môžeš to spraviť nejako takto:
if(!mysql_query("CREATE TABLE `$tabulka`(ID_anime int,status varchar(10))")) { echo "Tabulka nevytvořena (" . mysql_error() . ")<P> </P><A Href=\"./NactiCsv.php\"> Zpět </A><BR>"); //když třeba tabulka existuje } „pokud je die alias pro exit, pak exit také vypisuje zprávu, že?“ Nie, exit len ukončí skript bez vypísania správy. |
||
VelkýBubák Profil |
juriad:
Děkuji. Tak snadné a přeci mě to jaksi nenapadlo. Skvěle funguje. han5vk: Přestože jsem již použil jinou možnost od juriad(a), děkuji i za tvůj příspěvek. Velká výhoda notDie tkví v tom, že jediné co je třeba přepsat je die na notDie a funguje to (samozřejmě + deklarace funkce). exit versus die: myslel jsem si to - mimo jiné to znamená, že die není alias pro exit... |
||
Jan Tvrdík Profil |
#7 · Zasláno: 11. 9. 2013, 20:09:01
VelkyBubak:
„pokud je die alias pro exit, pak exit také vypisuje zprávu, že?“ Ano, han5vk se mýlí. |
||
Joker Profil |
#8 · Zasláno: 11. 9. 2013, 20:47:22
han5vk:
> „pokud je die alias pro exit, pak exit také vypisuje zprávu, že?“ > Nie, exit len ukončí skript bez vypísania správy. Tohle není pravda. Obojí dělá to samé, exit("zpráva"); taky vypíše zprávu.
VelkýBubák: Jak vidím, jde vlastně o vysvětlení, co znamená konstrukce volání or die();
Možná by bylo fajn to dát i do FAQ, protože se to docela často používá a není to úplně zřejmé (na druhou stranu se na to zatím snad nikdo neptal, takže to není moc „frequently asked question“). Nejde o žádnou speciální PHP konstrukci, je to prostě logický operátor or (ten stejný, který se dá zapsat i jako || ), následovaný voláním die() .
Fungování té konstrukce spočívá na dvou věcech: 1. PHP (stejně jako další podobné jazyky) má zrychlené vyhodnocování logických operátorů. U logických operátorů AND ( && ) a OR (|| ) může nastat situace, kdy výsledek celého operátoru jasný už po vyhodnocení prvního argumentu.
Protože true OR cokoliv je true a false AND cokoliv je false. Proto PHP v takové situaci druhý argument vůbec nevyhodnotí.
Tedy výsledkem výrazu true or foo(); je true, přičemž se vůbec nezavolá funkce foo().
2. Funkce mysql_query vrací při chybě false a při úspěchu resource, který se při konverzi na logickou hodnotu konvertuje na true. Tedy pokud volání mysql_query bylo úspěšné, je po konverzi na logickou hodnotu true a výraz: mysql_query("…") or die(); se vyhodnotí jako true, aniž by se vůbec zavolalo to die().
Pokud volání mysql_query bylo neúspěšné, je výsledkem hodnota false a pro zjištění výsledku celého výrazu je nutné vyhodnotit druhý argument. Takže se zavolá die() a skript skončí. De facto tedy kód: mysql_query("…") or die(); if(!mysql_query("…")) die(); Jediný rozdíl je, že to první vrací hodnotu, takže čistě teoreticky by šlo udělat například $promenna = mysql_query("…") or die(); , což v tomhle konkrétním případě je nesmysl, protože jediná možná hodnota $promenna je true.
Snad jsem to vysvětlil srozumitelně. |
||
Alphard Profil |
#9 · Zasláno: 11. 9. 2013, 21:14:34
Joker:
„Možná by bylo fajn to dát i do FAQ, protože se to docela často používá a není to úplně zřejmé“ Spíš jako příklad, jak to nedělat. Vůbec se mi tato konstrukce nelíbí. Vidím ji používanou prakticky jen v kombinaci s databázovými dotazy. Kde buď vypisuje jen nějaké neužitečné „nepodařilo se připojit k databázi“, nebo naopak vykecá celému světu kompletní chybovou hlášku i na production serveru. Okamžité ukončení scriptu je vždy špatné. I když selže připojení k databázi, stále jde zalogovat chybu, zobrazit obvyklý layout stránky (tedy ne černý text na bílém pozadí, nebo v půlce useknutá html šablona) a vypsat uživateli srozumitelnou hlášku. Navíc or die , pokud je na konci dlouhého řádku, značně zhoršuje přehlednost kódu. A když není, je hloupé na konec každého dotazu psát (nebo kopírovat) tyto konstrukce. Nemluvě o tom, že by žádná modelová třída neměla tiše ukončovat běh programu. Prostě trvám na tom, že to do kódu nepatří, máme výjimky.
|
||
VelkýBubák Profil |
#10 · Zasláno: 11. 9. 2013, 21:41:02
Joker:
Aha ... dobře tak tedy možná jde o alias. Děkuji za skvělé a hezké vysvětlení logiky výrazů, i když tak trochu nechápu, na co to byla reakce - bohužel mi nepřinesla žádný užitek (protože to už dávno vím), ale třeba to někomu pomůže. Hlavní co mi nějak nedošlo a díky juriadovi už vím je, že die je funkce a jako taková se dá nahradit jinou funkcí. Přičemž echo zřejmě není funkce, a proto něco jako mysql_query("CREATE TABLE `$tabulka`(ID_anime int,status varchar(10))") or echo Alphard Ano, to je jeden z důvodů proč jsem nechtěl die... |
||
Davex Profil |
VelkýBubák:
Místo konstruktu echo můžeš použít funkci print() , ale myslím, že echo() se dá volat taky jako funkce.
|
||
aDAm Profil |
#12 · Zasláno: 11. 9. 2013, 22:33:01
VelkýBubák:
no vidíš a přece ses toho moc nenaučil tak studuj dále, echo je taky funkce: http://www.php.net/manual/en/function.echo.php |
||
Joker Profil |
#13 · Zasláno: 11. 9. 2013, 22:38:02
Alphard:
Souhlasím s tím, že to není zrovna ukázka čistého kódu. VelkýBubák: „bohužel mi nepřinesla žádný užitek (protože to už dávno vím)“ Aha. No, já očekával zmatení spíš v tom, jak to or + die() vlastně funguje a že není jeden příkaz, ale operátor a volání (z čehož ale vyplývá i to, že to die() lze nahradit něčím jiným). > vím je, že die je funkce a jako taková se dá nahradit jinou funkcí. > Přičemž echo zřejmě není funkce A největší fór je, že ani die() není funkce. Jak die (resp. exit ), tak echo jsou jazykové konstrukty. I proto jsem si taky původně myslel, že or echo() by mělo fungovat.
Jenže zatímco jazykový konstrukt die/exit se ve většině kontextů chová jako funkce, jazykový konstrukt echo se jako funkce chová v méně kontextech. No, PHP je někdy opravdu na mašli. |
||
Tori Profil |
#14 · Zasláno: 11. 9. 2013, 22:42:14
Já si to zjednodušuji tím, že
die vnímám jako funkci (a používám pouze zápis die('text') ), kdežto exit a echo beru jako samostatné příkazy s nepovinným argumentem, podobně jako třeba break nebo continue .
|
||
Davex Profil |
#15 · Zasláno: 11. 9. 2013, 22:49:53
Ano, je to tak, jak píše Joker.
Nefunguje: <?php false or echo("echo"); /* Parse error: syntax error, unexpected 'echo' (T_ECHO) in skript.php on line 3 */ Funguje: <?php false or print("print"); |
||
peta Profil |
#16 · Zasláno: 12. 9. 2013, 12:04:19
Mozna takhle
false or echo "echo"; false or {echo "echo";} |
||
juriad Profil |
#17 · Zasláno: 12. 9. 2013, 12:14:19
peta:
Nebo také ne, že? PHP Parse error: syntax error, unexpected 'echo' (T_ECHO) in p.php on line 1 PHP Parse error: syntax error, unexpected '{' in p.php on line 1 |
||
Alphard Profil |
#18 · Zasláno: 12. 9. 2013, 12:15:52
peta:
První možnost už vyloučil i [#15] Davex Tyto konstrukce jde tak snadno vyzkoušet, že snad není potřeba rozvíjet hypotetické úvahy, nemyslíte? :-) |
||
Karlik58 Profil * |
#19 · Zasláno: 12. 9. 2013, 12:22:38
jenom tak zběžně jsem to proběhl, tak doufám že jsem pochopil problém...co použít výjimky?
<?php function funkce(){ // nějaký kod throw new Exception(); } try{ funkce(); }catch(Exception $e){} //Tady skript pokračuje ?> |
||
Jan Tvrdík Profil |
#20 · Zasláno: 12. 9. 2013, 12:34:37
|
||
Amunak Profil |
#21 · Zasláno: 12. 9. 2013, 13:04:54
Kdybychom trvali na zkráceném zápisu, který naznačil peta, šlo by použít něco takového (od PHP 5.3):
false or call_user_func(function(){echo 'die';}); jenže je z sice hloupého, ale krátkého zápisu najednou příšerné monstrum, a if(!false) echo 'die'; je prostě kratší, přehlednější a pochopitelnější.
Joker: „Možná by bylo fajn to dát i do FAQ, protože se to docela často používá a není to úplně zřejmé (na druhou stranu se na to zatím snad nikdo neptal, takže to není moc ‚frequently asked question‘).“ Souhlasím s tím, že by to mělo být ve FAQ. Sice se na to málokdo ptá, ale mnoho nováčků to bezhlavě používá, aniž by pořádně tušili, o co jde. Vysvětlit, proč je špatné to používat, a posílat lidi do FAQ na toto vysvětlení, když se to u někoho v kódu objeví. Když jsem začínal, taky jsem to bezhlavě používal (včetně mysql_error()), a doteď mě mrzí, že mi to nikdo včas neomlátil o hlavu :) |
||
Časová prodleva: 12 let
|
0