Eigenes Forum & MySQL Klasse

Lobedan

Mitglied
Hi Leute,

ich brauche wieder eure Hilfe und Entschuldigung das ich euch immer so belästige :-)

Also wie der der Titel schon sagt hab ich ein Problem das mit meiner MySQL Klasse und dem Forum was ich geschrieben hab zusammenhängt.

Es sollte so sein das erst die Kategorie dann die Forum und wieder die Kategorie und so weiter im Schema:

---Kategorie
------Forum 1
------Forum 2

---Kategorie 2
------Forum 1 in Kat. 2
------Forum 2 in Kat 2.

angezeigt werden sollen.
Nur mein Script hört irgentwie bei der 1. Kategorie und den dazugehörigen Foren auf.

Ich kann schonmal mit Sicherheit sagen das es sich ums mysql_fetch_array dreht aber mehr weiß ich auch nicht.
Vielleicht hat ja jemand von euch eine Idee =)

Das sind mal die Zeilen fürs mysql_fetch_array in der Klasse. Ich finds nicht so relevant weil es ja bei den andern Scripten von mir auch geht aber es kann janicht schaden :p

PHP:
//::::: fetch array ::::: 
    function ar($query = 0) 
    { 
        if ($query == 0) 
        { 
            if (@$this->result = mysql_fetch_array($this->query)) 
            { 
                return $this->result; 
            } 
        } 
        else 
        { 
            if (@$this->result = mysql_fetch_array($query)) 
            { 
                return $this->result; 
            } 
        } 
    }

Das sind die relevanten Zeilen im Forum Script

PHP:
	$select_forum_kat = $db->query("SELECT * FROM kategorie ORDER BY id ASC");

	while ($kat = $db->ar($select_forum_kat)) {

		$select_forum_board = $db->query("SELECT * FROM forum WHERE katid='".$kat['id']."' ORDER BY id ASC");

		$inhalt.='
			<table class="main" align="center">
				<tr>
					<td class="oben" colspan="5"><b>'.$kat['name'].'</td>
				</tr>';

		for ($i=0; $i < $db->num_rows($select_forum_board); $i++) {

		$forum = $db->ar($select_forum_board);

			if (($i%'2')  == '0') {
			    $class = "g";
			} else {
			    $class = "w";
			}

		$select_forum_last_thread = $db->query("SELECT * FROM post WHERE katid='".$kat['id']."' AND forumid='".$forum['id']."' ORDER BY id DESC LIMIT 1");

		$thread = $db->ar($query_forum_last_thread);

		$select_forum_count_posts = $db->query("SELECT COUNT(*) AS anzahl FROM post WHERE katid='".$kat['id']."' AND forumid='".$forum['id']."'");

		$posts = $db->ar($query_forum_count_posts);

		$select_forum_count_threads = $db->query("SELECT COUNT(*) AS anzahl FROM thread WHERE katid='".$kat['id']."' AND forumid='".$forum['id']."'");

		$count = $db->ar($query_forum_count_threads);

Danach kommt nur noch HTML Zeug also nichts was so damit zu tun hätte

Ich hoffe ihr könnt mir helfen

grüßle ;)
 
Wie ist die Tabelle / Datenbank aufgebaut?

Und noch etwas: Aua!
PHP:
if (($i%'2')  == '0')

PHP kratzt es nicht, aber habt ihr in der Schule auch mit Texten gerechnet? ;) zod + iac = XP

Zahlen dürfen verwenden:
PHP:
if (($i % 2)  == 0)
 
Also die Tabellen sind in 4 Teile geteilt
1. Teil ist Kategorie, 2. die einzelnen Foren, 3 die Threads und 4. die Posts die jeweils durch IDs verbunden sind

also so:

Code:
CREATE TABLE IF NOT EXISTS `forum` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `katid` int(11) NOT NULL,
  `name` varchar(250) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`)
);


CREATE TABLE IF NOT EXISTS `kategorie` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `katid` int(11) NOT NULL,
  `forumid` int(11) NOT NULL,
  `threadid` int(11) NOT NULL,
  `name` varchar(250) NOT NULL,
  `username` varchar(250) NOT NULL,
  `datum` date NOT NULL,
  `zeit` time NOT NULL,
  `ip` varchar(250) NOT NULL,
  `nachricht` longtext NOT NULL,
  PRIMARY KEY (`id`)
) ;


CREATE TABLE IF NOT EXISTS `thread` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `katid` int(11) NOT NULL,
  `forumid` int(11) NOT NULL,
  `name` varchar(250) NOT NULL,
  `username` varchar(250) NOT NULL,
  `views` int(11) NOT NULL,
  `datum` date NOT NULL,
  `zeit` time NOT NULL,
  PRIMARY KEY (`id`)
);

Ich finde es relativ leicht zu handhaben auch wenns mehr Tabellen sind und so weit ichs gesehn hab benutzt woltlab auch diese Struktur ;)
 
Wieso soll des damit nicht möglich sein?

Es hat ja schonmal funktioniert bis ich die Klasse in meine Seite eingefügt hab also IST es schonmal möglich. Es ist nicht gerad die eleganteste aber denk ich doch die naheliegenste Variante
 
So wie Splash habe ich auch gedacht und deswegen nach dem Tabellenaufbau gefragt.

Alleine in dem Query "ORDER BY id ASC" zu nehmen ist doppelt Problematisch:
  • Die Liste ist nicht zwingend nach Datum oder lexikalisch sortiert
  • Ist der Eintrag ID=7 ein Unterpunkt von ID=10 (wurde verschoben etc.), so wird dieser nicht oder doppelt angezeigt.

Und ohne Rekursion hier zu arbeiten begrenzt die Tiefe auf 2 Ebenen. Über diese 3 Dinge bitte ich dich einmal nachzudenken.

Nochmal was zur Performance:
PHP:
for ($i=0; $i < $db->num_rows($select_forum_board); $i++) {
ist bedeutend langsamer als
PHP:
$sup = $db->num_rows($select_forum_board);
for ($i=0; $i < $sup; $i++) {

Warum es bei der neuen Klasse abbricht, kann daran liegen das $this->return eventuell als Zeiger / Referenz zurückgegeben wird. Eine zugewiesene Variable hat also bei dem nächsten Query auch dessen Ressource-ID.

Für Laien: Der vorherige Query wurde durch den neuen ersetzt.

Ein var_dump() auf eine zugewiesene Variable könnte das vielleicht zeigen.
Es wäre demnach besser die Rückgabe von mysql_query direkt zurück zu geben.
 
Alleine in dem Query "ORDER BY id ASC" zu nehmen ist doppelt Problematisch:
  • Die Liste ist nicht zwingend nach Datum oder lexikalisch sortiert
  • Ist der Eintrag ID=7 ein Unterpunkt von ID=10 (wurde verschoben etc.), so wird dieser nicht oder doppelt angezeigt.

Die Liste soll nach id geordnet sein weil die im Adminbereich auch nach ID eingegeben werden. Ist es überhaupt möglich die ID=7 NACH ID=10 zu setzen wenn auto_increment = on ist

Warum es bei der neuen Klasse abbricht, kann daran liegen das $this->return eventuell als Zeiger / Referenz zurückgegeben wird. Eine zugewiesene Variable hat also bei dem nächsten Query auch dessen Ressource-ID.

Für Laien: Der vorherige Query wurde durch den neuen ersetzt.

Ein var_dump() auf eine zugewiesene Variable könnte das vielleicht zeigen.
Es wäre demnach besser die Rückgabe von mysql_query direkt zurück zu geben.

var_dump() zeigt mit nur die Daten die auch wirklich ausgegeben werden also nichts interessantes. Gibt es eine möglichkeit die Query funktion so abzuändern das die Ressource-ID danach nicht mehr existiert oder wird dadurch der "Ablauf" der Funktionen "beschädigt".

Schau dir mal die 2 Schemen an. Dann wirste schnell feststellen das du in der Tabelle Kategorie mehr spalten brauchst als nur id und name.

Mfg Splasch

Ja soweit ha bich das schon gesehen nur versteh ich dieses Nested Sets nicht. Hast du ein gutes Tutorial gerad so perat?

gruß
 
Ist es überhaupt möglich die ID=7 NACH ID=10 zu setzen wenn auto_increment = on ist

Um das setzen der ID ging es nicht. Es ging um die Baumstruktur, welche sich ändern kann, wie bereits genannt.

var_dump() zeigt mit nur die Daten die auch wirklich ausgegeben werden also nichts interessantes.

var_dump() sollte auf die zurückgegebene Resource angewandt werden um die Referenz zu prüfen. Erfordert höhere Programmier-Kenntnisse.

Gibt es eine möglichkeit die Query funktion so abzuändern das die Ressource-ID danach nicht mehr existiert oder wird dadurch der "Ablauf" der Funktionen "beschädigt".

Ja, denn genau das höchstwahrscheinlich ist der Grund. Wie ebenfalls schon gesagt soll mysql_query() direkt der Rückgabewert sein ohne ihn vorher in einer Objektvariablen zwischen zu speichern. Eventuell ist der Fehler damit behoben.



Ja soweit ha bich das schon gesehen nur versteh ich dieses Nested Sets nicht. Hast du ein gutes Tutorial gerad so perat?

Verwende NestedSet nur bei kleinen Datenmengen oder bei Datenmengen, die sich fast nie ändern, da jede Operation innerhalb des NestedSet mehr Performance kostet als bei einem "normalen" Modell.

btw: Wie heißt das Modell mit den einfachen Spalten (ID, parent, data)?
 
Zurück