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
51-1
.
Skrytý
element
HTML
formuláře
|
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
51-2
.
Data
k
editaci
uživatelem
|
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
51-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(
)
.
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
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
.
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
:
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:
Toto produkuje dvě pole, MyArray a MyOtherArray, která
budou zaslána PHP skriptu. Je také možné dát do polí
specifické klíče:
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
.
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
:
Každá vybraná možnost přijde do handleru akce jako:
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:
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
: