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.

Předmět Autor Datum
V tom druhém kódu jsem chtěl zvýraznit to "a pokud": if($GLOBALS["poslano"]==1)://pokud byl formula…
guglo 10.04.2008 19:27
guglo
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…
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.
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…
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

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

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