Autor Zpráva
gardener
Profil
Zdravím,
Chtěl bych se zeptat, jak co nejlépe "volat" PHP kod ve stejném skriptu, jako je formulář.
Donedávna jsem používal něco na způsob:
$BudemeZobrazovat=true;
if (!empty($_POST)) // Odeslano
{
//nejaky vykonny kod
}
//START FORM
if ($BudemeZobrazovat):?>
<form action="<?php echo $_SERVER["PHP_SELF"]?>" method="post" enctype="multipart/form-data">
 //Vlastni form
 </form>
<?php endif;?>


To mi ale již příjde velice nepraktické a složité,
Zajímalo by mě jaké jsou jiné možnosti s voláním PHP ve stejném souboru jako je FORM:

Osobně by se mi líbilo něco takového..
<?php
if (isset($_POST['submit']))  // if page is not submitted to itself echo the form

echo('Uz se odesilalo');
else
echo('Nic se nodeslalo');
}


?>

<form action="<?php echo $_SERVER["PHP_SELF"]?>" method="post" enctype="multipart/form-data" name="form_knp">

</form>



Nebo:

<?php
if($_POST['action'] =='validate'{
echo("Nejaky text");
}


?>

<form action="rps.php?action=validate" method="post" enctype="multipart/form-data" name="form_knp">
<input name="Hoď" type="submit" value="hozeno" name="submit" />
</form>


Bohužel ani jeden způsob nefunguje korektně.

Díky za každou radu..
JanJanuska
Profil
Ahoj gardener, ani jeden zdrojový kód nemôže fungovať, pretože každý je nekorektný a navyše je aj chybná syntax.

Prvý kód nefunguje, pretože sa nemá čo odoslať. V druhom kóde si pletieš metódy get a post.
Asi by si mal začať s php od úplného začiatku a všetko poriadne naštudovať.
Ešte pripomeniem, že hodnota atribútu enctype je zbytočná. Síce to bude fungovať, ale meniť hodnotu enctype sa oplatí len pri type="file".

Tento kód by ti mal fungovať:
<?php 
if(isset($_POST['odoslane'])){	 // ak je odoslaný name="odoslane"
	echo 'formulár bol odoslaný';	
}
 
else { // inak (ak nie je odoslaný name="odoslane") zobraz formulár
?>

	<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    	     <input type="submit" name="odoslane" value="Odoslat" />                            
   	</form> 

<?php 
}
?>
gardener
Profil
Ale zrovna tenhle princip mi příjde takový zbytečně matoucí:
Kdysi jsem viděl princip, který se mi zdál daleko lepší, tam se používalo v
action="#"
A jinak pokud byla nastavena
 ($_POST['odoslane'])
,
Tak by se pouze vykonal kod v zavislosti na vyplnenych nebo nevyplnenych polich.
Mastodont
Profil
if (!empty($_POST)) 

lze zkrátit na
if ($_POST)
tiso
Profil
gardener - pokiaľ form spracovávaš na tej istej stránke ako vypisuješ, tak atribút action môže zostať prázdny, nemusíš tam dávať PHP_SELF
AM_
Profil
Mastodont
To sice zkrátit lze, ale varianta s empty je o něco přehlednější - člověku na první pohled dojde, co se podmínkou myslí.

gardener
Kdysi jsem viděl princip, který se mi zdál daleko lepší, tam se používalo v
action="#"

Prázdná action nebo action="#" sice funguje, ale odborníci to neuznávají - vypisovat tam PHP_SELF se označuje za nejčistčí (popř. pokud víš, jak se soubor bude jmenovat, můžeš tam dát ten údaj napevno)

Všechny 3 řešení, které jsi vypsal, se chovají trochu jinak, takže když nevíme, jaké požaduješ chování, těžko vybrat nejvhodnější. Logická chyba imho není ani v jednom.
Chamurappi
Profil
Reaguji na AM_:
Prázdná action nebo action="#" sice funguje, ale odborníci to neuznávají
Kteří odborníci a proč?

vypisovat tam PHP_SELF se označuje za nejčistčí
Není čistší action neuvádět?
AM_
Profil
Chamurappi
Tak jsem zagooglil a napůl máš pravdu, napůl já;) kdysi jsem četl, že prázdná action se nedoporučuje, bohužel si nepamatuji zdroj a z toho co teď hledám tak je to zcela validní (i podle RFC 2396 prázdná URI se chápe jako odkaz na stejný dokument). Ovšem atribut action je povinný, takže action="" uvést musíš (o action="#" jsem nic nenašel, možná by se také dala chápat jako prázdná uri, ale zůstal bych tedy u prázdné).
Chamurappi
Profil
Reaguji na AM_:
Ovšem atribut action je povinný, takže action="" uvést musíš
Nebo co? Bůh zabije koťátko?
AM_
Profil
Chamurappi
To možná taky, ale nebudeš mít validní kód. Někdo na to hraje, někdo ne. A zrovna v případech, kdy tě to stojí pár znaků navíc a ne nekompatibilitu, se to vyplácí. Webové standardy doporučené W3C nejsou prohlížeči dodržovány důsledně, to vím, ale kde je to možné, je dobré je dodržet - definováno je pouze chování standardních věcí, co když příští verze některého prohlížeče bude chybějící action interpretovat jinak? (To je sice možné i u standardních praktik, ale u těch, které nejsou dle standardů/doporučení autorit, je to pravděpodobnější).
gardener
Profil
Tak ja tedy vážně už nechápu, proč toto nefunguje?
Dokonce ani s else, který nená povinný:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php

if(isset($_POST['submit'])){

echo("Nejaky text");
}


?>

<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data" name="form_knp">
<fieldset>
<label for="tip_uzivatel">Váš tip:</label>
<p>
  <label>
  <input type="radio" name="tip_uzivatel" value="kamen" id="Skupina přepínacích tlačítek1_0" />
    Kamen</label>
  <br />
  <label>
  <input type="radio" name="tip_uzivatel" value="nuzky" id="Skupina přepínacích tlačítek1_1" />
    Nůžky</label>
  <br />
  <label>
  <input type="radio" name="tip_uzivatel" value="papir" id="Skupina přepínacích tlačítek1_2" />
    Papír</label>
  <br />
</p>
</fieldset>
<fieldset>
<label for="hod_uzivatel">Výsledek po hodu:</label><br/>
Zvolil jsi:<input name="hod_uzivatel" type="text" readonly="true" /><br/>
Počítač zvolil:<input name="hod_pocitac" type="text" readonly="true" /><br/>
</fieldset>
<fieldset>
<label for="skore">Skóre</label><br/>
Současní skóre je:<input name="skore" type="text" readonly="true" /><br/>
</fieldset>
<input name="Hoď" type="submit" name="submit" />
</form>
</body>
</html>


Chce se mi řící, že toto mi i vždy fungovalo ale prostě nyní ne..
gardener
Profil
Tak nakonec asi budu uverovat zda !empty($_POST)..
AM_
Profil
proč toto nefunguje?
je to rozbité. příště zkus lepší popis problému

Jediné, co tam vidím, je enctype="multipart/form-data" - to se používá jen ve formulářích pro upload souborů, sice by to mělo fungovat i takhle, ale občas s tím jsou problémy - doporučuji vyhodit.
Chamurappi
Profil
Reaguji na AM_:
To možná taky, ale nebudeš mít validní kód.
… podle jakýchsi pravěkých DTD.

definováno je pouze chování standardních věcí
Neplatí obecně. Rozumná specifikace definuje chování ve všech myslitelných případech.

co když příští verze některého prohlížeče bude chybějící action interpretovat jinak?
Tak poruší HTML 3.2, kde „action“ povinný není. Specifikace neříkají, jak má prohlížeč rozpoznat verzi HTML.

(To je sice možné i u standardních praktik, ale u těch, které nejsou dle standardů/doporučení autorit, je to pravděpodobnější).
Na dosavadní dokončená HTML doporučení už dnes žádný výrobce prohlížeče nebere ohledy. Není to autorita, je to relikt.
V návrhu HTML 5 není „action“ povinný.


Reaguji na gardenera:
Sice nevím, v čem spočívá závada, ale…

name="submit"
Nazývat <input> takto není moudré.

readonly="true"
Jedinou platnou hodnotou atributu „readonly“ je „readonly“.

<label for="tip_uzivatel">
Atribut „for“ se váže k ID, nikoliv k name.
AM_
Profil
Chamurappi
Pro mě to pořád není dostatečný důvod alespoň prázdnou action nenapsat, pořád tím víc dodržím, než poruším. Ale pokud někdo tolik nehledí na čistotu, není to pochopitelně nutné. Až budu psát HTML5, kde toto bude takto definované, rád jej vypustím.
Rozumná specifikace definuje chování ve všech myslitelných případech.
Od prohlížečů je spíš dobročinnost, že zobrazí jakkoli tragicky napsaný HTML kód. Většina nekompatibilit stránek v prohlížečích vychází právě z nestandardních vlastností (ano, dá se argumentovat tím, že někdy je naopak problém s tím, co se označuje za validní - ale z vlastní zkušenosti při psaní validního kódu a vybočení pouze v případech, kdy vím, co dělám, nastane problémů mnohem méně). Pokrýt všechny chyby, které může uživatel v zápisu kódu udělat, standardem definujícím takto přátelské chování (tedy ne vypsání chybové hlášky a nazdar), by ze standardu udělalo chaos.

návrh HTML5 jsem zatím nestudoval, ale action tam tedy zakázaný není - jeho napsáním bych tedy nic nezkazil.

Specifikace neříkají, jak má prohlížeč rozpoznat verzi HTML.
A co DOCTYPE popř. odkaz na DTD? možná se mýlím, ale měl jsem za to, že jednoznačně určují formát dokumentu.
bohyn
Profil
AM_
A co DOCTYPE popř. odkaz na DTD? možná se mýlím, ale měl jsem za to, že jednoznačně určují formát dokumentu.
Skutecne? Prohlizece na verzi HTML a "XHTML" s content-type text/html zcela dlabou, znacku kterou poznaji interpretuji, co neznaji ignoruji, nehlede na DOCTYPE.
tiso
Profil
gardener [#11] riadok 46:
<input name="Hoď" type="submit" name="submit" /> <!--tak Hoď alebo submit?-->
AM_
Profil
bohyn
máš pravdu v tom, že to není implementováno správně a s XHTML jsou v tomhle ohledu problémy, neřekl jsem, že to funguje bezchybně, ale hlavička použitá je.
Chamurappi
Profil
Reaguji na AM_:
pokud někdo tolik nehledí na čistotu, není to pochopitelně nutné
Na čistotu hledím, právě proto nebudu zaplevelovat kód zbytečným atributem kvůli dvanáct let starému nevysvětlenému přehmatu pánů z konsorcia.

Většina nekompatibilit stránek v prohlížečích vychází právě z nestandardních vlastností
To se sice říkává, ale když se nad tím zamyslíš, všimneš si, že to vůbec není pravda. Podívej se třeba do zdejší kategorie „Problémy s prohlížeči“. Drtivá většina problémů souvisí s různou interpretací CSS, nikoliv s tragicky napsaným HTML kódem.

Pokrýt všechny chyby, které může uživatel v zápisu kódu udělat, standardem definujícím takto přátelské chování, by ze standardu udělalo chaos.
Viz HTML 5. Čtyřka se také snaží část chyb popsat, ale není tak důsledná.

A co DOCTYPE popř. odkaz na DTD?
Myslíš třeba něco jako <!DOCTYPE html SYSTEM "moje-mistni-kopie-dtd-pro-html-4.txt">? Z toho zjistíš co?
Validátor z definice typu dokumentu zjistí povolené množiny elementů, atributů (vč. jejich povinnosti) a entit, nic víc. Nevalidující cílová zařízení DTD nečtou.

neřekl jsem, že to funguje bezchybně, ale hlavička použitá je
Není. Na stránku se používá parser, který má ze všech existujících specifikací nejblíž k HTML 5.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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