
zadávání jména do formuláře a vypisování
Dobrý den. Uvažujme následující kód:
<?
echo "<form action=\"index.php\" method=\"get\"><input type=\"text\" name=\"jmeno\"><input
type=\"submit\" name=\"odeslat\" value=\"Odeslat jméno\"></form>";
if($jmeno=="" || $odeslat==1)
{echo "Zadej svoje jméno.";}
else{echo "Vaše jméno je ".$jmeno.".";}
?>
Dělá mi to to, že když do formuláře nic nezadám a kliknu na "Odeslat jméno" vypíše se: "Zadejte svoje jméno". Když zadám do formuláře jméno, tak se vypíše "Vaše jméno je $jmeno". Tedy je všechno v pořádku.
Přijde mi to trochu divné, protože if($jmeno=="" || $odeslat==1) - logičtější by mi tam přišlo && (a zároveň), ale když tam dám && a nezadám do formuláře nic, tak se vypíše: "Vaše jméno je ."(samozřejmě jen ta tečka, protože jsem nic nezadal), když do něj naopak něco zadám, tak se vypíše už všechno správně: "Vaše jméno je $jmeno."
Mají tyto operátory || a && v PHP snad jiný význam než v C? Proč to teda jde "jakoby obráceně"?
Mimochodem narazil jsem na kód na programujte.com, který by odpovídal mé úvaze, ale také jim nefunguje:
if($GLOBALS["poslano"]==1)://pokud byl formular odeslan
if($GLOBALS["jmeno"]!=""):// [i][b]a pokud[/b][/i] bylo vyplneno jmeno
echo "Vase zadane jmeno je ".$GLOBALS["jmeno"];//tak ho zobrazime
else:
echo "Nevyplnil jste jmeno";//pokud jmeno nebylo vyplneno, upozornime na tuto skutecnost
endif;
endif;
Je vlastně trochu jiný zápis toho mého(teda alespoň myslím - dokonce jsem si to už i zkopíroval a dělalo to co mě, tedy to co nechci). Pořád to vypisuje: "Vaše jméno je $jmeno" (když nic nezadám, tak samozřejmě nic, ale nikdy vlastně nedojde na kód pod else).
Děkuji za pomoc.
V tom druhém kódu jsem chtěl zvýraznit to "a pokud":
if($GLOBALS["poslano"]==1)://pokud byl formular odeslan
if($GLOBALS["jmeno"]!=""):// a pokud bylo vyplneno jmeno
echo "Vase zadane jmeno je ".$GLOBALS["jmeno"];//tak ho zobrazime
else:
echo "Nevyplnil jste jmeno";//pokud jmeno nebylo vyplneno, upozornime na tuto skutecnost
endif;
endif;
No tak protože formálně (syntakticky) to v pořádku je, ale to je asi tak všechno a jinak je to nesmysl.
Aby to mělo alespoň trochu logiku, tak bych to (spodní) přepsal následně:
Pro jistotu celý script:
Zkusil jsem a prostě to nefunguje tak, jak bych předpokládal. Pokud změním logické && za || vše je podle očekávání, takhle napsané to pořád vypisuje: "Nevyplnil jste jméno.", i když ho vyplním.
Tam je problém s pravěkem.
$GLOBALS se používalo tuším v PHP3 nebo něčem podobně starém.
Nie, operátory && a || majú rovnaký význam ako v C.
Výraz $odeslat == 1 sa v oboch prípadoch vyhodnotí ako false, takže ak tam použiješ operátor &&, celý výraz sa vyhodnotí ako false.
Či bolo vo formulári vyplnené meno, zistíš takto:
Ak sa nejaký výraz vyhodnocuje inak ako očakávaš, tak si vypíš premenné, ktoré v tom výraze vystupujú.
Vypni si register_globals a používaj $_GET, $_POST, $_COOKIE pri pristupovaní k vstupu od používateľa - vyhneš sa tak nemilým prekvapeniam, ktoré by mohli nastať.
Může být nějaký problém za nějakého stavu v této konstrukci ?
Tá konštrukcia je v poriadku v prípade, že používaš starú verziu PHP, ale nastavoval by som skôr $_GET namiesto premennej s iným názvom. Okrem toho je lepšie nainštalovať novšiu verziu PHP (prípadne zmeniť hosting), ako pridávať do kódu takéto časti zabezpečujúce spätnú kompatibilitu.
Keď už v kóde niečo takéto má byť, tak by to malo potom vyzerať skôr nejak tak, ako je to v komentároch na www.php.net: