Abfrage und Darstellung mehrerer Tabellen

kosovafan

Erfahrenes Mitglied
Hallo,


ich bin gerade dabei meinen Blog um eine Kommentarfunktion zu erweitern. Nach ein wenig lesen sollte man für mehrere Tabellen wohl JOIN nutzen, damit aber etwas dargestellt wird auch wenn in einer Tabelle nichts vorhanden ist sollte man LEFT JOIN nutzen. Das habe ich jetzt gemacht, er zeigt mir aber nur das Formular zum eintragen der Kommentare.

Habt Ihr hier Anlaufstellen? Nach was ich suchen sollte?

Der Code:
PHP:
<?php
error_reporting(E_ALL);
require_once "inc/include.html";
$id = ((!empty($_GET['id'])) ? $_GET['id'] : '' );

$sql = "SELECT
    entrys.id,
	entrys.date,
	entrys.autor,
	entrys.title,
	entrys.content,
	entrys.bild,
	comments.blogid,
	comments.inhalt,
	comments.date,
	comments.name,
	comments.email
FROM
	entrys
LEFT JOIN
	comments
	comments ON
	entrys.id = comments.blogid
WHERE id=".(int)$id;

$result = $DB->query($sql);

while($row = mysqli_fetch_array($result))
{
echo "<div class=\"blogentry\">";
echo "<ul>";
echo "<li><img src=\"img/content/calendar.gif\" alt=\"\" /> von ".$row['autor']." am ".$row['date']." Uhr</li>";
echo "<li><img class=\"fr\" src=\"".$row['bild']."\" alt=\"\" /></li>";
echo "<li><h1>".$row['title']."</h1></li>";
echo "<li>".$row['content']."</li>";
echo "</ul>";
echo "</div>";

echo "<div class=\"comments\">";
echo "<ul>";
echo "<li>Eintrag von ".$row['name']." am ".$row['date']." </li>";
echo "<li>".$row['inhalt']."</li>";
echo "</ul>";
echo "</div>";
}
?>

Vielen Dank für eure Tipps. Schönen Tag wünsche ich.


MFG
Silvio
 
Ich frage mich gerade, warum du da keine SQL-Fehlermeldung bekommst:
Code:
# vorher:
LEFT JOIN
    comments
    comments ON
    entrys.id = comments.blogid

# nachher
LEFT JOIN
    comments ON
    entrys.id = comments.blogid
 
Ich frage mich gerade, warum du da keine SQL-Fehlermeldung bekommst:
Weil das 2te comments als Alias zur Tabelle comments intepretiert wird

Die folgenden 3 Zeilen bewirken alle dasselbe (solange der Alias gleich dem Tabellenname ist)
SQL:
FROM comments
FROM comments comments
FROM comments AS comments
 
Zuletzt bearbeitet von einem Moderator:
In deinem Beispielcode seh ich kein "Formular"....
Noch dazu prüfst du die Variable $id zwar, aber wenn $_GET['id'] leer ist, dann lässt du sie leer und übergibst sie deiner Query. Hier würde ich die DB-Abfrage nur ausführen wenn auch $id nicht leer ist.

Und als nächsten vielleicht zum eigentlich Problem:
Du verwendest zwar den Join, das ist schon richtig.
Nur kann dort kein Kommentar ausgelesen werden, du frägst nämlich nach dem Eintrag und nicht nach dem Kommentar ab.
Da nur ein Eintrag mit der id=$id besteht, wird auch nur eine Zeile aus der DB ausgelesen.
 
Zuletzt bearbeitet:
Hallo,

vielen Dank für die vielen Antworten. Vielen Dank.

@Maniac_81

Du verwirrst mich leicht? Wenn ich dich richtig verstehe, dann müsste ich erst prüfen ob $_GET['id'] größer ist als 0?

Beim zweiten Absatz von dir fehlt mir jetzt wirklich das umzusetzen als Gedanke. Die Tabelle entrys hat nur die ID, weil dort jede Zeile einen Eintrag darstellt, in der comments Tabelle ist blogid = ID von der entrys Tabelle. Soweit der Plan, was du jetzt meinst verstehe ich jetzt nicht ganz. Ich hatte erst Join genutzt, danach hatte ich gelesen das man Left Join nutzen sollte, falls Comments nicht geschrieben sind würde trotzdem der Blog Eintrag dargestellt. Der Blogeintrag wird aber im Moment auch nicht angezeigt, nur eben das Formular was im nächsten Div Container als reines HTML steht.

Könntest du das näher erklären. Ich weiß mag Basic sein, Basic lernt man aber am besten mit Verständnis und eventuellen Beispielen. Bücher, Tutorials die ich so kenne erklären die wirklichen Basics aber nicht mehr. Würde mich freuen.

Vielen Dank.


MFG
Silvio
 
Hallo,

@Maniac_81
Okay das verstehe ich jetzt. Er wendet die ID nur einmal an. Kann man den nicht zwei SELECT Anfragen in einem PHP Script machen? Oder sollte man den Kommentar Bereich in eine externe Idee packen und dann includen?

Ich habe mir mal ein paar Blog Scripts angesehen, Code lesen bildet ein wenig, nur sind die alle so komplex das man Wochen benötigt um dort wirklich hinter zu kommen.

MFG
Silvio
 
Wird denn überhaupt eine ID übergeben?
Der Blog-Entry wird ja nur angezeigt wenn auch $_GET['id'] nicht leer ist.
entry wird erst in der While-Schleife angezeigt, wenn natürlich keine id übergeben wird an den Query,
kann auch nichts aus der Datenbank ausgelesen werden und die Schleife wird nicht ausgeführt, normalerweise sollte hier aber ein Fehler kommen.

PHP:
var_dump($_GET['id']);
 
Hallo,

mmh es stimmt tatsächlich etwas nicht. Ich habe die Testseite mal auf den Server geladen, zu erreichen unter http://www.silviosiefke.de/ss.

Also die Datenbank wird mit der richtigen ID ausgelesen, aber er zeigt nichts an.

Code:
110429 13:18:41	   24 Connect	root@localhost on bloggen
		   24 Query	SELECT id, DATE_FORMAT(date,'%d.%m.%Y, %H:%I') as date, 
title, content FROM 'entrys' WHERE id=2
		   24 Quit

Code:
110429 13:20:46	   26 Connect	root@localhost on bloggen
		   26 Query	SELECT id, DATE_FORMAT(date,'%d.%m.%Y, %H:%I') as date, 
title, content FROM 'entrys' WHERE id=1
		   26 Quit

In der PHP Error Log habe ich nur den Eintrag:

Code:
[29-Apr-2011 13:20:46] PHP Warning:  mysqli_fetch_array() expects parameter 1 to be 
mysqli_result, boolean given in C:\nginx\html\ss\blogdetail.html on line 57

Die Source:
Übersicht: http://www.silviosiefke.de/ss/bloggen.txt
Detail: http://www.silviosiefke.de/ss/blogdetail.txt

Ich wollte das jetzt mit den einzelnen Tabellen machen, damit ich mal irgendwann die Einträge nicht manuell in die Datenbank eintragen muss, sondern das mit Hilfe eines Formulares machen kann und weil Kommentare mit eingebaut werden sollten.


MFG
Silvio
 
Mach mal
Code:
SELECT id, DATE_FORMAT(date,'%d.%m.%Y, %H:%I') as date, 
title, content FROM `entrys` WHERE id=1

anstatt:
Code:
SELECT id, DATE_FORMAT(date,'%d.%m.%Y, %H:%I') as date, 
title, content FROM 'entrys' WHERE id=1

Du ahst nämlich anstatt ` ein ' verwendet.
 
Hallo,

oh habe ich geändert. Jetzt gibt er nicht einmal mehr die Übersicht (bloggen.html).

Code:
2011/04/29 13:54:20 [error] 99850#0: *552 FastCGI sent in stderr: "PHP Warning:  
mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in 
/usr/local/www/vserver/silviosiefke.de/data/ss/bloggen.html on line 54


PHP Fatal error:  Call to a member function close() on a non-object in 
/usr/local/www/vserver/silviosiefke.de/data/ss/bloggen.html on line 65" while reading response 
header from upstream, client: 178.1.102.205, server: silviosiefke.de, request: "GET /ss/bloggen.html 
HTTP/1.1", upstream: "fastcgi://127.0.0.1:9002", host: "silviosiefke.de", referrer: 
"http://silviosiefke.de/ss/ich.html"

Mmh Mysql ist schon irgendwie schwer, oder mein IQ ist doch zu klein.

Silvio
 
Zurück