Avatar billede detziaw Nybegynder
07. april 2012 - 17:54 Der er 23 kommentarer og
1 løsning

Nyheder med kommentarer

Hej Eksperten.

Jeg har opbygget et nyhedssystem, og det hele virker bortset fra når jeg skal udskrive nyheder + dertilhørende kommentarer. Jeg har en tabel til hhv. nyheder og en til kommentarer.

Hvordan gør jeg det rent praktisk?

Jeg har prøvet med 2 query's i 2 forskellige <?php-tags, men på den måde kan jeg ikke definere min $nyhedsid i kommentarer (eller kan jeg?).

En anden mulighed kunne være at lave de 2 query's i samme <?php-tag, men der kan jeg ikke umiddelbart lige se den logiske måde at gøre det på, så måske der er nogen der kunne hjælpe mig lidt på vej?

Er det noget med, at jeg bare skal lave 2 select-querys (1 til hver tabel), definere alle variabler jeg skal bruge, og derefter echo noget lignende dette?:

<echo $overskrift>
<echo $indhold>
<mellemrum>
<echo $kommentarer>

Dog når jeg gør det på denne måde, får jeg udskrevet nyheden med kommentar nr. 1, og efterfølgende nyheden igen med kommentar nr.2.

Håber jeg har forklaret det godt nok, og på et lille fingerpeg til hvilken mulighed jeg skal bruge :-)
Avatar billede moddi100 Seniormester
07. april 2012 - 18:28 #1
Følgende virker helt fint så længde det blot er i samme fil:
<?php
$id = 34;

// Hent information fra db
?>
Noget html her
<?php
echo $id; // Giver 34, da det huskes så længde det er på samme side

// Hent noget mere fra databasen
?>
07. april 2012 - 18:37 #2
Hvor har du de tabeller?  Er det i en mysql database?  I så fald skal du efter al sandsynlighed lave en query der joiner de to tabeller.  Hvordan ved du hvilke kommentarer der hører til hvilke nyheder?  Er det således, at kommentar tabellen har et felt der hedder, for eksempel, nyhed, og hvor der for hver kommentar står id'en for den nyhed kommentaren hører til?  I så fald kunne en join query blive noget i retning af:

$result = mysql_query("SELECT n.*, k.* FROM nyheder n JOIN kommentarer k ON n.id = k.nyhed");

Så skulle du i $result få alle nyheder og for hver nyhed de tilhørende kommentarer.  Så kunne det gå det videre med

while($row = mysql_fetch_array)
{
  $overskrift = $row['overskrift'];
  $indhold = $row['indhold'];
  ....

  echo $overskrift . " - " . $indhold....
}

Af mangel på konkrete oplysninger i spørgsmålet er dette blot en skitse i retning af mulige løsninger.
Avatar billede detziaw Nybegynder
07. april 2012 - 18:44 #3
Hmm det fungerer ikke rigtig. Min kode ser sådan her ud: (Har undladt det der ikke hører til)
<?php
$query = mysql_query("SELECT * FROM haxball_nyheder ORDER BY id DESC");
while($row = mysql_fetch_assoc($query))
$nyhedsid = $row['id'];
?>
Her vises nyheden
<?php
$query2 = "SELECT * FROM kommentarer WHERE nyhedsid='$nyhedsid' ORDER BY id";
$resultat = mysql_query($query2) or die("MySQL ERROR: ".mysql_error());
while($row = mysql_fetch_array($resultat))
$variabler
?>
Her skulle kommentarerne vises, men det gør de ikke.
Avatar billede moddi100 Seniormester
07. april 2012 - 18:51 #4
Min fejl, misforstod spørgsmålet :)

Kan du uddybe hvordan stykket "$variabler" ser ud? Og hvad sker der hvis du siger:
while($row = mysql_fetch_array($resultat))
{
echo "<pre>";
var_dump($row);
echo "</pre>";
}
Avatar billede detziaw Nybegynder
07. april 2012 - 18:57 #5
$variabler ser således ud:
$id = ($row[id]);
$brugernavn = stripslashes($row[brugernavn]);
$kommentar = stripslashes($row[kommentar]);
$dato = ($row[dato]);

mht. var_dump - hvis jeg sætter det før variablerne udskriver den fint mine divs, men ikke mine variabler.

Hvis jeg sætter det efter variablerne udskriver den ingenting.
Avatar billede moddi100 Seniormester
07. april 2012 - 19:05 #6
Og hvis du udskriver disse variabler inden i løkken, hvad får du så? Husk også at anvende tuborgklammer { } rundt om så det ikke bare er en enkelt løkke som udskrives:

while($row = mysql_fetch_array($resultat))
{
  $id = ($row["id"]);
  $brugernavn = stripslashes($row["brugernavn"]);
  $kommentar = stripslashes($row["kommentar"]);
  $dato = ($row["dato"]);

  echo "Brugernavn: " . $brugernavn;
}


Btw: Husk at bruge quotes når henviser til en værdi i et array:
$brugernavn = stripslashes($row["brugernavn"]);
Avatar billede detziaw Nybegynder
07. april 2012 - 19:34 #7
Hmm så udskriver den fint mine divs med brugernavn+dato, men ikke id+kommentar :-S
Avatar billede detziaw Nybegynder
07. april 2012 - 19:35 #8
Og kun ét stk. Dvs den udskriver ikke alle kommentarer (der er 5 i databasen).
Avatar billede detziaw Nybegynder
07. april 2012 - 19:37 #9
Smider lige hele koden (visnyheder.php)

<?php
session_start();
// Starter fremvisning af nyheder.
include("config.php");

setlocale(LC_ALL,'da_DK.UTF-8');

$query = mysql_query("SELECT * FROM haxball_nyheder ORDER BY id DESC");
while($row = mysql_fetch_array($query))
{
$overskrift = stripslashes($row[overskrift]);
$nyhed = stripslashes($row[nyhed]);
$brugernavn = $row[brugernavn];
$dato = $row['dato'];
$nyhedsid = $row['id'];
?>
<div id="overskrift"><?php echo "$overskrift" ?></div>
<div id="indhold"><?php echo "$nyhed" ?><br><br>
Skrevet af <b><?php echo "$brugernavn" ?></b> - <i><?php echo "$dato" ?></i>
</div>
<?
}
?>
<?php
session_start();
include("config.php");
setlocale(LC_ALL,'da_DK.UTF-8');

$nyhedsid = $row['id'];

$query2 = "SELECT * FROM kommentarer WHERE nyhedsid='$nyhedsid' ORDER BY id";
$resultat = mysql_query($query2) or die("MySQL ERROR: ".mysql_error());
while($row = mysql_fetch_array($resultat))
{
  $id = ($row["id"]);
  $brugernavn = stripslashes($row["brugernavn"]);
  $kommentar = stripslashes($row["kommentar"]);
  $dato = ($row["dato"]);

echo "<pre>";
var_dump($row);
echo "</pre>";
}
?>
<div id="kommentarer">
    <div id="bruger"><div id="navn">#<?php echo "$id" ?> - <?php echo "$brugernavn"; ?><?php include('admin_kontrol.php'); ?></div><div id="dato"><?php echo "$dato" ?></div></div>
    <div id="kommentar"><?php echo "$kommentar" ?></div><br>
    <?php include('kommentar-kontrol.php'); ?><br>
</div>
Avatar billede moddi100 Seniormester
07. april 2012 - 19:44 #10
Vi deler det lige op i et par bidder. Som jeg skrev i mit første indlæg kan du sagtens dele variabler imellem forskellige <?php-blokke.
Faktisk er følgende to løsninger identiske:
<?php

$var = 'text';

// noget mere php code
?>

<p>Dette er ikke php</p>

<?php

echo "Variabel: " . $var;

?>


<?php

$var = 'text';

// noget mere php code


echo "<p>Dette er ikke php</p>";

echo "Variabel: " . $var;

?>


Du behøver altså ikke at have følgende stykke 2 gange:
session_start();
include("config.php");
setlocale(LC_ALL,'da_DK.UTF-8');


Grunden til at den ikke fungerer i bunden er, at div-koden er uden for løkken. Den skal i stedet for udskrives hver gang:
[div]while($row = mysql_fetch_array($resultat))
{
  $id = ($row["id"]);
  $brugernavn = stripslashes($row["brugernavn"]);
  $kommentar = stripslashes($row["kommentar"]);
  $dato = ($row["dato"]);


?>
<div id="kommentarer">
    <div id="bruger"><div id="navn">#<?php echo "$id" ?> - <?php echo "$brugernavn"; ?><?php include('admin_kontrol.php'); ?></div><div id="dato"><?php echo "$dato" ?></div></div>
    <div id="kommentar"><?php echo "$kommentar" ?></div><br>
    <?php include('kommentar-kontrol.php'); ?><br>
</div>
<?php
}
?>
Avatar billede detziaw Nybegynder
07. april 2012 - 19:53 #11
Hmm er "[div]while.." en tastefejl, eller noget jeg skal have med?

Jeg har nu gjort som du har beskrevet, og nu udskriver den slet ikke noget.
Avatar billede moddi100 Seniormester
07. april 2012 - 19:58 #12
Ja det skulle bare have været "while". Det andet har noget med udskrivning her på eksperten at gøre. Får du ingen fejl?

while($row = mysql_fetch_array($resultat))
{
  $id = ($row["id"]);
  $brugernavn = stripslashes($row["brugernavn"]);
  $kommentar = stripslashes($row["kommentar"]);
  $dato = ($row["dato"]);


?>
<div id="kommentarer">
    <div id="bruger"><div id="navn">#<?php echo "$id" ?> - <?php echo "$brugernavn"; ?><?php include('admin_kontrol.php'); ?></div><div id="dato"><?php echo "$dato" ?></div></div>
    <div id="kommentar"><?php echo "$kommentar" ?></div><br>
    <?php include('kommentar-kontrol.php'); ?><br>
</div>
<?php
}
Avatar billede detziaw Nybegynder
07. april 2012 - 20:00 #13
Ahh okay :-)

Jeg har copy/pastet den kode du har skrevet, og der bliver ikke udskrevet noget - heller ikke fejl. :-(

I mine andre forsøg har den kunne udskrive kommentarerne rigtigt :-S
Avatar billede moddi100 Seniormester
07. april 2012 - 20:53 #14
Nu ved jeg ikke hvordan dine filer admin_kontrol.php og kommentar-kontrol.php ser ud. Men hvis du definerer nogle funktioner vil det kunne give fejlen. Prøv lige denne for en god ordens skyld, selvom at den så ikke viser det helt korrekt:

while($row = mysql_fetch_array($resultat))
{
  $id = ($row["id"]);
  $brugernavn = stripslashes($row["brugernavn"]);
  $kommentar = stripslashes($row["kommentar"]);
  $dato = ($row["dato"]);


?>
<div id="kommentarer">
    <div id="bruger"><div id="navn">#<?php echo "$id" ?> - <?php echo "$brugernavn"; ?><?php include_once('admin_kontrol.php'); ?></div><div id="dato"><?php echo "$dato" ?></div></div>
    <div id="kommentar"><?php echo "$kommentar" ?></div><br>
    <?php include_once('kommentar-kontrol.php'); ?><br>
</div>
<?php
}
Avatar billede detziaw Nybegynder
07. april 2012 - 20:58 #15
Den viser heller intet med ovenstående script.

Det skulle bare lyde meget mærkeligt hvis fejlen ligger i de filer, da jeg jo har haft fået den til at udskrive kommentarerne korrekt, bare med nyheden der blev udskrevet 1 gang for hver kommentar.
Avatar billede moddi100 Seniormester
07. april 2012 - 21:01 #16
Hvis du bare erstatter det med:
while($row = mysql_fetch_array($resultat))
{
  $id = ($row["id"]);
  $brugernavn = stripslashes($row["brugernavn"]);
  $kommentar = stripslashes($row["kommentar"]);
  $dato = ($row["dato"]);

echo $kommentar;
}


Virker det så?
Avatar billede detziaw Nybegynder
07. april 2012 - 21:12 #17
Fik det ENDELIG til at virke. Nedenstående kode gør præcis hvad jeg beder om:

<?php
session_start();
// Starter fremvisning af nyheder.
include("config.php");

setlocale(LC_ALL,'da_DK.UTF-8');

$query = mysql_query("SELECT * FROM haxball_nyheder ORDER BY id DESC");
while($row = mysql_fetch_array($query))
{
$overskrift = stripslashes($row[overskrift]);
$nyhed = stripslashes($row[nyhed]);
$brugernavn = $row[brugernavn];
$dato = $row['dato'];
$nyhedsid = $row['id'];
?>
<div id="overskrift"><?php echo "$overskrift" ?></div>
<div id="indhold"><?php echo "$nyhed" ?><br><br>
Skrevet af <b><?php echo "$brugernavn" ?></b> - <i><?php echo "$dato" ?></i>
</div>
<div id="kommentarer">
<?php
$query2 = mysql_query("SELECT * FROM kommentarer WHERE nyhedsid=$nyhedsid ORDER BY id");
while($data = mysql_fetch_array($query2))
{
$id = ($data["id"]);
$brugernavn = stripslashes($data["brugernavn"]);
$kommentar = stripslashes($data["kommentar"]);
$dato = ($data["dato"]);
?>
    <div id="bruger"><div id="navn">#<?php echo "$id" ?> - <?php echo "$brugernavn"; ?><?php include_once('admin_kontrol.php'); ?></div><div id="dato"><?php echo "$dato" ?></div></div>
    <div id="kommentar"><?php echo "$kommentar" ?></div><br>
<?php
}
?>
<?php include('kommentar-kontrol.php'); ?><br>
</div>
<?php
}
?>
Avatar billede detziaw Nybegynder
07. april 2012 - 21:13 #18
Hov det var den uopdaterede, dog virker den hvis blot man skifter include_once til include :-)

Hvis du smider et svar, så takker jeg for hjælpen og din tid :-)
Avatar billede detziaw Nybegynder
07. april 2012 - 21:26 #19
Hov lige et ekstra spørgsmål. Du sagde at variabler virker så længe det er i samme fil. Hvad så hvis jeg includer en fil, regnes det så for samme fil?
Som man kan se i min kode ovenover, har jeg en "kommentar-kontrol.php" hvori jeg includer en "tilfoejkommentar.sql". Når jeg så bruger variablen $nyhedsid som jeg har brugt i min visnyheder.php udskriver den intet. Hvordan gør jeg her?
Avatar billede moddi100 Seniormester
07. april 2012 - 23:51 #20
Hvis du i denne fil som udskriver definere en variabel kan du godt tilgå den i de efterfølgende filer ja:

nyheder.php
<?php
$nyhedsid = 3;
include("kommentar-kontrol.php");
?>


kommentar-kontrol.php
<?php
echo $nyhedsid; // Udskriver tallet 3
?>


Ovenstående virker som sagt. Det virker også med filer du includer() i kommentar-kontrol.php.

Dog skal du være opmærksom på, at hvis en fil skal køres som php, skal den have filtypen ".php". Ellers skal du kigge på funktionen file_get_contents() som returnerer indholdet af en fil. Det er sandsynligvis det som er dit problem.
Avatar billede detziaw Nybegynder
08. april 2012 - 00:08 #21
Hmm lyder godt nok underligt, for alle mine filer er i .php, men den returnerer ikke det jeg gerne vil have.

I min visnyheder.php kan jeg fint bruge $nyhedsid så den udskriver "7" sammen med resten af nyheden, men i min kommentar_sql.php udskriver den intet når jeg echo'er $nyhedsid. Hvordan kan det være?
Avatar billede detziaw Nybegynder
08. april 2012 - 01:08 #22
Aaargh det er da mig der sejler helt rundt i det. Jeg prøvede at bruge variablen i kommentar_sql.php. Det er filen jeg bruger til denne funktion: <form action="kommentar_sql.php"> i min tilfoejkommentar.php.

Mit spørgsmål er nu bare, hvordan går jeg så variablen tilføjet i min form? Jeg har prøvet med et hidden input-felt således:

<input type="hidden" value="$nyhedsid" name="nyhedsid" />

og så i min kommentar_sql.php:

$nyhedsid = $_POST['nyhedsid'];

Det virker dog ikke. Hvordan får jeg min variabel med i action-filen?
Avatar billede detziaw Nybegynder
08. april 2012 - 01:16 #23
Det er vidst ved at være meeeeeget sent ;-)
<input type="hidden" value="$nyhedsid" name="nyhedsid" />

Ændres til:
<input type="hidden" value="<?php echo $nyhedsid; ?>" name="nyhedsid" />

Og så virker det :-)

Giver points og så går den vidst i glemmebogen ;-)
Avatar billede moddi100 Seniormester
08. april 2012 - 12:23 #24
Godt du fandt ud af det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester