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
No tak protože formálně (syntakticky) to v pořádku je, ale to je asi tak všechno a jinak je to nesmy…
Flash_Gordon 10.04.2008 21:40
Flash_Gordon
Pro jistotu celý script: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=…
guglo 10.04.2008 21:48
guglo
Tam je problém s pravěkem. <html> <head> <meta http-equiv="Content-Type" content="text/html; charse… nový
Flash_Gordon 10.04.2008 21:53
Flash_Gordon
:-DÁha, no mě to přišlo divný. No tak díky za pomoc a omluvte mojí neznalost. Mějte se. nový
gugli 10.04.2008 22:06
gugli
Mají tyto operátory || a && v PHP snad jiný význam než v C? Nie, operátory && a || majú rovnaký výz… nový
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 = &$_… nový
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

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ě:

if(($GLOBALS["poslano"]==1) && ($GLOBALS["jmeno"]!="")) //pokud byl formular odeslan  
       echo "Vase zadane jmeno je ".$GLOBALS["jmeno"];//tak ho zobrazime  
 else  
       echo "Nevyplnil jste jmeno";//pokud jmeno nebylo vyplneno, upozornime na tuto skutecnost  

Pro jistotu celý script:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>První den - PHP</title>
</head>

<body>

<?

echo "<form action=\"index.php\" method=\"get\"><input type=\"text\" name=\"jmeno\"><input 

type=\"submit\" name=\"odeslat\" value=\"Odeslat jméno\"></form>";

if(($GLOBALS["odeslat"]==1) && ($GLOBALS["jmeno"]!="")) //pokud byl formular odeslan  
       echo "Vase zadane jmeno je ".$GLOBALS["jmeno"];//tak ho zobrazime  
 else  
       echo "Nevyplnil jste jmeno";//pokud jmeno nebylo vyplneno, upozornime na tuto skutecnost  



?>

</body>
</html>

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.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>První den - PHP</title>
</head>

<body>
<?

echo "<form action=\"todo.php\" method=\"get\"><input type=\"text\" name=\"jmeno\"><input 

type=\"submit\" name=\"odeslat\" value=\"Odeslat jméno\"></form>";

if ( isset( $_GET ) )
   $postArray = &$_GET ;			// 4.1.0 or later, use $_POST
else
$postArray = &$HTTP_GET_VARS;

if(($postArray["jmeno"]!="")) //pokud byl formular odeslan  
       echo "Vase zadane jmeno je ".$postArray["jmeno"];//tak ho zobrazime  
 else  
       echo "Nevyplnil jste jmeno";//pokud jmeno nebylo vyplneno, upozornime na tuto skutecnost  


?>
</body>
</html>

$GLOBALS se používalo tuším v PHP3 nebo něčem podobně starém.

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