Forum und email
PHP a HTML

Kapitola 56. PHP a HTML

PHP a HTML mají hodně společného: PHP generuje HTML, a HTML má informace, které budou poslány PHP.

1. Jaké zakódování/dekódování potřebuji, když posílám hodnotu přes formulář? A v URL?
2. Zkouším použít tag <input type="image">, ale proměnné $foo.x a $foo.y nejsou dostupné. Kde jsou?
3. Jak vytvořím pole ("array") v HTML formuláři?
4. Jak získám všechna data z HTML elementu pro vícenásobný výběr?

1. Jaké zakódování/dekódování potřebuji, když posílám hodnotu přes formulář? A v URL?

Je více situací, pro které je zakódování důležité. Za předpokladu, že máte string $data, který obsahuje řetězec, jenž máte nezakódovaný a chcete ho poslat, je třeba se zabývat těmito relevantními problémy:

  • HTML interpretace. Pokud specifikujete náhodný (obecný) řetězec, musíte ho dát do uvozovek a celý ho zpracovat funkcí htmlspecialchars() (aby se odstranily/převedly speciální znaky jazyka HTML).

  • URL: sestává z několika částí. Pokud chcete, aby vaše data byla interpretována jako jedna položka, musíte je zakódovat pomocí urlencode().

Příklad 56-1. Skrytý element HTML formuláře

<?php
    
echo "<input type=hidden value=\"" . htmlspecialchars($data) . "\">\n";
?>

Poznámka: Je chybou použít urlencode() pro $data, protože prohlížeče samy zajišťují zpracování dat shodné s funkcí urlencode(). Všechny oblíbené prohlížeče to dělají korektně. Uvědomte si, že toto není závislé na použité metodě (např. GET nebo POST). Všimnete si toho však pouze v případě GET, protože požadavky POST jsou obvykle skryté.

Příklad 56-2. Data k editaci uživatelem

<?php
    
echo "<textarea name=mydata>\n";
    echo
htmlspecialchars($data)."\n";
    echo
"</textarea>";
?>

Poznámka: Data jsou v prohlížeči zobrazena tak, jak bylo zamýšleno, protože prohlížeč bude správně interpretovat speciální symboly.

Po odeslání, ať již pomocí GET nebo POST, data budou zakódována způsobem urlencode pro přenos a následně přímo dekódována v PHP. Takže vůbec nepotřebujete provádět žádné zakódování/dekódování ručně, vše je prováděno automaticky.

Příklad 56-3. Uvnitř URL

<?php
    
echo "<a href=\"" . htmlspecialchars("/nexpage.php?stage=23&data=" .
        
urlencode($data)) . "\">\n";
?>

Poznámka: V tomto případě již opravdu vytváříte GET požadavek, proto je nutné data kódovat ručně pomocí urlencode().

Poznámka: Musíte také použít htmlspecialchars() na celý URL, protože URL je zde hodnotou HTML atributu. V tomto případě prohlížeč nejdříve odstraní speciální znaky a pak zpracuje URL. PHP správně pochopí posílaný URL, protože jste data zakódovali pomocí urlencoded().

Můžete se všimnout, že symbol & v URL je nahrazen &amp;. Přestože to většina prohlížečů opraví. pokud na to zapomenete, není to vždy možné. Takže pokud váš URL není dynamický, musíte použít htmlspecialchars().

2. Zkouším použít tag <input type="image">, ale proměnné $foo.x a $foo.y nejsou dostupné. Kde jsou?

Když odesíláte formulář, lze namísto standardního tlačítka použít obrázek pomocí tagu jako

<input type="image" src="image.gif" name="foo">
Když uživatel klikne někde na obrázku, příslušný formulář se odešle na server s dvěma proměnnými navíc: foo.x a foo.y.

Protože $foo.x a $foo.y jsou v PHP neplatné názvy proměnných, jsou automaticky převedeny na $foo_x a $foo_y. Tzn. tečky jsou nahrazeny podtržítky.

3. Jak vytvořím pole ("array") v HTML formuláři?

Aby výsledky odeslání vašeho formuláře byly umístěny v poli (array), nazvěte elementy <input>, <select> nebo <textarea> tímto způsobem:

<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
Všimněte si hranatých závorek po názvu proměnné, to je to, co z toho dělá pole. Můžete seskupovat elementy do různých polí spojením stejného jména s různými elementy:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyOtherArray[]">
<input name="MyOtherArray[]">
Toto produkuje dvě pole, MyArray a MyOtherArray, která budou zaslána PHP skriptu. Je také možné dát do polí specifické klíče:
<input name="AnotherArray[]">
<input name="AnotherArray[]">
<input name="AnotherArray[email]">
<input name="AnotherArray[phone]">
Pole AnotherArray bude nyní obsahovat klíče 0, 1, email a phone.

Poznámka: Specifikace klíců polí je v HTML nepovinné. Pokud klíče nespecifikujete, pole bude vyplněno podle pořadí elementů ve formuláři. Náš první příklad obsahuje klíče 0, 1, 2 a 3.

Viz také Funkce pro práci s poli a Proměnné z vnějšku PHP.

4. Jak získám všechna data z HTML elementu pro vícenásobný výběr?

Tag pro vícenásobný výběr v HTML příkazu umožňuje uživatelům vybrat více položej ze seznamu. Tyto položky se posílají do handleru pro formulář. Problém je v tom, že se zpracovávají pod stejným jménem. Například:

<select name="var" multiple>
Každá vybraná možnost přijde do handleru akce jako:
var=option1
var=option2
var=option3
Každá volba tedy přepíše předchozí obsah proměnné $var Řešením je použít "pole vytvořené v elementu formuláře". Mělo by se použít toto:
<select name="var[]" multiple>
Výše uvedený kód říká PHP, že má proměnnou $var zpracovat jako pole a každé přiřazení hodnoty do var[] znamená přidání prvku do pole. První položka se tedy stane prvkem $var[0], další $var[1] atd. Funkci count() lze použít k určení, kolik možností bylo vybráno, a v případě potřeby lze seřadit pole funkcí sort().

Uvědomte si, že pokud používáte JavaScript, může přidání [] do názvu elementu způsobit problémy při pokusu odkazovat element jeho jménem. Tehdy použijte číselnou identifikaci elementu, nebo název proměnné uzavřete do apostrofů a použijte ho jako indexaci do pole elementů, například:

variable = documents.forms[0].elements['var[]'];