Autor Zpráva
Čermi
Profil *
Je mi již předem jasné, že mi bude řečeno, abych použil google. Jenže to dělám už druhý den. Prolezl jsem všechny knížky, které mám a stále nenacházím řešení. Mám knihu návštěv a nemohu zabránit tomu, aby se při reloadu stránky znova neuložil přispěvek do DB. zkoušel jsem header("Location: ... ale ten nefunguje, protože před ním posílám hlavičky a nejsem asi takový frajer, abych to pořešil... unset($_POST); též nefunguje... napadly mne sessions, ale ty prý také moc nefungují...
Pro jistotu přikládám stávající verzi kódu:

<?php

echo "<div class=\"nadpis\">Kniha návštěv</div>";

//----formulář pro vložení ....
?>

<form method="post" action="<?php echo $adresa."kniha-navstev/"; ?>">  
Jméno * : <input method="post" type="text" name="jmeno">
Email: <input method="post" type="text" name="email" value="@">
Website: <input method="post" type="text" name="website" value="http://">
<textarea method="post" maxlength="750" name="text" cols="60" rows="10">
</textarea>
<br>
<input type="submit" method="post" value="Odeslat" name="odeslat">
<input type="reset" method="post" value="Vymaž" name="smazat">
</form>



<?php

// --------------------------------------- uložení příspěvku

if ((!empty($_POST["jmeno"])) && (!empty($_POST['text']))):

	//zabezpečení
	$_POST['jmeno']=htmlspecialchars($_POST['jmeno']);
	$_POST['email']=htmlspecialchars($_POST['email']);
	$_POST['website']=htmlspecialchars($_POST['website']);
	$_POST['text']=htmlspecialchars($_POST['text']);

	$jmeno=mysql_escape_string($_POST['jmeno']);
	$email=mysql_escape_string($_POST['email']);
	$website=mysql_escape_string($_POST['website']);
	$text=mysql_escape_string($_POST['text']);

		// --- zapsání komentáře do db - 

$zapis=mysql_query("INSERT INTO guestbook VALUES ('','".date("Y-m-d")."',NOW(),'$jmeno','$website','$email','$text')"); 

endif;

// ------------------ vypsání příspěvků

$pocet_clanku=mysql_num_rows(mysql_query("SELECT * FROM guestbook",$pripojeni));
	echo "<div class=\"kom_cel\">V databázi je celkem ".$pocet_clanku." komentářů<br></div>\n";


$vypis=mysql_query("SELECT ID_gb, datum, cas, jmeno, web, email, komentar FROM guestbook ORDER by ID_gb DESC");
	while($koment = MySQL_Fetch_Row($vypis)):

	// ----- převod data
$date=Date ("d.m.Y",StrToTime($koment[1]));

		echo "<div class=\"gb_ram\">\n";		
		echo "<div class=\"gb_cas\">\n".$date." - ".$koment[2]."&nbsp;&nbsp;\n";
		echo "<a target=\"_blank\" href=\"".$koment[4]."\">".$koment[4]."</a>&nbsp;&nbsp\n";
		echo "<a href=\"mailto:".$koment[5]."\">".$koment[5]."</a>\n";
		echo "</div>\n";
		echo "<div class=\"gb_jmeno\">".$koment[3].":</div>\n";
		echo "<div class=\"gb_text\">".$koment[6]."</div>\n";
		echo "</div>\n";
	endwhile;


?>



Pomohli by jste mi prosím najít řešení?
Tisíceré díky
Alphard
Profil
kvůli jakým hlavičkám nefunguje header? dejte sem ukázku
Alphard
Profil
až teď to čtu :-)

$pocet_clanku=mysql_num_rows(mysql_query("SELECT * FROM guestbook",$pripojeni));

na tohle hodně rychle zapomeňte
$pocet_clanku = mysql_result (mysql_query ("select count(*) from guestbook"), 0, 0);


už se mi nechce čekat, tohle by mělo fungovat
Čermi
Profil *
Dovolím si položit otázku... V čem je lepší Váš SQL dotaz lepší než ten, který jsem tam psal?
Zkusil jsem zapsatheader, tak jak radíte, ale stále hlásí chybu.... Háček je asi to že knihu návštěv mám includovanou do index.php kde se podle $_GET['name'] rozhoduje ktety soubor se includuje a v začátku index.php posílám celou hlavičku se všemi meta tagy. Jenže před header nesmí být html výstup. háček je v tom, že vůbec netuším.
Alphard
Profil
V čem je lepší Váš SQL dotaz lepší než ten, který jsem tam psal?
je efektivnější, databáze velice rychle spočítá záznamy a vrátí jediné číslo
váš dotaz přikazuje databázi vrátit všechny záznamy, které se musí přenést, PHP je musí spočítat a pak je ještě necháte v paměti
ale vzhledem k tomu, že nepoužíváte stránkování, bude nejlepší ten dotaz smazat úplně a spočítat až ten druhý (tak jak jste to měl původně), který následně vypíšete

posílám celou hlavičku se všemi meta tagy
ano, to je problém, buď změnte strukturu, nebo použijte bufferovací funkce
také by šlo použít různé jedinečné hashe, ale nemyslím, že by to bylo jednodušší
Mastodont
Profil
V čem je lepší Váš SQL dotaz lepší než ten, který jsem tam psal?
V prvním případě se načte celá tabulka (což mohou být tisíce řádků), ve druhém případě se načte jen jediné číslo s počtem řádků. To je dost zásadní rozdíl.
Čermi
Profil *
Mrknu se na ty bufferovací fce a v nejhorším se zase obrátím na Vás. Díky moc za help.
Čermi
Profil *
Tak jsem si hrál...když použiji ob_start a ob_end_flush, tak stejně obdržím chybovou hlášku po odeslání formuláře... Nejde to vyřešit nějako elegantněji? Napadlo mě ukládat to do cookies - čímž bych vylepšil gb tím, že když se návštěvník vrátí, nemusel by znovu vyplňovat jméno mail a website. jen by napsal příspěvek... Ale tuším, že problém opětovného ukládání při reloadu tím nevyřeším....
xy125
Profil
Nepoužívej jeden soubor. Po odeslání příspěvku zavolej např. soubor uloz_prispevek.php, ve kterém bude pouze uložení do databáze a přesměrování zpět na knihu návštěv a nejsou potřeba žádný buferovací funkce, sessions atd..
A je to jednoduchý
Čermi
Profil *
Díky moc chlapi. Funguje to. Jen jsem se zbláznil a zkusím to ještě vylepšit těmi cookies a uvidíme :-D

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0