Balon
13.01.2006, 18:17:04
W skrypcie pisanym przeze mnie jest mozliwosc komentowania newsow ale niestety jak sie wpisze tresc komenta i wysle sie go to po odswiezeniu strony pojawia sie nastepny koment... w jaki sposob temu zapobiec ? probowalem za pomoca header ale sie gryzlo to cos ... czy jest inny sposob ? prosze o podawanie przykladow bo jak ktos bedzie proponowal JS to nie bede wiedzial w jaki sposob to zrobic ....
pozdrawiam
crash
13.01.2006, 18:19:20
Po dodaniu newsa użyj funkcji header( 'Location: ' . $_SERVER[ 'PHP_SELF' ] ); aby przeładować stronę.
Balon
13.01.2006, 18:32:05
to ja korzystałem z podobnego skryptu ale niestety dostaje komunikat
Kod
Warning: Cannot modify header information - headers already sent by (output started at /home/soonhost/public_html/balon_portfolio/tmp/2/index.php:17) in /home/soonhost/public_html/balon_portfolio/tmp/2/inc/wiecej.php on line 56
chociaz w pliku dalem buforowanie itd...
Nie wiem dlaczego sie tak dzieje bo w panelu admina korzystam z tego samego i działa. Nie chce zadziałać więc zastanawiam się czy jest inne rozwiązanie.
yavaho
13.01.2006, 18:35:31
Ja mam tak
1) po wysłaniu przeladowanie za pomocą header - i juz nikt mi nie wysle drugi raz to samo naciskajac F5
2) ciasteczko lub sesja - nastepną wiadomosc mozna przeslac po 60s
3) wiadomosci zapisywane sa w bazie danych - wiec mozna sprawdzic czy identyczna tresc + imie znajduje sie juz w bazie danych i wyslanie drugiej identycznej kopi tej widomosci mozna blokowac na 24h.
mike
13.01.2006, 18:36:00
Większość ludzi poleca buforowanie na ominięcie problemu związanego z "headers already sent". Nawet na wiki tak piszą.
A ja twierdzę że to głupota.
Jak chcesz kogoś przekierować po wykonaniu pewnych operacji to po kiego cos wyświetlasz?
Moja podpowiedź.
Po operacjach (i w czasie) zrezygnuj z jakiegokowiek wyświatlania czegokolwiek a potem przekieruj na stroną, na której poinformujsz o powodzeniu lub niepowodzeniu zapisu.
Radarek
13.01.2006, 19:14:26
Dokladnie tak samo mysle. I moznaby powiedziec, ze buforowanie jest niepotrzebne, jednak sa sytuacje kiedy sie przydaje. Czasem spotykalem sie ze skryptem w ktorym ciezko bylo sie polapac, gdyz bylo masa blokow if-else (przez co przeplywa sterowania bylo ciezko zalapac:) ), a trzeba bylo uzyc funkcje modyfikujaca naglowek http, co czesto konczylo sie znanym juz komunikatem "headers alredy sent". W takim wypadku, najlatwiejszym wyjsciem (bez analizowania skryptu i babrania sie) bylo dodanie buforowania (ob_start() na poczatku skryptu) i po sprawie.
yavaho
13.01.2006, 19:41:25
A ja uzywam bardzo czesto ob_start("ob_gzhandler") I tylko ze wzgledu na korzysci ktore wynikają na zmiejszeniu transferu strony.
@Balon instrukcja ob_start(); musi byc na samym poczatku nie tak skryptu, a powiedzial bym ze na poczatku pliku. Jezeli plik kodowany jest w UTF-8 to moze Ci wywalac w/w blad. W takich plikach kodowanych w utf-8 na poczatku pliku czesto przylepiany jest tak zwany BOM.
Najlepiej utworz od nowa plik i wklej do niego zawartosc z tego poprzedniego. I nie zapisuj pliku z kodowaniem utf-8.
Balon
13.01.2006, 20:13:58
Strona niby nie jest w UTF, a obstart jest na poczatku index.php do ktorego sa includowane podstrony.... Ale nadal nie działa.
EDIT : http://www.ppx.pl/balon_portfolio/tmp/2/in...co=wiecej&id=41 tutaj mozecie sprobowac
crash
13.01.2006, 20:28:01
Zarzuć kodem, bo nie widać żebyś cokolwiek tam poprawił...
Balon
13.01.2006, 20:39:59
plik z podgladem newsa (ten w ktorym sa komentarze)
<?
lacz();
$id = $_GET['id'];
if (!$id) {
echo"<table bgcolor=3e3e3e border=0 width=600 align=center cellpadding=0 cellspacin
g=0> <tr><td bgcolor=3e3e3e width=100% class=news>Strona wywolana w nieprawidlowy sposob. Poruszaj sie za pomoca linkow.</td></tr>
</table><br>";
}
$zapytanie = "SELECT * FROM `newsy` WHERE id = $id";
echo"<table bgcolor=3e3e3e border=0 width=600 align=center cellpadding=0 cellspacin
g=0> <tr><td bgcolor=3e3e3e width=100% class=news><span class=title>$row[title]</span> // $row[data]";
<font align=justify>".stripslashes($row[tresc
])."</font> </td></tr> <tr><td bgcolor=505050 width=100% height=25 class=news><right><b>Autor:</b> $row[autor]</td></tr>
</table><br>";
}
//***********************************/
// KOMENTARZE /
//***********************************/
$ile = 15;
if(!$p) $p = 0;
$zapytanie = "SELECT * FROM `komentarze` WHERE id_news = $id ORDER BY `id` DESC LIMIT $p,
$ile";
echo "<table bgcolor=505050 border=0 width=600 align=center cellpadding=0 cellspacin
g=0>"; {
echo "<tr><td bgcolor='505050' width='100%' class=news><b>".$row['autor']."</b><br>".stripslashes($row[tresc
])."<br></td></tr>"; $i++;
}
?>
<form method="post" action="index.php?co=wiecej&id=<?=$_GET['id']?>">
<table bgcolor=3e3e3e border=0 width=600 align=center cellpadding=0 cellspacin
g=0 class=news>
<?
####################
# Dodawanie koentów
####################
if($send=='Skomentuj')
{
{
echo "<tr><td><b>Nie wypełniłeś wszystkich pól.</b></td></tr>"; }
if (!ereg('[a-zA-Z0-9-.,]+', $tresc)) {
echo "<tr><td><b>Treść zawiera nieprawidłowe znaki.</b></td></tr>"; }
$zapytanie = "INSERT INTO `komentarze` values ('', '$_GET[id]', '$autor', '$tresc')";
if (!$wykonaj)
{
echo "<tr><td><b>Komentarz nie mógł zostać dodany</b></td></tr>"; }
header ('Location: index.php?co=wiecej'); }
?>
<tr><td>Nick: </td><td><input type="text" class="t1" name="autor"></td></tr>
<tr><td>Tresc: </td><td><TEXTAREA name="tresc" rows="4" cols="30" wrap="virtual" style="font-family:verdana, tahoma, sans-serif; font-size:11px; color:#000066; border: 1px solid #000066"></TEXTAREA></td></tr>
<tr><td> </td><td><input type="submit" value="Skomentuj" name="send" class="t1"></td></tr>
</table>
</form>
<?
#### STRONY ####
echo "<table border=0 width=600 align=center cellpadding=0 cellspacing=0 class=news>"; echo "<tr><td align=right class=strona>strona: "; for($i=0;$i<ceil($numrows/$ile);$i++) {
echo '<a class="a1" href="index.php?co=wiecej&id='.$id.'&p='.($i*$ile).'">'.($i+1).'</a> '; }
?>
index.php
?>
<html>
<head>
<title>Portal Newsowy - v 1.0.</title>
<link rel="stylesheet" href="style.css" type="text/css" />
<link rel="alternate" type="application/rss+xml" title="Ppx.pl - kanal rss" href="rss.php" />
</head>
<body><br>
<table border="0" width="600" height="80" align="center" cellpadding="0" cellspacing="0">
<tr>
<td class="news" bgcolor="#3e3e3e" align="left" valign="middle">
<a href="index.php"><img src="img/top.gif" border="0"></a>
</td>
</tr>
</table>
<table border="0" height="25" width="600" align="center" cellpadding="0" cellspacing="0">
<tr><td width="100%" height="100%"></td></tr>
</table>
<?
if($co=="newsy") { include "inc/newsy.php"; }
elseif($co=="viewprofil") { include "inc/profil.php"; }
elseif($co=="wiecej") { include "inc/wiecej.php"; }
else { include "inc/newsy.php"; }
?><br>
</body>
</html>
Proszę bardzo
Rafiki
13.01.2006, 21:04:24
<?ob_flush();
?>
moze daj na samym poczatku zamiast tego:
<?php ob_start('ob_gzhandler'); ?>
Rownie dobrze moglbys przebudowac troche skrypt i obylo by sie bez buforowania
Edit:
Mysle ze to nie wersja finalna skryptu bo ja sam ( choc niejestem dobry z php ) zauwazylem dosc powazne bledy w tym dodawaniu komentarzy
crash
13.01.2006, 21:09:22
1. Nie buforujesz tego co trzeba.
2. Buforowanie zaczynasz od ob_flush()? Ciekawe...
Rafiki
13.01.2006, 21:12:59
Cytat
1. Nie buforujesz tego co trzeba.
Moze sie myle ( a to mozliwe

ale jezeli da na samym poczatku pliku index.php ob_start(); a w nim bedzie includowany plik x.php ( a tak widze ze jest ) powinno byc chyba wszystko ok, bo chyba ob_start bedzie tez dotyczyc includowanego pliku, choc nie jestem pewien
Balon
13.01.2006, 21:15:56
Cytat(crash @ 2006-01-13 20:09:22)
1. Nie buforujesz tego co trzeba.
2. Buforowanie zaczynasz od ob_flush()? Ciekawe...
@Crash - nie wiem jaki błąd popełniłem tutaj. Robiłem tak w panelu admina i działało. Więc czy mógłbym Cię prosić o jakieś wskazówki ?
crash
13.01.2006, 21:50:37
Rafiki: racja, ale za bardzo tu namieszane i nie widać co jest co.
Balon: aby rozpocząć buforowanie używa się ob_start();
yavaho
13.01.2006, 22:25:27
@Balon tworzyles nowy plik index.php tak jak ci radziłem?
Utworz zupelnie nowy plik i nazwij go index.php i wklej do niego kod z tego poprzedniego. Chodzi o to abys calkowicie pozbył sie aktualnego pliku index.php Tylko nie rób kopii tego pliku!
I na poczatku daj:
ob_start" title="Zobacz w manualu php" target="_manual();
a na koncu:
ob_end_flush" title="Zobacz w manualu php" target="_manual();
Jezeli na stronie znajdują sie skrypty ktore pożerają duzo zasobów serwera to wtedy mozesz dac gdzieś pomiedzy nimi w środu strony
ob_flush" title="Zobacz w manualu php" target="_manual()
flush" title="Zobacz w manualu php" target="_manual(); co spowoduje wysyłanie strony do klienta na "raty".
Albo ten kawałek kodu, ktory odpowiedzialny jest za zapisane komentarzy do bazy wydziel do osobnego pliku, ktory nie bedzie includowany i wtedy niepotrzebne bedzie ob_start(), a po zapisaniu danych do bazy i tak przekieruje do index.php. Tylko wtedy trzeba opracowac inny sposob obslugi bledów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.