Autor Zpráva
VelkyBubak
Profil *
Hledám PHP funkci, jež by byla podobná or die, ale ale aby script neskončil
juriad
Profil
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
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 *
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>&nbsp;</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
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>&nbsp;</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
VelkyBubak:
pokud je die alias pro exit, pak exit také vypisuje zprávu, že?
Ano, han5vk se mýlí.
Joker
Profil
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();
funguje téměř stejně jako:
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
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
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
fungovat nebude

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
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
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
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
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
Mozna takhle
false or echo "echo";
false or {echo "echo";}
juriad
Profil
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
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 *
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
Karlik58:
co použít výjimky?
Ano, to je správné řešení, viz výše [#9] Alphard.
Amunak
Profil
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: