[gelöst]Problem mit $db->sql_fetchrow()

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Liwjatan
Mitglied
Beiträge: 2
Registriert: 27.03.2007 22:42

[gelöst]Problem mit $db->sql_fetchrow()

Beitrag von Liwjatan »

Hi,

ich habe folgendes Problem mit dieser Funktion, ich habe einen Code geschrieben, der ausserhalb des phpbbforums Einträge aus eben diesem anzeigen soll, um z.B. eine Newsseite aus einem Forum auszugeben.
Die Ausgabe an sich klappt auch wunderbar mit diesem Script, allerdings erscheint folgende Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in .../db/mysql4.php on line 214
Dabei handelt es sich um die Standard Datei von phpbb, die ich nicht im entferntesten angerührt habe. ^^'
Der Code, der die Funktion aufruft und auch die Ausgabe mit steuert sieht folgendermaßen aus:

Code: Alles auswählen

$sql = $db->sql_query("SELECT *
       FROM nebel_topics
       WHERE forum_id = 1 ORDER by topic_id DESC");

while($row = $db->sql_fetchrow($sql))
{
$topictitle = $row['topic_title'];
$db->sql_freeresult($sql);
	$sql = "SELECT p.post_id,  t.post_text, t.bbcode_uid
		FROM nebel_posts_text t, nebel_posts p
		WHERE p.topic_id = ".$row['topic_id']."
		AND t.post_id = p.post_id ORDER by t.post_id DESC LIMIT 1";
$result = $db->sql_query($sql);
$message = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$bbcode_uid = $message['bbcode_uid'];
$message = $message['post_text'];
Dieser Code stammt aus einer veränderten index.php, die ich teils um die Datei erweitert habe, die für den bbcode zuständig ist, sowie alle "alten" Codeschnipsel entfernt habe, um eben nur jene Newsseite anzuzeigen, und nicht die Forenübersicht, wobei ich mir recht sicher bin, dass es daran nicht liegt, da ich alle wichtigen Teile des Codes der Datei übernommen habe und auch sonst keine Fehler auftreten.

Leider bin ich als Hobbycoder da mit meinem Latein am Ende und hoffe nun, dass mir hier jemand weiterhelfen kann, warum diese Fehlermeldung auftritt.
Und wie gesagt, das, was ich als Ausgabe aus diesem Code haben möchte erscheint auch, nur leider dazu diese Fehlermeldung, was ich mir leider nicht erklären kann.

Vielen Dank schonmal!!
Zuletzt geändert von Liwjatan am 28.03.2007 17:44, insgesamt 1-mal geändert.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Ich denke es reicht, wenn du das Ergebnis der ersten Abfrage nur ein einziges mal freigibst...

Code: Alles auswählen

$db->sql_freeresult($sql); 
Dadurch dass diese Zeile in der Schleife steht wird das Ergebnis was durch die Abfrage vor der Schleife freigegeben (-> Gelöscht). Zusätzlich belegst du die Variable $sql in der Schleife mit anderem Inhalt (einem Query String). Dieser Query String ist als String natürlich keine valide Resource, daher kommt die Fehlermeldung wenn die Schleife im nächsten Durchlauf versucht darauf zuzugreifen.

Das Vorgehen wie es in der Schleife ist ist denke ich von der Variablenbelegung her eher üblich, ich würde dir empfehlen den Teil vor der Schleife zu überarbeiten. Wenn du sagst dass alles ausgegeben wird was du haben willst dann bedeutet das wohl, dass du nur ein einziges Topic ausgeben willst, somit solltest du ein LIMIT 0, 1 an das Ende der äußeren Abfrage setzen um nicht unnötig viele Daten zu holen (sonst bekommst du alle Topics in der While Schleife wenn alles richtig programmiert ist).
Also wie gesagt, die Freigabe der Daten sollte außerhalb der Schleife stehen (Logischerweise danach, ansonsten gibt's gar keine Ausgabe) und du solltest die Variablennamen der ersten Abfrage so anpassen, dass keine Konflikte mehr mit dem Schleifeninneren entstehen (auf die Art und Weise kann man auch problemlos Endlosschleifen bauen, das ist vermutlich eine der häufigsten Ursachen hierfür, doppelt in unterschiedlichem Kontext verwendete Variablen).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Du solltest die Benennung deiner Variablen überdenken:

Code: Alles auswählen

$sql = "SELECT *
       FROM nebel_topics
       WHERE forum_id = 1 ORDER by topic_id DESC";
$result = $db->sql_query($sql);

while($row = $db->sql_fetchrow($sql))
{
   $topictitle = $row['topic_title'];

   $sql = "SELECT p.post_id,  t.post_text, t.bbcode_uid
      FROM nebel_posts_text t, nebel_posts p
      WHERE p.topic_id = ".$row['topic_id']."
      AND t.post_id = p.post_id ORDER by t.post_id DESC LIMIT 1";
   $result2= $db->sql_query($sql);
   $message = $db->sql_fetchrow($result2);
   $db->sql_freeresult($result2);
   $bbcode_uid = $message['bbcode_uid'];
   $message = $message['post_text'];
}
$db->sql_freeresult($result);
Das eigentliche Problem war, dass du das Result schon in der while-Schleife freigegeben hast, es also beim nächsten Durchgang der while-Schleife nicht mehr verfügbar war. Zusätzlich hast du die Variable auch noch mit einem String neu belegt... nicht gut. :wink:

Aber zwei andere Tipps zu deinem Code:
  • Du solltest eventuelle Fehlermeldungen, die von der Datenbank kommen könnten, auch ausgeben:

    Code: Alles auswählen

    if (!$result = $db->sql_query($sql))
    {
       // Fehlerausgabe (die Fehlermeldung steht im Array, das dir von $db->sql_error() zurückgegeben wird (im Key message)
    }
    Da du auf die Fehlermeldung nicht mit einem einfachen Befehl zugreifen kannst, bietet sich eine neue Funktion (z.B. db_error()) für die Ausgabe an.
  • Da in der Themen-Tabelle die ID des letzten Beitrags gespeichert wird, kannst du das ganze auch mit einem einzigen Query abfragen und sparst dir so das eine Query pro Thema.
    z.B. könntest du das so lösen:

    Code: Alles auswählen

    SELECT t.*, p.post_id, pt.post_text, pt.bbcode_uid
    	FROM phpbb_topics t
    	INNER JOIN phpbb_posts p
    	  ON p.post_id = t.topic_last_post_id
    	INNER JOIN phpbb_posts_text pt
    		ON pt.post_id = p.post_id
    	ORDER BY t.topic_id DESC
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Liwjatan
Mitglied
Beiträge: 2
Registriert: 27.03.2007 22:42

Beitrag von Liwjatan »

Hey,

wow, danke für die Hilfe, hat geklappt :)
Und mir mal wieder gezeigt das ich mich zuwenig mit programmiermethodik usw. auseinandersetze ^^'

Vielen Dank!!
Antworten

Zurück zu „Coding & Technik“