webForumDet fria alternativet

hur blir jag av med att en sida vill skicka om informationen vid refresh?

PHP

16 svar · 502 visningar · startad av mangan

Medlem sedan feb. 2003216 inlägg
Frågan#1

tjenare!

har en gästbok som består av en sida där man både postar mess och kollar i gästboken. När man skickar ngt ifrån formuläret till den egna sidan så går det alldeles utmärkt, men om jag sedan tar refresh i min browser så vill den skicka informationen igen vilket leder till att jag får ännu ett likadant inlägg i min gästbok.
Jag har testat att sätta mina skickade variabler till NULL efter det att dom lagrats i databasen men det hjälper inte, det frågas fortfarande om jag vill ta retry.....
Ska man "förstöra" värdena som skickats eller hur ska man göra?

Ngn som har en lösning?

Medlem sedan jan. 2000372 inlägg
#2

Det är troligen för att du submittat data via POST. Du kan lösa det genom att ha en separat PHP-sida för själva postningen till databasen som sen redirectar till gästbokssidan.

Medlem sedan aug. 20002 975 inlägg
#3

Det behövs ingen ny sida. Det räcker med att man laddar om sidan med header("Location: sida.php") efter att man sparat till databasen.

Medlem sedan feb. 2003216 inlägg
#4

det funka inte så bra.....

Warning: Cannot add header information - headers already sent by (output started at /customers/aptrut.com/aptrut.com/httpd.www/v3/gbtitta.php:8) in /customers/aptrut.com/aptrut.com/httpd.www/v3/gbtitta.php on line 48

fick jag istället......
jag kanske inte var tillräckligt tydlig så jag gör ett nytt försök:

sidan gbtitta.php laddas. ett inlägg görs och gbtitta.php laddas igen. inlägget skrivs till databasen och sedan skrivs alla inlägg ut. men det är sen det uppstår problem. om man tar refresh efter att man har gjort ett inlägg kommer det att postas igen och igen och igen så länge man gör refresh. någon slags tidsbegränsning av hur ofta man får posta nya meddelanden vill jag inte ha.
[php]
//----------skickar värden till databas om variabler tagits emot----------------

if ($namn != null && $text !=null){
$date = hamta_datum();
$tid = hamta_tid();

//skapar databaskoppling
$db = mysql_connect("localhost","XXXXXXX","XXXXXX") or die ("Databaskopplingen kuka ur!");
mysql_select_db("XXXXXX",$db);

//Skickar variablerna till databasen typer:datum=date,tid=string,namn=string,text=string
$sql="INSERT INTO aptrut_com.gastbok
(datum,tid,namn,text)
VALUES
('$date','$tid','$namn','$text')";

mysql_query($sql, $db);

}
//header("Location: gbtitta.php"); // denna raden gav felmeddelandet

//---------------skriver ut databasen-------------------------------

//-------formuläret------------
<form method="post" action="gbtitta.php" target="main">
Namn:<br>
<input type=text name="namn" size=30 maxlength=15><br>
Text:<br>
<textarea cols="28" rows="12" name="text">

Medlem sedan aug. 20002 975 inlägg
#5

Före en header får man inte skicka något till webbläsaren. Ingen HTML, ingen echo eller print. Ej heller någon tomrad eller mellanslag före PHP-taggen.

Lägg din kod för att spara överst i skriptet, och se till att du inte skickar något till webbläsaren före headern.

Medlem sedan feb. 2003216 inlägg
#6

så du menar att jag ska lägga header() högst upp egentligen? blir det inte problem när jag skicka saker till sidan då från formuläret?

Medlem sedan aug. 20002 975 inlägg
#7

Tvärtom.

Själv brukar jag försöka placera all kod som ska spara i databas mm överst i skriptet.

Endast det som hör ihop med utskrifter brukar jag lägga inne bland HTML-koden.

På så sätt får man ett bättre samlat grepp över koden när man samlar det som hör ihop med varandra.

Medlem sedan jan. 2000372 inlägg
#8

...eller så gör man som jag föreslog och lägger det i olika filer. Det är mest en smaksak och alla programmerare har sina egna idéer och rutiner...

Medlem sedan feb. 2003216 inlägg
#9

jag får ingen ordning på det här.......

nu ser min kod ut så här rent tankemässigt:

1. php-block med kod för eventuella inlägg, avslutas med header("Location: gbhitta.php")

2. html-block med utskrift av formulär och gästbok(php/mysql)

snart så blir det väl en "mellansida" antagligen......

Medlem sedan aug. 20002 975 inlägg
#10

En tomrad eller mellanslag före den inledande PHP-taggen resulterar i att något skickas till webbläsaren.

Inkluderar du en fil får du dessutom se till att det, i den inkluderade filen, inte finns något tomtecken efter den avslutande PHP-taggen.
Har du en inkluderad fil så sätt markören efter den avslutande PHP-taggen och tryck upprepade gånger på delete så du är säker på att där inte finns något.

Kan du visa hur din kod ser ut nu, fram till och med header() ?

Medlem sedan feb. 2003216 inlägg
#11

hade inga mellanslag eller tomma rader där du sa att jag skulle kolla. här kommer koden fram till header().

<?php
include("funkis.php");

//----------skickar värden till databas om variabler tagits emot----------------
if ($namn != null && $text !=null){
	$date = hamta_datum();
	$tid = hamta_tid();

//--------------formaterar texten-------------------------
	$text = strip_tags($text); //strippar på html och php taggar
	$text = str_replace("fanskap","kiss",$text);
	$text = str_replace("fan","apa",$text);
	$text = str_replace("hemma","i kojan",$text);
	$text = str_replace("jäkla","nedrans",$text);
	$text = str_replace("skit","guano",$text);
	$text = nl2br($text); 

	//skapar databaskoppling
	$db = mysql_connect("localhost","X","X") or die ("Databaskopplingen balla ur!");
	mysql_select_db("X",$db);

	//Skickar variablerna till databasen    typer:datum=date,tid=string,namn=string,text=string
	$sql="INSERT INTO X.gastbok 
		(datum,tid,namn,text) 
		VALUES 
		('$date','$tid','$namn','$text')";
	mysql_query($sql, $db);
}
header("Location: gbtitta.php");
?>

sen är det bara utskriften som görs via html och php/mysql.

Medlem sedan apr. 2002830 inlägg
#12

hur ser det ut i funkis.php filen då? Kanske finns något där som skriver ut html

Medlem sedan feb. 2003216 inlägg
#13

ingen html i funkis men här e den:

<?php

//funktion som hämtar datum och formaterar den ex. 030103
function hamta_datum() {
	$today = getdate(); 
	if ($today['mon'] < 10) {
		$mon = "0".$today['mon'];
	} else {
		$mon = $today['mon'];
	}
	if ($today['mday'] < 10){
		$day = "0".$today['mday'];
	} else {
		$day = $today['mday'];
	}
	return $date = $today['year'].$mon.$day;
}

//funktion för att hämta aktuell tid och formatera den ex. 20:03:30
function hamta_tid(){
	$todag = getdate(); 
	if ($todag['seconds'] < 10) {
		$sec = "0".$todag['seconds'];
	} else {
		$sec = $todag['seconds'];
	}
	if ($todag['minutes'] < 10) {
		$min = "0".$todag['minutes'];
	} else {
		$min = $todag['minutes'];
	}
	if ($todag['hours'] < 10) {
		$hour = "0".$todag['hours'];
	} else {
		$hour = $todag['hours'];
	}
	return $time = $hour.":".$min.":".$sec;
}
?>
Medlem sedan aug. 20002 975 inlägg
#14

Har du kollat upp så du inte har något mellanslag, tomrad eller dylikt, både före och efter PHP-taggarna i funkis.php ?

Hur ser felmeddelandet ut nu ?

Medlem sedan feb. 2003216 inlägg
#15

well....vad ska man säga. den laddar typ för alltid.... det kommer inte ngn sida alls. har dubbelkollat och trippelkollat alla inblandade scriptfiler. det finns inga mellanslag eller extra rader före eller efter php-taggarna.

Medlem sedan aug. 20002 975 inlägg
#16

Flytta in headern i if-satsen.

Istället för:

<?php
include("funkis.php");

//----------skickar värden till databas om variabler tagits emot----------------
if ($namn != null && $text !=null){
   .
   .
   .
}
header("Location: gbtitta.php");
?>

Skriver du:

<?php
include("funkis.php");

//----------skickar värden till databas om variabler tagits emot----------------
if ($namn != null && $text !=null){
   .
   .
   .
   header("Location: gbtitta.php");
   exit;
}

?>

Som det nu är så fastnar du i en slinga där sidan hela tiden laddas om.

Medlem sedan feb. 2003216 inlägg
#17

OK! nu funkar det men problemet med att om man bara fyllde i sitt namn och skickade och sen tog refresh kvarstod. fick löst det med en enkel else if-sats:

 else if($namn != null || $text != null){
	header("Location: gbtitta.php");
	exit;
}

tack så jättemycket för hjälpen allihop! :birp

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)