webForumDet fria alternativet

Problem med svarsinlägg till forum

PHP

56 svar · 1 091 visningar · startad av addeweb · sida 2 av 3

Frågan, av addeweb

Jag har gjort iordning ett forum för en sajt. Problemet med forumet är att på svarsidan kan jag inte få några svarsinlägg alls under startinlägget. Allt som syns av dessa svar är antalet som ändras i listan på forumets första sida när man har svarat på startinlägget. Längre ner i koden under "Hämta alla svar till aktuell inlägg" finns delen som skulle ha hämtat alla svaren. Någonting som

Läs frågan i sin helhet →
Medlem sedan aug. 20002 975 inlägg
#21

Hur ser rad 38 och rad 40 ut ?

Medlem sedan jan. 2004216 inlägg
#22

Raderna mssql_query($msquery); som finns på rad 38 och 40.

$msquery = "SELECT FROM forum WHERE id = '$id'";
		if ($ref_id == 0)
		{
		$msquery = "DELETE FROM forum WHERE id = '$id'";
		mssql_query($msquery);
		$msquery2 = "DELETE FROM forum WHERE ref_id = '$id'";
		mssql_query($msquery2);
mssql_close();
$msquery = "DELETE FROM forum WHERE id = '$id'";
		mssql_query($msquery);
Medlem sedan aug. 20002 975 inlägg
#23

Är `id` av numeriskt format får du inte ha några apostrofer/fnuttar runtom $id:

$msquery = "DELETE FROM forum WHERE id = $id";
Medlem sedan jan. 2004216 inlägg
#24

Nya problem! Kan inte ta bort inlägg längre. Det händer ingenting hur mycket jag klickar på tabort-knappen. :(

Så här ser koden ut nu i tabort.php:

<?php
// Kollar statusen 
if($status >= 1 && isset($_SESSION['Loginname'])) { 

    // Körs om du har status 1 (sysop) 

	if(isset($_GET['amne'])){
	$amne = $_GET['amne'];

	$msquery = "SELECT FROM forum WHERE id = $id";
		if ($ref_id == 0)
		{
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		$msquery2 = "DELETE FROM forum WHERE ref_id = $id";
		mssql_query($msquery2);
		mssql_close();
		//echo "<script type=\"text/JavaScript\">location=\"index.php\"</script>";
		header ("Location: index.php");
		}else{
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		mssql_close();
		//echo "<script type=\"text/JavaScript\">location=\"svar.php?id=$ref_id\"</script>";
		header ("Location: svar.php?id=$ref_id");		
		} 
	}
	?>
		<h3 style="font-family:Verdana">Radering av inlägg</h3>
		<p style="font-family:Verdana; font-size: 11px">Ta bort rubriken: <b><?=$amne?></b></p>
		<form action="<?=$PHP_SELF?>" method="post">
		<input type="hidden" name="id" value="<?=$id?>">
		<input type="Submit" value="Ta bort" style="font-weight: bold" />
		</form>
	<?php } else { ?>

	<h4>Endast administratören har tillträde till den här sidan!</h4> 

<?php } ?>

Raden "Ta bort rubriken $amne" fungerar inte heller och tar inte emot värdet trots att jag har $amne längre upp i koden. Vad gör jag då åt detta?

Andra problem som också dykt upp...
Warning: Cannot modify header information - headers already sent by (output started at C:\Ex-jobb\teqla\forum\dbmanager.php:10) in C:\Ex-jobb\teqla\forum\skicka.php on line 102

Den rad som gäller är den första headern i filen skicka.php:.

if ($id == "main")
	{
		header ("Location: index.php");
	}
	else
	{
		header ("Location: svar.php?id=$id");
	}

Det är också likadant när man skriver ett svarsinlägg, då blir det den andra headern.

Trots felet ovan har jag också lagt märke till att svarsinlägg med SVAR: i ämnesraden också listas på forumets första sida. Så var det inte förut.

Medlem sedan jan. 2004216 inlägg
#25

Kanske det är konsekvensen av att ta bort apostrofer?? :(

Medlem sedan aug. 20002 975 inlägg
#26

Har du någon $_GET['amne'] ?

Denna if-sats måste vara sann för att du överhuvudtaget ska komma till koden som tar bort:

if(isset($_GET['amne'])){

Har du något värde på $id ?

Medlem sedan jan. 2004216 inlägg
#27

Har funderat och insett att det är ingen idé att använda $_GET['amne'] på tabort-sidan eftersom tabort-länken på svarssidan har istället [ <a href="tabort.php?id=<?=$id?>"><u>Ta bort</u></a> ]. Bättre att använda $_GET['id'].

Tänker kanske skriva nånting sånt här istället på tabort-sidan.

 
<?php
$msquery = "SELECT * FROM forum WHERE ref_id = '".$_GET['id']."';
$result = mssql_query($msquery, $connection);
while ($r = mssql_fetch_array($result))
{
$id = $r['id'];
$ref_id = $r['ref_id'];
$amne = $r['amne'];
}
if(!isset($_POST['tabort'])){
?>
<h5 style="font-family:Verdana">Radering av inlägg</h5>
		<p style="font-family:Verdana; font-size: 11px">Ta bort rubriken: <b><?=$amne?></b></p>
		<form action="<?=$PHP_SELF?>" method="post">
		<input type="hidden" name="id" value="<?=$id?>">
		<input type="Submit" value="Ta bort" name="tabort" style="font-weight: bold" />
		</form>
<?php }

if (isset($_POST['tabort'])){
    if ($ref_id == 0){
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		$msquery2 = "DELETE FROM forum WHERE ref_id = $id";
		mssql_query($msquery2);
		mssql_close();		
		header ("Location: index.php");
		}else{
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		mssql_close();
		header ("Location: svar.php?id=$ref_id");
    } 
} 
?>

Kanske det kan funka....

Medlem sedan jan. 2004216 inlägg
#28

Fortfarande problem med tabort-sidan. Så här ser sidan ut nu. Borttag av inlägg fungerar, liksom visning av aktuell ämne.

<?php
if(!isset($_POST['tabort'])){

	$msquery = "SELECT id, amne FROM forum WHERE id = '".$_GET['id']."'";
	$result = mssql_query($msquery,$connection);
	//echo $result;
	//echo $amne;
	while ($n = mssql_fetch_array($result))
	{
	$id = $n["id"];
	$ref_id = $n["ref_id"];
	$amne = $n["amne"];
	}
	?>
		<h5>Radering av inlägg</h5>
		<p>Ta bort rubriken: <b><?=$amne?></b></p>
		<form action="<?=$PHP_SELF?>" method="post">
		<input type="hidden" name="id" value="<?=$id?>">
		<input type="Submit" name="tabort" value="Ta bort" class="button" />
		</form>
	<?php } 
 
	if(isset($_POST['tabort'])){

	if ($ref_id == 0){
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		$msquery1 = "DELETE FROM forum WHERE ref_id = $id";
		mssql_query($msquery1);
		mssql_close();
		header ("Location: index.php");
	}else{
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		mssql_close();
		header ("Location: svar.php?id=$ref_id");
		} 
	}

På sidan får jag felmeddelandet:
Warning: Cannot modify header information - headers already sent by (output started at C:\Ex-jobb\teqla\forum\dbmanager.php:10) in C:\Ex-jobb\teqla\forum\tabort.php on line 66

Raden 66 gäller header ("Location: index.php");

Jag har också problem med att skicka ett inlägg från huvudformuläret på forumets första sida. Får då felmeddelandet:
Warning: Cannot modify header information - headers already sent by (output started at C:\Ex-jobb\teqla\forum\dbmanager.php:10) in C:\Ex-jobb\teqla\forum\skicka.php on line 105
Felet finns på sidan skicka.php i följande del:

if ($id == "main")
{
		header ("Location: index.php");
	}
	else
	{
		header ("Location: svar.php?id=$id");
	}

Raden 105 som felet finns på: header ("Location: index.php");. Samma header-problem som tabort-sidan har. Jag får också samma problem om jag skriver svarsinlägg, fast då med den andra headern efter else-satsen. "main" finns som värde i hidden-fält i huvudformuläret. Problem som också hör till är att svarsinlägg hamnar som en rad i listan på forumets första sida, inte som antal svar. Jag har tagit upp det här tidigare men fick inget svar om detta. Vet inte hur jag ska lösa det här. Finns det nån som kan hjälpa mig?

Om man bara gör ett enda litet ynka fel, då är det lätt hänt att man inte hittar tillbaka till det som fungerade förut. Det är jag inte ensam om.... eller har jag fel? :h

Medlem sedan aug. 20002 975 inlägg
#29

Före en header får man inte ha någon output till webbläsaren.
Med output menas HTML-kod, echo eller print. Även ett mellanslag eller radbrytning utanför PHP-taggarna ger ett output.

Ditt felmeddelande säger att du har output till webbläsaren på rad 10 i dbmanager.php.
Hur ser koden ut där ?

Medlem sedan jan. 2004216 inlägg
#30

Jag förstod inte ditt svar till men har kollat vad som var felet i dbmanager.php. Har inte kunnat se vad som var fel där så jag istället kopierade koden som jag lade in i tidigare inlägg. Sedan funderade forumet som det ska. Bara ett fel återstår med forumet, nämligen i själva tabort-sidan. Felmeddelandet som jag får när jag tar bort ett inlägg:
Warning: Cannot modify header information - headers already sent by (output started at C:\Ex-jobb\teqla\forum\tabort.php:33) in C:\Ex-jobb\teqla\forum\tabort.php on line 66

Samma meddelande får jag också när jag tar bort andra inlägg.
header ("Location: index.php"); finns på raden 66.

Men "tabort.php:33"? Vad menas med detta? Har inte kunnat se vad som är fel. Allt som finns där på rad 33 är <?php under body-taggen.

Medlem sedan aug. 20002 975 inlägg
#31

Som jag skrev i tidigare inlägg får du inte skicka något till en webbsida före en header.
Du får alltså inte ha någon HTML-kod före header.
Ej heller echo eller print som skickar till webbläsaren.
Även ett mellanslag eller en radbrytning utanför PHP-taggarna ger en output som skickas till webbläsaren.

Lägg därför koden som tar hand om ditt postade formulär överst på sidan innan du skickar något till webbläsaren.

Du ska alltså flytta upp följande if-sats:

if(isset($_POST['tabort'])){
.
.
.
}
Medlem sedan jan. 2004216 inlägg
#32

Det fungerar nu bra med tabort-sidan. Har lagt upp så här:

<?php
// Kollar statusen 
if($status >= 1 && isset($_SESSION['Loginname'])) {

if(isset($_POST['tabort'])){

	if ($ref_id == 0){
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery);
		$msquery1 = "DELETE FROM forum WHERE ref_id = $id";
		mssql_query($msquery1,$connection);
		mssql_close($connection);
		header ("Location: index.php");
	}else{
		$msquery = "DELETE FROM forum WHERE id = $id";
		mssql_query($msquery,$connection);
		mssql_close($connection);
		header ("Location: svar.php?id=$ref_id");		
		} 
	} 
		
	if(!isset($_POST['tabort'])){

	$msquery = "SELECT id, amne FROM forum WHERE id = '".$_GET['id']."'";
	$result = mssql_query($msquery,$connection);
	//echo $result;
	//echo $amne;
	while ($n = mssql_fetch_array($result))
	{
	$id = $n["id"];
	$ref_id = $n["ref_id"];
	$amne = $n["amne"];
	}
	?>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="../style/style_main.css">
</head>
<body bgcolor="#C2C287" text="#000000" id="all" leftmargin="10" topmargin="10" marginwidth="10" marginheight="10" link="#660000" vlink="#660000" alink="#660000">
		<h5>Radering av inlägg</h5>
		<p>Ta bort rubriken: <b><?=$amne?></b></p>
		<form action="<?=$PHP_SELF?>" method="post">
		<input type="hidden" name="id" value="<?=$id?>">
		<input type="Submit" name="tabort" value="Ta bort" class="button" />
		</form>
	<?php } 

 } else { ?>
	<h5>Endast administratören har tillträde till den här sidan!</h5> 
<?php } ?>
</body>
</html>
Medlem sedan jan. 2004216 inlägg
#33

Nåja, forumet är nästan klar, bara paging som återstår och ska snart fixas. Men innan jag går vidare, har jag lagt märke till att felmedddelandet. CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers.
dyker upp ibland när jag skickar ett nytt inlägg, svarsinlägg eller ta bort inlägg. Jag har också sökt i Webforum om andra hade samma problem med ett sådant liknande meddelande. Lade också märke till att "The headers it did return are: " saknas på slutet i mitt felmeddelande jämfört med andras problem. Jag hade förut problem med variabler som inte ska ha apostrofer men det ska jag inte ta upp igen eftersom det är löst. Det som förvånar mig att att jag fortfarande får ett sådant felmeddelande ibland, som om slumpen avgör. Beror felmeddelandet på vilken version av PHP som används? Jag fick veta av den som ansvarar för servern att PHP5 används. Det finns fortfarande en del grejer som jag inte känner till än.

Medlem sedan aug. 20002 975 inlägg
#34

Är ganska osäker på detta, men har för mig att detta kan uppstå om du använder en POST/GET-variabel som inte finns.

T.ex om du använder

if ($_POST['variabel'] == 'värde') {

Skriv då istället:

if (isset($_POST['variabel']) && $_POST['variabel'] == 'värde') {

Är som sagt osäker på detta, men värt att prova i vilket fall då du samtidigt snyggar till koden och plockar bort notiser.

Medlem sedan jan. 2004216 inlägg
#35

Jag funderar fortfarande på vad jag ska göra med POST/GET-variabler som inte finns.

En annan sak som jag har lagt märke till är datumet för startinlägg i listan på första sidan. Datumet ändras inte när ett svarsinlägg har skrivits, bara startinläggets datum gäller. Man kan bara se datumet för senaste svarsinlägg om man öppnar startinläggets länkrubrik i listan. Det är något fel med det. Vad gör man åt detta?

Medlem sedan jan. 2004216 inlägg
#36

Jag glömde att lägga in delen om datumet på första sidan i tidigare inlägg. Här är den:

		// Ladda in rader
		while($f=mssql_fetch_array($result))
		{
			$namn = $f["namn"];
			$epost = $f["epost"];
			$amne = $f["amne"];
			$text = $f["text"];
			$id = $f["id"];
			$ref_id = $f["ref_id"];
			$datum = $f["datum"];

			$raknasvar = mssql_num_rows( mssql_query("SELECT * FROM forum where ref_id = $id"));

			$dat = date('j/n H:i', strtotime($datum));

			// Varannan färg
			echo "<tr bgcolor='";
			if( $i++ % 2 == 0 ){
				echo $bg1;
			}else{
				echo $bg2;
			}
			echo "' valign=\"top\">\n";
			echo "<td><a href=\"svar.php?id=$id\"><u>$amne</u></a></td>\n";
			echo "<td>$namn</td>\n";
			echo "<td>$dat</td>\n";
			echo "<td align=\"center\">$raknasvar</td>\n";
			echo "</tr>\n";
		}

Vad kan det vara för fel med att datum för senaste svarsinlägg inte visas istället för startinläggets datum på första sidan? Jag har sökt här i forumet om liknande datumproblem men tyvärr inte kunnat hitta det. Finns det nån här som känner igen problemet?

Medlem sedan aug. 20002 975 inlägg
#37

Och hur ser SQL-frågan ut som du loopar resultatet av ?

Medlem sedan jan. 2004216 inlägg
#38

Så här ser SQL-frågan ut för att resultatet ska loopas ut.

// Med MSSQL
$query = "SELECT TOP $row_max * FROM forum WHERE id NOT IN
 (SELECT TOP $row_start id FROM forum ORDER BY datum DESC)
AND ref_id = 0 
ORDER BY datum DESC";

Jag har gjort så för att paging-funktionen ska fungera eftersom
jag inte kan använda LIMIT i frågan pga MSSQL. Den fungerar men det har väl inte med datumet att göra?

Medlem sedan aug. 20002 975 inlägg
#39

Du har "WHERE ref_id = 0". Innebär inte det att du hämtar just startinläggen ?

Borde vara något på det här hållet istället (utan paging):

$query = "
   SELECT id, MAX(datum) AS datum 
   FROM forum 
   GROUP BY id
   ORDER BY datum DESC
";
Medlem sedan jan. 2004216 inlägg
#40

Ja, startinlägg hämtas till listan när ref_id = 0. Annat värde gäller
svarsinlägg. Jag ska titta på MAX sen men paging måste iallafall
finnas med i frågan för att fungera.

274 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)