• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP&MYSQL] Abfrage Problem (mit einer php Variable/String)

a_fooo

New member
Hallo Leute!
Ich arbeite zur Zeit an meinem News+Kommentar Script. 85% der Arbeit hab ich schon erledigt.
Bei der Ausgabe der Anzahl der Kommentare gibt noch ein Problem. Die Ausgabe der Daten erfolgt mittels einer
W H I L E -SChleife, in dem noch mit einer F O R - Schleife die Anzahl der Kommentare gezählt und
ausgegeben wird.
Obwohl ich z.B. beim 1.News-Artikel zwei Kommentare geschrieben habe zeigt es bei allen News Artikeln 2 Kommentare an.
Der Script ist fehlerfrei. Ich weiß nicht wo der Hund liegt. Bin auf eure Hilfe angewießen, ansonsten kann ich
den rest wegschmeisen.

Die Idee (DB)
-----------------------------------------------------------
TABELLE B L O G
--- ------- ----------- ------- --------
|id | datum | kategorie | titel | inhalt |
---|-------|-----------|-------|--------|
1 ... ... ... ...
2 ... ... ... ...
.
.

-----------------------------------------------------------
TABLLE B L O G _ C O M M E N T S
--- -------- ------ -------- -------
|id | blogID | name | inhalt | datum |
---|--------|------ --------|-------|
1 1 ... ... ...
2 1 ... ... ...
3 2 ... ... ...
4 3 ... ... ...
5 3 ... ... ...
.
.
-----------------------------------------------------------


Hier die listing:
PHP:
<?php



//body
echo "<body>\n";


	//SQL-Befehle
	$abfrage = "SELECT	id, kategorie, titel, inhalt, DATE_FORMAT(`datum`,'%d.%m.%Y - %H:%i') AS datum 
				FROM	blog
				ORDER BY datum DESC";
					
	$ergebnis = mysql_query($abfrage);
	
	//SQL-Schleife (Ausagabe)
	while($row=mysql_fetch_object($ergebnis))
		{
			echo "		<div class=\"box\">\n";
			echo "			<!-- überschrift -->\n";
			echo "			<div class=\"ueb\">\n";
			echo "				<span class=\"bas\">";echo $row->titel; echo " </span>\n";
			echo "			</div>\n";
			echo "			\n";
			echo "			<div class=\"tar\">\n";
			echo "				<span class=\"dat\">"; echo $row->datum; echo " // "; echo $row->kategorie; echo "</span>\n";
			echo "			</div>\n";
			echo "			\n";
			echo "			<!-- text -->\n";
			echo "			<div class=\"tex\">\n";
			echo "				<span class=\"nor\">";echo $row->inhalt; echo "</span>\n";
			echo "			</div>\n";
			
			
			echo $row->id; //Test-> id Ausgabe
		
			
			
		
			
					
			//Anzahl der Kommentare {SCHLEIFE	
			$zahl=1;
			
			for($i=0;$i<$zahl;$i++)
		
				{ 								  
					
						 $zaehlen = " SELECT count(blogID) AS blogID, id 
						 FROM blog_comments
						 GROUP BY blogID"; 
			
						$summe = mysql_query($zaehlen);
					
						$row=mysql_fetch_object($summe);
			
					echo $row->blogID;
				echo "			<!-- komment -->\n";
				echo "			<div class=\"bot\">\n";
				echo "				<span class=\"unt\">"; 
										//LINK
										echo"<a href=\"javascript:popup();\">"; echo $row->blogID; 
											echo" Kommentare</span>\n"; echo"</a>\n";
				echo "			</div>\n";
				echo "			\n";
				echo "		</div>\n";
				}
		}

	echo "</body>\n";
	echo "</html>\n";


	//Schluss	
	error_reporting(E_ALL);
	mysql_error();
	
	mysql_close();

?>


Für jeden Hinweis bin ich dankbar.

mfg
a_fooo
 
wozu deine for-schleife da ist, ist mir schleierhaft, die läuft eh immer nur einmal.
und der fehler liegt in deiner sql query, die muss eher so aussehen:
SELECT count(blogID) AS blogID FROM blog_comments WHERE blogID = $row->id
 
SQL-Abfragen in Schleifen sollten dich aufschrecken lassen. Das ist sehr unperformant, weil die Abfrage jedesmal optimiert werden muss und diesem Fall auch jedes Datum mehrmals angefasst werden muss obwohl man da mit einmal durch kommen kann.

SELECT blog.id, kategorie, blog.titel, inhalt, DATE_FORMAT(`blog.datum`,'%d.%m.%Y - %H:%i') AS datum, count(blogID) AS count_blogId, blog_comments.id
FROM blog JOIN blog_comments ON(blog.id=blog_comments.blogid)
GROUP BY blog.id";
 
Es funktioniert nicht, weil die zweite SQL-Abfrage eine Variable enthält.

PHP:
	$abfrage = "SELECT	blog.id, blog.kategorie, blog.titel, blog.inhalt, DATE_FORMAT(`blog.datum`,'%d.%m.%Y - %H:%i') AS datum, 					
							count(blogID) AS blogID, blog_comments.id
				FROM 		blog INNER JOIN blog_comments ON(blog.id=blog_comments.blogID)
				WHERE 		blog_comments.blogID = $row->id";

Folgende Fehler treten dabei auf:

Notice: Undefined variable: row in C:\...\test_ausgabe.php on line 51

Notice: Trying to get property of non-object in C:\...\test_ausgabe.php on line 51

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\...\test_ausgabe.php on line 56
 
Die WHERE-Abfrage ist überflüssig, diese Abfrage übernimmt das Join. Gib mal die Abfrage im PHPMyAdmin oder so ein und schau dir das Ergebnis an.
 
PHP:
	$abfrage = "SELECT    blog.id, blog.kategorie, blog.titel, blog.inhalt, DATE_FORMAT(`blog.datum`,'%d.%m.%Y - %H:%i') AS datum,
                            count(blogID) AS blogID, blog_comments.id
                FROM         blog INNER JOIN blog_comments ON(blog.id=blog_comments.blogID) 
				ORDER BY datum DESC";

Fehler:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\...\test_ausgabe.php on line 56
 
PHP:
	$abfrage = "SELECT    b.id, b.kategorie, b.titel, b.inhalt, b.datum,
                            count(bc.blogID) AS blogID
                FROM         blog AS b, blog_comments AS bc 
				WHERE		b.id = bc.blogID 
				GROUP BY bc.blogID
				ORDER BY b.datum DESC
				";

oder

PHP:
	$abfrage = "SELECT    b.id, b.kategorie, b.titel, b.inhalt, b.datum,
                            count(bc.blogID) AS blogID
                FROM         blog AS b, blog_comments AS bc 
				WHERE		b.id = bc.id
				GROUP BY bc.blogID
				ORDER BY b.datum DESC
				";

Die Abfragen zeigen die Einträge mit 0 Kommentaren nicht an. Das Datum werde ich mit PHP formatieren, denn ansonsten geht es gar nicht. MySQL weiß dann nicht, von welcher Tabelle es ablesen soll, obwohl ich die Tabelle zugewiesen habe.
Mit LIKE und BETWEEN ... AND Befehlen hab ich es versucht - ging nicht.

Ich bin für jeden Hinweis dankbar!!!

mfg
a_fooo
 
Die Abfragen zeigen die Einträge mit 0 Kommentaren nicht an.
Das liegt daran, dass Du keinen left join sondern einen cross join verwendest.
Du solltest Deine SQL Abfragen mal in phpMyAdmin austesten und ein bißchen damit rumspielen. Ein bißchen Schmökern in SQL Büchern/Manuals schadet auch nicht.
 
Also ich würd etwas so in der art machen:

HTML:
SELECT blog.id, blog.kategorie, blog.titel, blog.inhalt, DATE_FORMAT(`blog.datum`,'%d.%m.%Y - %H:%i') AS f_datum,
count(blog_comments.blogID) AS comments_count
FROM blog LEFT JOIN blog_comments ON blog.id=blog_comments.blogID
ORDER BY datum DESC
GROUP BY blog_comments.blogID
 
PHP:
	$abfrage = "SELECT	blog.id, blog.kategorie, blog.titel, blog.inhalt, DATE_FORMAT(`blog.datum`,'%d.%m.%Y - %H:%i') AS f_datum, 
				count(blog_comments.blogID) AS comments_count
				FROM blog LEFT JOIN blog_comments ON blog.id=blog_comments.blogID
				GROUP BY blog_comments.blogID
				ORDER BY datum DESC
				";

Die Einträge mit 0 Kommentaren werden angezeigt. Aber das Datum nicht. Fehler: Unknown column 'blog.datum' in 'field list'

Ich habe verschiedene Varianten versucht, leider ohne Erfolg. Das Problem mit mySQL zu lösen wäre schon praktisch.

Hat jemand noch einen Hinweis?

Wenn es anderst nicht geht, dann werde ich es eben mit PHP formatieren müssen...

mfg
a_fooo
 
das geht auch nicht :sad:

Fehler: Column 'datum' in order clause is ambiguous
Könnte das vielleicht daran liegen, dass die Spalte "datum" in beiden Tabellen vorhanden ist und MySQL so nicht weiß, welche von beiden zum Sortieren hergenommen werden soll?

Schmeiß endlich den phpMyAdmin an und probier mal ein bißchen selbst herum! Notfalls hilft auch ein Internet-Suche locker weiter.
 
Die Spalte >datum< ist in den beiden Tabellen vorhanden. Weißt du überhaupt wie lange ich täglich daran sitze???
 
Die Spalte >datum< ist in den beiden Tabellen vorhanden.
Schön, dass wir hier Konsens haben.

Weißt du überhaupt wie lange ich täglich daran sitze???
Offenbar nicht lange genug.

Merkwürdig ist auf jeden Fall, dass Du es immer irgendwie schaffst Teile aus den Abfragen rausfallen zu lassen, die in vorherigen Versionen drinne waren. Das scheint Dich aber gar nicht zu stören und löst auch anscheinend kein Grübeln bei Dir aus.
Lies ein Buch über SQL, damit Du die Mechanismen und Logik hinter SQL begreifst, weil mir kommt es vor als stocherst Du nur so rum.
 
Zurück
Oben