Autor Zpráva
Petrav
Profil *
Při odeslání komentáře k článku prostřednictvím formuláře se mi "ztratí" proměnná id_clanku. Předpokládám, že bych její hodnotu měla předat znova s odesláním formuláře, ale nejsem schopná to tam vpašovat. Všechno ostatní se mi v databázi bez problémů uloží.
Poradíte mi? Díky moc.

Ten skript zatím vypadá takto (snad se moc nezděsíte).

<?php #zpracování komentáře
if (isset($_GET['clanek'])) {
$_GET['clanek'] = $clanek;

if (isset($_POST['odeslat'])) { //Zpracovat komentář

$zpráva = NULL; // vytvoření prázdné proměnné

// Ověření komentáře
if (empty($_POST['komentar'])) {
$kom = FALSE;
$zpráva .= '<p>Nenapsali jste žádný komentář!</p>';
} else {
$kom = $_POST['komentar'];
}
//ověření uživatele
if (empty($_POST['uzivatel'])) {
$uz = 'anonym';
} else {
$uz = $_POST['uzivatel'];
}


if ($kom & $uz & $clanek) { // pokud je vše ok

// Zpracování komentáře
require_once ('../pripoj_db.php'); // Připojit se k databázi
DBInfo();
pripoj_mysql();
// vložit komentář do databáze
$vlozit = "INSERT INTO t_komentare (uzivatel, komentar, vlozeno, ID_clanku) VALUES ('$uz', '$kom', NOW(), '$clanek')";
$výsledek = @mysql_query($vlozit); // Spustit dotaz

mysql_close(); // Ukončit připojení k databázi.
} else {
$zpráva .= '<p>Něco se nepovedlo.</p>.';
}
} //Konec zpracování formuláře.
else { //Zobrazit zprávu (pokud něco obsahuje
if (isset($zpráva)) {
echo '<font color="red">', $zpráva, '</font>';
}
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset><legend><h3>Váš komentář k tomuto článku</h3></legend>
<p><b>Jméno: </b><input type="text" name="uzivatel" size="10" maxlength="15" value="<?php if (isset($_POST[uzivatel])) echo $_POST[uzivatel]; ?>"></p>
<p><b>Komentář: </b><Textarea cols="35" rows="8" wrap="virtual" name="komentar"></textarea></p>
</fieldset><br>
<div align="center"><input type="submit" name="odeslat" value="odeslat"></div>
</form>
<?php
}
}
?>
thingwath
Profil *

if ($kom & $uz & $clanek) { // pokud je vše ok


Tady to je. & je operátor pro bitové AND a to má za následek něco jiného než operátor pro logické AND, který vypadá buď přímo AND nebo &&.
Petrav
Profil *
Tak to už jsem opravila a pořád nic.

Jakmile vyplním formulář a dám ho odeslat, otevře se mi prázdná stránka
- z původního komentar.php?clanek=1 mám jen komentar.php, takže to neprojde přes ten první if (omlouvám se za tu moji "terminologii")
thingwath
Profil *

$_GET['clanek'] = $clanek;

Tak třeba tady. Do proměnné $_GET['clanek'] se snažíš přiřadit hodnotu proměnné $clanek, který ale bude asi nulový. Předpokládám, že to chceš spíše naopak.
Petrav
Profil *
to taky nebude ono
jakmile ten formulář odešlu, vůbec se to na tohle místo nedostane, protože neprojde přes první podmínku
if (isset($_GET['clanek']))

ta hodnota proměnné $_GET['clanek'] se odesláním formuláře zřejmě vynuluje
juneau
Profil *
jenze ty odesilas formular metodou POST! (method="post") ...

staci do formulare pridat skryte pole <input type="hidden" name="clanek" value="<? echo @$clanek; ?>" />

a po odeslani se nacte stranka komentaru take bez viditelneho parametru, ale zato bude id clanku obsazeno v promenne $_POST["clanek"].

Ta podminka s $_GET["clanek"] nemohla nikdy platit... protoze jsi predavala hodnoty metodou POST.
Petrav
Profil *
děkuju, už to funguje, na to skrytý pole bych vůbec nepřišla
juneau
Profil *
hlavni je rozlisit, kdy chtit $_GET a kdy $_POST ...

$_GET hodnoty se predavaji v url jako index.php?promenna=hodnota... kliknutim na odkaz

$_POST hodnoty se predavaji ze vsech poli, prvku formulare, pokud ma nastavenou metodu "post". ... kliknutim na nejake to "odeslat".
Petrav
Profil *
už jsem tu zas, doma mi to funguje, ale jak to umístím na hosting, zase to nejde
Petrav
Profil *
teď na to koukám a zas to nepředalo tu proměnnou s id článku, doma mi to ale předává, kde je zakopaný pes?
Leo
Profil
Nainstalujte si neco na prohlizeni HTTP hlavicek (pro Mozillu a Firefox je klicove slovo Live HTTP headers) a kouknete se co prohlizec skutecne na server (at uz na webu nebo localhost) posila. Leo
Petrav
Profil *
do databáze se mi uloží všechno kromě id článku
Petrav
Profil *
tak to vypadá, že už je to snad fakt ok - do toho skrytýho pole jsem místo @$clanek dala @$_GET[clanek]
juneau
Profil *
no ano, doma ti to jelo proto, ze mas v php.ini (c:/windows) povoleno "register_globals on" ... je to jiste bezpecnostni ohrozeni, proto to maji ostre servery vypnute.

a co to dela?

pokud odesles doma formularove pole s name="clanek", pak se do druhe stranky preda promenna $clanek a $_POST["clanek"] (jenze tu samou promennou $clanek dostanes, kdybys ji predavala pres url a ne pres formular. Dve ruzne metody vytvori jednu spolecnou promennou)

Pokud to ale udelas na serveru, ktery ma vypnute register_globals, tak se do druhe stranky preda jen bezpecnejsi $_POST["clanek"]... zadna promenna $clanek se nevytvori.

Je to o bezpecnosti. A doporucuji ti, aby sis u sebe register_globals vypla take (off) a prepsala vsechny svoje kody z $promenna do $_GET/POST["promenna"]. cim drive to udelas, tim lepe... ja to udelal po dvou letech programovani a pekne jsem se natrapil, nez jsem nasel ten nejposlednejsi $clanek (a nahradil ho $_GET["clanek"]).
Leo
Profil
"tak to vypadá, že už je to snad fakt ok - do toho skrytýho pole jsem místo @$clanek dala @$_GET[clanek]"

Chcete rict, ze mate ve formulari, ktery posilate metodou POST skryte pole s timhle name? To ne, ze ne? :-) Leo
juneau
Profil *
co je na tom name spatne? name="clanek" je snad v poho, ne? :)

ale ted taky koukam na onu hodnotu... on problem je totiz asi tady:

clovek prijde na clanek pres odkaz, id clanku se preda jako GET a to se vepise do formulare pod clankem. formular se odesle do te same stranky, a z GET clanek mame POST clanek, ktery se uz do formulare opetovne nevklada.

takze bych se priklanel k tomu, aby petra na zacatek scriptu jeste dopsala toto:

if(@$_GET["clanek"] == "")
{
$_GET["clanek"] = @$_POST["clanek"];
}

pokud script zjisti, ze GET clanek je prazdna, pokusi se do ni ulozit POST clanek. pokud je i ten prazdny, tak hold bude promena GET clanek prazdna tak jako tak.
Petrav
Profil *
juneau - dík za tip, vypnu to taky, aspoň se pak nebudu divit, že to co fungovalo, najednou nejde

Leo - asi je to příšernost, ale fakt to tam tak mám, zřejmě bych se měla stydět, ale tohle jediný funguje (samozřejmě z toho, co mě napadlo vyzkoušet), prostě jsem to jinak nevymyslela

a ještě jeden dotaz - co kdybych ten formulář zpracovala metodou get? už jsem pochopila, že ty hodnoty se pak předají přes url - vadí to něčemu?
Petrav
Profil *
juneau - další dík, vyzkouším to a napíšu, jak jsem dopadla

(teď jsem si teprve přečetla tvůj dnešní příspěvěk)
Petrav
Profil *
konečně to funguje, jak má, fakt děkuju za rady a taky za vysvětlení
juneau
Profil *
rado se stalo :)

btw, primlouvam se za bezvyhradne pouzivani metody POST pro formulare. Uz z principu. GET by ti mimojine strasne zasvinilo url a pak by se na takovy text tezko odkazovalo zkopirovanim adresove radky.
Leo
Profil
"btw, primlouvam se za bezvyhradne pouzivani metody POST pro formulare. Uz z principu. GET by ti imojine strasne zasvinilo url a pak by se na takovy text tezko odkazovalo zkopirovanim adresove radky."

Zatimco kdyz pouzijete POST tak se na vyslednou stranku neda odkazat vubec :-) Leo
juneau
Profil *
na to jsou permalinky :)

nebo bys odkazoval na stranka.php?idclanku=52&jmeno=petra&mejl=mejl@mejl.cz&text=nejaky strasne dlouhy komentare... atd

to bys jeste i odkazanim touto adresou vlozil hezkych par komentaru :)

Osobne se sam primlouvam na nepouzivani samoreloadovacih scriptu tohoto typu. clovek reloadne, jestli se neobjevil nejaky komentar, a podruhe ulozi ten, co napsal predtim.

radeji komentare do db ukladat na jine strance a z ni se zase pres [meta] nebo header() vracet na onu puvodni prave zadani adresy stranka.php?clanek=xy ... pak muzes lehce odkazovat i po odeslani komentare
Leo
Profil
"na to jsou permalinky :)"

Jsme si nerozumeli. Vy o pridavani komentaru ja o formularich obecne - treba u vysledku vyhledavani (Google) je metoda GET uzitecna, protoze se muzu odkazat na vysledky vyhledavani.

Leo
Toto téma je uzamčeno. Odpověď nelze zaslat.