Autor Zpráva
Suta
Profil
Ahoj,
trvalo mi asi dvě hodiny, než jsem přišel, co je příčinou hlášky, kterou mi hlásí validátor. Stejně ale vůbec nechápu, proč se tak děje. Nastíním chování a můj případ:

1. Mám spoustu stránek, v nichž na začátku startuju session pomocí session_start(); Všechny tyto stránky jsou v naprostém pořádku, s validním kódem.

2. Jakmile dovnitř stránek přidám formulář (tedy použiji tag <form> do něhož vložím nějaké ty inputy), hlásí validátor chybu, která je na ilustračním obrázku dole. Pokud ovšem formulář ponechám a pouze vymažu úplně první řádek v kódu, kdy startuju session, validátor se opět tváří, že je vše v pořádku.

3. Když to shrnu, tak formulář, pokud nestartuju session, je validní, ale jakmile nastartuju session, něco validátoru nesedí (přesotře po vymazání formuláře není ve startování session žádný problém).

Může mi někdo poradit ? Bije se nějak session s formuláři ve strictním módu (je pravda, že jsem to v jiném nezkoušel)? Nebo mám něco špatně já či něco špatně chápu?

Díky všem za případnou pomoc.
Suta
Profil
Omlouvám se, zde je odkaz: http://www.prvnioddil.cz/ukazka_problemu.jpg
error414-
Profil *
oddelej / z toho inputu
habendorf
Profil
Se session to nemá nic společného. Použij fieldset a máš po starostech.
Suta
Profil
Já ale v kódu žádné lomítko u inputu nemám...

Proč to bez nastartování session jede? Musí to mít se session něco společného. Ostatně validátor píše ...e="8bcb15e056694b02b8b8d9b4f2933c3c" />

??

To musím být session.

Zkrátka session i formulář jsou v pořádku, když nejdou dohromady... Pořád nerozumím.
Suta
Profil
Vykastroval jsem kód, klidně vyzkoušejte. Když vymažete první řádek v kódu, je to v pořádku. Když vymažete formulář, je to v pořádku. Takto ale ne.... Proč?


<?
session_start();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd">
<html>
<head>

<title>Ukazka problemu který je pro mě zatím nevyřešený :)</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

</head>

<body>

<form method="post" action="uvod-kontaktni-formular-zpr.php">
<p><input type="text" class="jmeno" name="jmeno" value="" size="40" maxlength="40"></p>
<p><input class="tlacitko" type="submit" name="odeslano" value="Odeslat"></p>
</form>



</body>
</html>

Suta
Profil
Takže opravdu nikdo neví? Že by chyba validátoru? To se mi nezdá...
habendorf
Profil
Prostě sem dej link na stránku.
Chamurappi
Profil
Reaguji na Sutu:
Za problém může PHP, vytváří ti tam vadný <input>. S lomítkem na konci, které by v HTML mělo ukončovat značku. Vygenerovaný kód vnímá validátor takhle:
<form method="post" action="uvod-kontaktni-formular-zpr.php"><input type="hidden" name="PHPSESSID" value=" ... ">>

<p> atd.
Strict DTD nedovoluje vložit <input> přímo do <form>u, ani tam nedovoluje znaková data (to většítko). Doporučuji nebrat ohledy na tuto definici typu dokumentu, je stará, hloupá, neperspektivní, smradlavá, trpí Alzheimerem, Parkinsonem a hlavně Raggettem a k tomu všemu ji ještě nemám rád. Můžeš nechat dokument nevalidní, nebo vyměnit DTD, nebo ukecat PHP, aby svůj <input> nevecpávalo hned za <form>, to je celkem jedno. Validita zajímá jen validátor.
Suta
Profil
Chamurappi
Narážku na ne/používání strictního DOCTYPE chápu, nechme ji teď ale mimo tuto debatu. Vždyť jinde je to řešeno stokrát.

Nicméně díky, Chamurappi, za vysvětlení s PHP.

Dobře.
Pochopil jsem, že když nastartuji session a mám ve stránce formulář, tak mi tam php hodí skrytý input a validita je v háji. Jak to tedy dělají "kvalitní" weby, vždyť také musí používat formuláře i session... tedy jak to obejít?
Plaváček
Profil
Suta

Bylo ti přece odpovězeno, pokud chceš využívat striktní verzi HTML, musí být INPUTY uvnitř formuláře umístěny buď v P či v DIV, nejlépe však ve FIELDSET. Toto se řeší na úrovní PHP, ale jak přesně ti řekne lépe programátor, kterým já bohužel nejsem.
Suta
Profil
Plaváček
Takový amatér zase nejsem, samozřejmě že mám inputy v odstavci <p>, nicméně problém je jinde, jak jsem pochopil Chamurapiho, tedy že PHP hodí skrytý input ihned za tag form, ale už bez odstavce (či jiného potřebného obalovacího tagu)...
Plaváček
Profil
Suta

Omlouvám se, nepovažuji vás za amatéra, pošlu sem svého programátora, který stejný problém řešil a vyřešil, snad vám odpoví odborněji.
koblih
Profil
Suta
Jak napsal Chamurapi, PHP do formu vklada ten imput se session id automaticky a kazdy automat ma sve uskali a neni dokonaly, tedy mrskne ten input hned za <form>. Doporucuji ti toto automaticke vkladani session id do stranky vypnout a pokud opravdu tu session id musis predavat pres form, udelej si to ve vlastni rezii, validne a jen tam kde je to potreba. Jednak ten automat to session id cpe vsude, tedy i do URL coz myslim generuje zbytecne zatizeni a bezpecnostnim riziku ani nemluvim.
Ale zamysli se jeste jestli to predavani session je nutne. Pokud uzivatel ma v prohlizecce povolene cookies, neni treba zadne session id predavat, drzi se v cookie. Melo by to smysl delat jen pro uzivatele co je maji vyple a to nevim jestli to za to stoji. Jo a to jestli je ten automat zapnuty nebo ne ridi nastaveni session.use_trans_sid.
Joker
Profil
Suta
ak jsem pochopil Chamurapiho, tedy že PHP hodí skrytý input ihned za tag form, ale už bez odstavce
To je ta první chyba ve validátoru, ta druhá je, že input je vygenerován jako XHTML (tj. jako <input />), zatímco typ dokumentu je striktní HTML. Takže tam nemá být to lomítko.

Řešením by bylo změnit nastavení PHP. Sice nevím přesně, jak by to mělo vypadat, ale bude se to týkat tohohle nastavení v php.ini:
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry,fieldset="

Taky by mělo stačit v php.ini najít:
; session.use_only_cookies = 1
a odstranit ten středník na začátku. Tím se volba použije a session ID se bude předávat jenom přes cookies. Ale pokud si někdo cookies vypne, bude mít asi smůlu.
Suta
Profil
Joker

Ano, konečně jsem se dobral svého cíle, díky moc. V tomto případě skutečně bude dobré vypnout automat. Vyzkouším, snad bude fungovat.

Ještě pro doplnění - žádné session id přes formulář nikde nepředávám ani nechci, ten automat to tam cpe automaticky, nevím proč.

A samozřejmě také díky Plaváčkovi.
Suta
Profil
Tak se ozívám znovu. Myslel jsem, že je již vše v pořádku a tak jsem na změnu v php.ini nespěchal a dostal jsem se k ní dnes. Zjistil jsem však, že nevím, jak se vlastně k php.ini (myslím na serveru) dostanu. Zcela konkrétně na webzdarma.

Hm?
tiso
Profil
Suta
celkom určite nijako - k nemu má prístup iba správca servera, meniť môžeš iba niektoré nastavenia priamo v php (pokiaľ to nie je zakázané) viac - funkcia ini_set
Suta
Profil
To jsem tušil. Takže se nakonec přece jen výše vyřešený problém vlastně nedá v praxi dotáhnout do funkční podoby? Nebo na placeném hostingu mi na přání mohou některé funkce v php.ini nastavit dle přání? Mám takový pocit že ano, ale nevím to jistě...
Toto téma je uzamčeno. Odpověď nelze zaslat.