Nejde mi komentář

Dobry vecer, chci si pod clanky dat komentar, ale nejde to, hazi to chyby, je tenhle kod spatny?
<center>
<div style="text-align: center">
<form method="POST" action="">
Jméno<br>
<input type="text" name="name"><br>
Předmět<br>
<input type="text" name="predmet"><br><br>
Zpráva<br><br>
<textarea name="text" rows="15" cols="45"></textarea><br><br>
<input type="submit" value="Napiš komentář">
<?php
$name = $_POST['name'];
$predmet = $_POST['predmet'];
$text = $_POST['text'];
$page = $GET_['page'];
$komentar = "$name<br>$predmet<br>$text";

if(!isset($name) || !isset($text))
echo "Vyplňte všechny pole";
$zprava = fopen("$page-komentar", "a+");
fwrite($zprava, $komentar);
fclose($zprava);

?>
</center>
Dekuji za radu..
A jaképak chyby to hází?

PS:
A co: <form method="POST" action=""> - zkusit něco doplnit do těch prázdných uvozovek?
<HTML>Co je $GET_ na 15. řádku?

Jinak pozor na to, proměnné $name i $text budou v té podmínce na 18. řádku vždy nastaveny (protože jim předtím přihazuješ hodnoty z $_POSTu), je třeba to upravit buď na kontrolu prázdnosti (empty(), případně trim() a potom empty() - nelze empty(trim())), nebo kontrolovat isset($_POST[...]). (Nejlépe obojí.)

Pokud máš přísný interpret PHP, bude házet Notice chyby při čtení z nepřijatých polí - pokud např. uživatel neodešle pole "name", vyhodí 12. řádek ($name = $_POST['name'];) hlášku. Je třeba tyto vstupy ohlídat pomocí isset.

Další věc, na kterou tě chci upozornit, je nezabezpečení proti napsání jakéhokoliv kódu - chybí při sestavování proměnné $komentar použití funkce htmlspecialchars(). Bez tohoto opatření může návštěvník nahrát do knihy např. libovolný nežádoucí skript (říká se tomu cross-site scripting). A pokud příspěvky při výpisu includuješ, může dojít i k PHP injection, protože návštěvník může zapsat do knihy libovolný PHP skript, který se pak při výpisu vykoná.

Dále (no je toho hodně... až s úžasem, kolik chyb lze najít v 25řádkovém skriptu) by bylo dobré zamyslet se nad způsobem ukládání příspěvku. Nebylo by lepší zvolit databázi? A pokud chceš zůstat u souboru - je nutné do souboru zapisovat i HTML značky? Já třeba razím zásadu, že skladovaná data by měla být v co nejsyrovější podobě - a jejich upečení by se mělo odehrávat až při výpisu. Výhodou té mé zásady je, že když změním výstupní formát (např. chci přejít z HTML na XHTML, nebo chci trošku jinak strukturovat ten vypsaný komentář, nebo třeba chci vypsat komentáře v nějakém úplně jiném formátu, např. holém textu nebo csv), stačí předělat vypisovací funkci. V tvém případě bys musel projít celý soubor s komentáři a předělat.

Dále - pokud dojde k chybě, je dobré při výpisu formuláře znovu vyplnit uživatelem zadaná pole.

Za další - pokud uživatel úspěšně odešle komentář, je lepší namísto následného přímého výpisu uživatele přesměrovat (header("Location: komentare.php"). Účelem je zabránit nevědomému znovuodeslání formuláře, pokud uživatel po úspěšném odeslání komentáře refreshne (F5) stránku.

No a v neposlední řadě mám výtku k HTML kódu. Nevím, v jaké verzi HTML to děláš, ale obecně:
- použití tagu center - ne
- použití přímých stylů - ne
- šílené řádkování - ne, je lepší formulář hezky strukturovat pomocí divů a labelů

A úplně nakonec - taková drobnost, ale štve mě. Nauč se pracovat se středním rodem. Já vím, 90 % Čechů a 100 % politiků mají s tímto rodem problémy, ale není tak těžké jej zvládnout. Správně se totiž píše "Vyplňte všechn<b>a</b> pole"</HTML>
<HTML>Jen tak mimochodem - $_GET['page'] nemůže být přijat z odeslaného formuláře, když není uveden v action. ;)</HTML>
Ano, ale jak to ma byt? Moc s PhP neumim, a je to moc slozite, nedokazu si to predstavit jak v HTML
Např. takto:

soubor form.html: (+ hlavičky at..)
<form method="POST" action="zpracuj.php?page=hodnota_promenne_page">
Jméno<br><input type="text" name="name"><br>
Předmět<br><input type="text" name="predmet"><br><br>
Zpráva<br><textarea name="text" rows="15" cols="45"></textarea<br><br>
<input type="submit" value="Napiš komentář">
</form>

soubor zpracuj.php:
if(!isset( $_POST['name']) || !isset($_POST['text']) || !$_POST['predmet']) die('Nezadany hodnoty.');
if(strlen(trim($_POST['name'])) < 1 || strlen(trim($_POST['text'])) < 1 || strlen(trim($_POST['predmet'])) < 1) die('Hodnoty jsou prazdne.');

$komentar = $_POST['name'].'<br>'.$_POST['predmet'].'<br>.'trim($_POST['text']);

$zprava = fopen($GET_['page']."-komentar", "a+");
fwrite($zprava, $komentar);
fclose($zprava);

___
Cele je to dost zjednodušené. Žádná kontrola vstupu atd.. takže v praxi funkční, ale pro nasazení na veřejně dostupný web nepoužitelné.

<myšlenka dne>
Kurva, lidi, neblbňete. Neučte se programovat na PHP. Vyberte si nějaký klasický imperativní jazyk (C,C++,Pascal) a hrajte si s ním. PHP je programovací jazyk jako každý jiný - dovoluje ale mnohem více prasáren než ostatní jazyky... Pak má ten web nějak vypadat :/
</myšlenka dne>