Hur ser rad 38 och rad 40 ut ?
Problem med svarsinlägg till forum
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 →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);
Är `id` av numeriskt format får du inte ha några apostrofer/fnuttar runtom $id:
$msquery = "DELETE FROM forum WHERE id = $id";
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.
Kanske det är konsekvensen av att ta bort apostrofer?? :(
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 ?
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....
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
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 ?
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.
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'])){
.
.
.
}
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>
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.
Ä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.
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?
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?
Och hur ser SQL-frågan ut som du loopar resultatet av ?
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?
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
";
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.
