Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Mají tyto operátory || a && v PHP snad jiný význam než v C? Nie, operátory && a || majú rovnaký výz…
los 10.04.2008 22:27
los
Může být nějaký problém za nějakého stavu v této konstrukci ? if ( isset( $_GET ) ) $getArray = &$_…
Flash_Gordon 10.04.2008 22:51
Flash_Gordon
Tá konštrukcia je v poriadku v prípade, že používaš starú verziu PHP, ale nastavoval by som skôr $_G… poslední
los 11.04.2008 09:55
los

Mají tyto operátory || a && v PHP snad jiný význam než v C?

Nie, operátory && a || majú rovnaký význam ako v C.

Proč to teda jde "jakoby obráceně"?

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:

if (isset($_GET["jmeno"]) && $_GET["jmeno"] != "")

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ť.

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:

if (!isset($_SERVER)) {
    $_GET     = &$HTTP_GET_VARS;
    $_POST    = &$HTTP_POST_VARS;
    $_ENV     = &$HTTP_ENV_VARS;
    $_SERVER  = &$HTTP_SERVER_VARS;
    $_COOKIE  = &$HTTP_COOKIE_VARS;
    $_REQUEST = array_merge($_GET, $_POST, $_COOKIE);
}

Zpět do poradny Odpovědět na původní otázku Nahoru