Se till att du får en SQL-fråga som plockar fram de rätta inläggen för dig.
Pagingen kan du lägga till sedan.
Problem med svarsinlägg till forum
56 svar · 1 091 visningar · startad av addeweb · sida 3 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 →Tror jag ska skriva så här:
$query = "
SELECT TOP $row_max id, amne, namn, ref_id, MAX(datum) AS datum FROM forum GROUP BY id WHERE id NOT IN
(SELECT TOP $row_start id FROM forum ORDER BY datum DESC)
AND ref_id = 0 ORDER BY datum DESC
";
Om det fungerar, det får jag se senare.
Så länge du har med "ref_id = 0" kommer du endast att få med startinlägg.
Ja, men om man inte har ref_id = 0, då listas också rader med svarsinlägg på första sidan och det är inte meningen att det ska bli så. Det är bara datumet som ska uppdateras med svarsinlägg.
Har jag fattat rätt att du menar om man använder ref_id = 0, då får man bara datumet som startinlägget har??
Jag har fått några felmeddelanden med sql-frågan:
$query = "SELECT TOP $row_max id, amne, namn, ref_id, MAX(datum) AS datum FROM forum GROUP BY id WHERE id NOT IN
(SELECT TOP $row_start id FROM forum ORDER BY datum DESC)
AND ref_id = 0 ORDER BY datum DESC
";
*Warning: mssql_query(): message: Incorrect syntax near the keyword 'WHERE'. (severity 15) in C:\Ex-jobb\teqla\forum\index.php on line 150
Warning: mssql_query(): message: Incorrect syntax near the keyword 'ORDER'. (severity 15) in C:\Ex-jobb\teqla\forum\index.php on line 150
Warning: mssql_query(): Query failed in C:\Ex-jobb\teqla\forum\index.php on line 150
Warning: mssql_fetch_array(): supplied argument is not a valid MS SQL-result resource in C:\Ex-jobb\teqla\forum\index.php on line 178*
Rad 150: $result = mssql_query($query, $connection);
Rad 178: while($f=mssql_fetch_array($result))
addeweb skrev:
Har jag fattat rätt att du menar om man använder ref_id = 0, då får man bara datumet som startinlägget har??
Ja.
Sen får du felmeddelande på dina SQL-frågor eftersom du har GROUP BY före WHERE.
Har lagt en ny sql-fråga:
$query = "SELECT TOP $row_max id, amne, namn, MAX(datum) AS datum FROM forum WHERE id NOT IN
(SELECT TOP $row_start id FROM forum ORDER BY datum DESC) AND ref_id = 0 GROUP BY id, amne,
namn ORDER BY datum DESC
";
Men fortfarande kan man inte se svarsinläggets datum i listan istället för startinläggets datum.
Har även provat utan ref_id = 0 i frågan genom att skriva ett
svarsinlägg men då får man en ny rad i listan med ämnet "SVAR: fafafa". Det går inte utan ref_id
i frågan om man inte vill ha svarsinlägg som ämnesrubrik i listan.
Nu är jag kass på avancerade SQL-uttryck, och har dessutom endast arbetat mot MySQL, så det finns säkert bra mycket bättre sätt att lösa det på, och jag är långt ifrån säker på att det kommer att fungera.
Testa det här, och lägg till pagingen om du får det att fungera:
$query = "
SELECT f1.id, f1.amne, f1.namn, MAX(f2.datum) AS datum
FROM forum f1
LEFT JOIN forum f2 ON f1.id = f2.id
WHERE f1.ref_id = 0
GROUP BY f1.id, f1.amne, f1.namn
ORDER BY datum DESC
";
Ok, jag ska testa det men det får bli på lördag. Har sett att du har lagt in LEFT JOIN. Trodde att man skulle joina två tabeller men det behövdes inte. Att joina en och samma tabell var nytt för mig. Jag återkommer sen och berättar om hur det har gått. Tack för tipset.
Har under lördagen testat sql-frågan:
$query = "
SELECT f1.id, f1.amne, f1.namn, MAX(f2.datum) AS datum
FROM forum AS f1
LEFT JOIN forum AS f2 ON f1.id = f2.id
WHERE f1.ref_id = 0
GROUP BY f1.id, f1.amne, f1.namn
ORDER BY datum DESC
";
Men det är fortfarande problem med datumet. Det uppdateras inte med senaste svarsinlägg. Något felmeddelande har jag inte fått heller.
Har även testat en version med paging i:
$query = "
SELECT TOP $row_max f1.id, f1.amne, f1.namn, MAX(f2.datum) AS datum
FROM forum AS f1
LEFT JOIN forum AS f2
ON f1.id = f2.id
WHERE f1.ref_id = 0 AND f1.id NOT IN
(SELECT TOP $row_start f1.id FROM forum ORDER BY datum DESC)
GROUP BY f1.id, f1.amne, f1.namn
ORDER BY datum DESC
";
Pagingen fungerar i versionen ovan men om man klickar på sidlänken [2] för nästa sida får man då istället ett vanligt meddelande "Det finns inga inlägg i forumet ännu" men det är inte viktigt just nu. Viktigare är att få datumet att fungera som det ska.
Matte skrev:
Ä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 antar att man gör så för att register globals är satt till off?
Har lagt in en annan tråd om tabortsidan och fick därför frågan om register globals.
Gjorde det någon skillnad med denna typ av ändringar ?
Formuläret på forumets första sida har två hidden-fält.
<input type="hidden" name="id" value="main" />
<input type="hidden" name="ref_id" value="0" />
Kanske man måste lägga in POST-variabler för dessa.
På svarsidan har jag t ex:
<?php
if (empty($id))
{
header ("Location: index.php");
}
if (isset($svar)){
.... satser....
}
// Det gick inte med empty att jag fick ta den övre raden.
if($epost == " "){
//if (empty($epost)){
}else{
....satser....
}
// Här är delar som finns ovan svarsformuläret.
//if(isset($_POST['svar']) && $_POST['svar'] == 0){
if ($svar == 0){
// formulär
}?>
På sådana ställen måste jag väl ändra.
Och sql-frågorna med variabeln på slutet t ex raden:
$msquery = "SELECT * FROM forum WHERE id = $id";
Kanske måste jag ändra till '{$_POST['id']}'
Vad tycks?
Använd $_POST['svar'], $_POST['epost'] o.s.v. också.
Jag får nog låta det där datumproblemet vila en vecka eller två. Kanske någon lösning hittas sen eller jag får skippa det där med att uppdatera datum med senaste inlägg.
Borttaget. Har ändrat mig. Måste fundera vidare.
Jag har funderat över forumet och svårigheterna med det. Det har tyvärr inte blivit så bra, bl a pagingen som krånglar, dvs de nedersta raderna finns även på nästa sida om man klickar på nästa sidlänk. Och datumet som inte uppdaterades med senaste svarsinlägg.
Kanske bättre ta bort pagingen för att istället göra om forumet lite och enklare som att placera en formulär-länk Skriv ett inlägg ovan listan. På svarssidan kan man också placera en formulär-länk Skriv ett svar på inlägget ovan startinlägget med svarsinlägg under. Utan paging skulle det bli en lång lista att det är bättre med länk överst än ett formulär nere på sidan.
Och så kan jag också lägga en kolumn till för Senaste i listan på första sidan. Att ha två olika datum-kolumner i listan, startdatum och senaste svarsdatum, verkar bättre och enklare, tror jag. Har kollat exempel som fungerar så, t.ex startinlägg som inte har något svarsinlägg än har en tom plats för datumet tills någon svarar. Det blir till att göra två olika while-satser.
Tack för all hjälp!
