Kapitola 50. 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 50-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 50-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 50-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 konstruktu 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[]'];