PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   doppelte ausgabe vermeiden: wie? (https://www.php-resource.de/forum/php-developer-forum/84832-doppelte-ausgabe-vermeiden-wie.html)

newmac 17-06-2007 14:42

doppelte ausgabe vermeiden: wie?
 
hallo zusammen
ich bossle mir einen einfachen blog zusammen; ich bin kein php-profi und muss oft lange knobeln, bis ich was erreiche. hier aber bleibe ich stecken.

problem:
- zu einem bestimmten beitrag können kommentare abgegeben werden;
- manuell "erteile" ich das ok, indem ich via db-verwaltung in der kommentartabelle die betr. id des beitrages einsetze, nämlich im kommentar.zu_id;
- danach "hängt" sich der kommentar an den beitrag;
- alles klappt bestens, nur: bei jedem kommentar erscheint der beitrag noch einmal. bei vier kommentaren erscheinen vier beiträge;

die tabellen für beiträge und tabellen habe ich also "verknüpft", aber die ausgabe ist unsauber.

ich wäre froh, wenn ich mein ziel erreichen kann, das so nahe liegt. :(
hier der code, vereinfacht

PHP-Code:

<?
$query 
SELECT beitrag.idkommentar.zu_id 
FROM beitrag
LEFT JOIN kommentar

ON beitrag
.id kommentar.zu_id

ORDER BY beitrag
.datum DESC

$result mysql_query($query); 
$num mysql_numrows($result); 

for (
$i 0$i <$num$i++) 

$row mysql_fetch_array($result); 

echo 
"beitrag"
echo 
"kommentar"
}
?>

Ich weiss, dass die Logik nicht stimmt. resp. dass das Resultat so aussehen muss (mit SELECT DISTINCT erreiche ich auch nichts). im prinzip muss ich ja die kommentare sammeln und dann an den einen beitrag hängen (mit array? aber wie?). nur: so tief geht mein wissen noch nicht.

wer kann mir das verständlich erklären?

highrise 17-06-2007 15:22

Um mal bei deiner Abfrage- und Darstellungslogik zu bleiben (sie tatsächlich nicht die optimalste ist, aber funktionieren sollte), musst du einfach die ausgabe des beitrags an eine bedingung knüpfen...

nämlich soll der beitrag nur beim ersten schleifendurchlauf ausgegeben werden, danach nicht mehr....

PHP-Code:

<?
$query 
SELECT beitrag.idkommentar.zu_id 
FROM beitrag
LEFT JOIN kommentar

ON beitrag
.id kommentar.zu_id

ORDER BY beitrag
.datum DESC

$result mysql_query($query); 
$num mysql_numrows($result); 

for (
$i 0$i <$num$i++) 

$row mysql_fetch_array($result); 

if (!
$i) echo "beitrag"
echo 
"kommentar"
}
?>

zugegeben, das ist jetzt auch nicht gerade feiner code, aber Programmierer sind ja von Natur aus faul...

was passiert: es wird nachgesehen, ob !$i (NOT $i) erfüllt ist, und nur dann wird $beitrag ausgegeben... durch den glücklichen umstand, dass eine Integer = 0 in boolscher Logik zu false evaluiert, wird die Abfrage if (!$i) genau dann erfüllt, wenn $i=0 ist ($i=0 -> false, ergo !$i -> true), was nur im ersten Schleifendurchlauf der Fall ist...

greetz, high

TobiaZ 17-06-2007 18:33

1. Query liest beitrag aus.
2. Query die Kommentare.

Fertig

newmac 18-06-2007 18:38

hallo zusammen

danke für die antwort. ich habe den (mir bisher unbekannten) if (!$i)-befehl vor der beitragsausgabe gesetzt.

jetzt zeigt es mir den ersten beitrag aus der tabelle - und dann weiter unten kommentare aus der kommentartabelle, die allerdings zu einem anderen beitrag gehören. also insofern wird schon nur ein beitrag gezeigt, allerdings auch nur einen einzigen, den ersten in der tabelle.



@Tobiaz: habe ich schon versucht. resultat: zuerst die beiträge, dann die kommentare ausgegeben. reultat: zuerst alle beiträge, dann alle kommentare.

PHP-Code:

LEFT JOIN kommentar '
ON beitrag.id = kommentar.zu_id'
ORDER BY ..... ; 

haut hier dann nicht hin, also die zuweisung eines kommentars zum jeweiligen beitrag.

:dontknow:

highrise 18-06-2007 18:49

ahh okay.. missverständnis...

um den gedanken von Tobiaz mal ausführlicher zu schreiben:

hole beiträge
while (noch ein beitrag da) {
schreibe beitrag
hole kommentrage where beitrag id= aktueller beitrag
while (noch ein kommentar da) {
schreibe kommentar
}
}

so weit verständlich?

oder aber du formulierts deine ausgabebedingung anders (mein Gedanke von vorher)... zum beispiel kannst du dir in einer hilfsvariablen merken, ob ein bestimmter beitrag schon hingeschrieben wurde... statt if (!$i) sowas wie
hole alle beiträge mit kommentaren
while (noch n ergebnis) {
if ($beitragid!=$merker) schreibe beitrag
$merker=$beitragid
schreibe kommentar
}

greetz high

TobiaZ 18-06-2007 18:54

In Blogs ist es meist üblich, dass auf der Übersicht nur die Beiträge stehen und die Kommentare erst auf wunsch, bzw. auf der Detailseite angezeigt werden.

newmac 18-06-2007 19:08

@ Tobiaz

ja, hast recht

aber neues zu probieren macht die welt abwechslungsreich, genau das wollte ich ja mit dem eigenbau. und der innere schweinehund muss überwunden werden, ich wills hinkriegen, weil ich kurz vor dem ziel bin. :rocks:

@highrise

... ansonsten könnte ich ja mal den code posten, aber zuerst versuche die neue variante.

danke euch


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:56 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG