SQL Abfrage läuft nicht optimal

Probleme bei der regulären Arbeiten mit phpBB, Fragen zu Vorgehensweisen oder Funktionsweise sowie sonstige Fragen zu phpBB im Allgemeinen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
elconde
Mitglied
Beiträge: 13
Registriert: 26.05.2004 17:09
Kontaktdaten:

SQL Abfrage läuft nicht optimal

Beitrag von elconde »

Hallo,

ich habe vor kurzer Zeit meinen Provider gewechselt und seitdem läuft das Portal nicht mehr schnell, weil eine Abfrage für die aktuellsten 5 Threads aus dem Forum das ganze ausbremst. Nun würde ich gerne wissen, wo der Fehler liegen kann, wenn es beim alten Provider ganz normal geklappt hat. Ohne die Abfrage der neusten Threads läuft das Portal (noch in der bauphase) ganz normal schnell.

Hier ist der Code für die Abfrage. Vielleicht hilft es ja. Das Forum ist auf dem neusten Stand.

Code: Alles auswählen

<?PHP
	 //forum.php
	
	 $limit=5; // Maximal angezeigte Anzahl der Threads
	 $count=1; // hier wird losgezählt
	 $topic_id=1; // der erste Thread fällt mal zum raus, um die Variable zu haben
	 $array=array();
	 $array_var="topic_id not like 1";
	 
	 // DB Connect	
	 [gelöscht]
	 
	 // Aktuelle Posts holen
	 #$get_posts=mysql_query("SELECT post_id, topic_id, forum_id, poster_id, FROM_UNIXTIME( (post_time), '%d.%m.%Y - %H:%i' ) AS datum FROM `phpbb_posts` ORDER BY post_id DESC LIMIT 1 " );
	 
	 // Spezifikation der Einträge
	 
	 while($count<=$limit){
	 	if($topic){
	 	$topic_id=$topic;
	 	$array[$count]=$topic;
	 	$array_var=$array_var." and topic_id not like ".$array[$count];
	 	}		
	// Aktuelle Posts holen
	$get_posts=mysql_query("SELECT post_id, topic_id, forum_id, poster_id, FROM_UNIXTIME( (post_time), '%d.%m.%Y - %H:%i' ) AS datum FROM `phpbb_posts` where $array_var ORDER BY post_id DESC LIMIT 1 " );
	 while($row = mysql_fetch_object($get_posts)){
	 	
	 	 $poster = $row->poster_id;
	 	 $forum = $row->forum_id;
	 	 $topic = $row->topic_id;
	 	 $linkid = $row->post_id;
	 	 $datum = $row->datum;
	 	 
	 	 // Abfrage des Poster-Name
	 	 $get_poster=mysql_query("SELECT username FROM `phpbb_users` WHERE user_id = $poster ");
	 	 $row1 = mysql_fetch_object($get_poster);
	 	 $poster_name=$row1->username;
	 	 
	 	 // Abfrage des Foren-Name
	 	 $get_forum=mysql_query("SELECT forum_name, cat_id FROM `phpbb_forums` WHERE forum_id = $forum");
	 	 $row2 = mysql_fetch_object($get_forum);
	 	 $forum_name=$row2->forum_name;
	 	 $cat_id=$row2->cat_id;
	 	 
	 	  // Abfrage der Kategorie (Hauptstudium/Grundstudium...)
	 	 $get_cat=mysql_query("SELECT cat_title FROM `phpbb_categories` WHERE cat_id = $cat_id");
	 	 $row5 = mysql_fetch_object($get_cat);
	 	 $cat_name=$row5->cat_title;
	 	 
	 	 // Abfrage des Thread-Name
	 	 $get_thread=mysql_query("SELECT topic_title FROM `phpbb_topics` WHERE topic_id = $topic");
	 	 $row3 = mysql_fetch_object($get_thread);
	 	 $Titelvar=$row3->topic_title;
	 	 
	 	 // Abfrage der Antworten für den jeweiligen Thread
	 	 $get_answer=mysql_query("SELECT topic_replies FROM `phpbb_topics` WHERE topic_id = $topic");
	 	 $row4 = mysql_fetch_object($get_answer);
	 	 $Answervar=$row4->topic_replies;
	 	 
	 	 // Abfrage, ob Beitrag von "Heute" ist...
	 	 $zwischenspeicher1 = $row->datum;
	 	 $zwischenspeicher2 = substr($zwischenspeicher1, 0, -8);
	 	 $heute = date("d.m.Y");
	 	 if ($heute == $zwischenspeicher2){
	 	 	$zwischenspeicher3 = substr($zwischenspeicher1, 10);
	 	 	$datum = "<i><b>heute</b></i>".$zwischenspeicher3;
	 	 }
	// Abfrage der Anzahl der Einträge des aktuellen Datums
	
	$get_number=mysql_query("SELECT COUNT(post_id) AS anzahl, CURDATE() AS today FROM phpbb_posts WHERE FROM_UNIXTIME(post_time, '%Y-%m-%d') = CURDATE() GROUP BY FROM_UNIXTIME(post_time, '%Y-%m-%d') " );
	$number = "Null";
	while($zeile = mysql_fetch_object($get_number)){
	$number = $zeile->anzahl;	
	} // aktuell
	
	// Abfrage der Anzahl der Einträge des Vortages
	
	$tstamp  = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
	$gestern = date("Y-m-d", $tstamp);  // ISO-8601 Format
	
	$get_number_y=mysql_query("SELECT COUNT( post_id )  AS anzahl, CURDATE(  )  AS today FROM phpbb_posts WHERE FROM_UNIXTIME( post_time,  '%Y-%m-%d'  )  = '$gestern'" );
	$number_y = "Null";
	while($zeile1 = mysql_fetch_object($get_number_y)){
	$number_y = $zeile1->anzahl;	
	} // Vortag
	
		 if (strlen($Titelvar) > 45)
		 $Titelvar = substr($Titelvar, 0, 45)."...";
	 	 
	 	 // Ausgabe in html
	 	 echo "<div id=\"start_last_entries\"><a href=\"http://www.campuszentrale.de/uni-kiel/forum/viewtopic.php?p=".$linkid."#".$linkid."\" class=\"special_link\">".$Titelvar."</a><br> 
	 	 Forum: <a href=\"http://www.campuszentrale.de/uni-kiel/forum/viewforum.php?f=".$forum."\">[".$forum_name."] </a><br>Kategorie: <b>".$cat_name."</b><br> 
	 	  am: ".$datum." von: ".$poster_name." || AW: ".$Answervar."<div id=\"linie\"></div>
	 	 </div>";
	}	

	$count++;
	}// while(count)  	
	echo "<div id=\"anzahl_beitraege\">";
	echo "Beitr&auml;ge <i><b>heute:</b></i>&nbsp&nbsp&nbsp ".$number."";
	echo "<br>Beitr&auml;ge <i><b>gestern:</b></i> ".$number_y."";
	echo "</div>";
	
	 //für das Auswahlformular
	 $morgen=mktime(0, 0, 0, date(m), date(d)+1, date(y));
	 $heute=mktime(0, 0, 0, date(m), date(d), date(y));
	 $gestern=mktime(0, 0, 0, date(m), date(d)-1, date(y));
	 $vorgestern=mktime(0, 0, 0, date(m), date(d)-2, date(y));
	 $pruefvar = "nein";
?>
	<div id="alle_beitraege">	
			<form action="index.php?section=forum_dropdown" method="post">
				<select class="dropdown_entry" name="url" onchange="this.form.submit()" >
				<option class="dropdown_entry" value="<? echo $heute ?>" selected>Alle Eintr&auml;ge anzeigen von:</option>
				<option class="dropdown_entry" value="<? echo $heute ?>">Heute</option>
				<option class="dropdown_entry" value="<? echo $gestern ?>">Gestern</option>
				<option class="dropdown_entry" value="<? echo $vorgestern ?>">Vorgestern</option>
				<option class="dropdown_entry" value="<? echo "noanswer"; ?>">UNBEANTWORTETE</option>
				</select>
			</form>
		</div>
Bin für jeden Tip dankbar!

Gruß
Alex
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Beitrag von cYbercOsmOnauT »

Ich habe Deinen Code jetzt nur überflogen, aber ich sehe da ganz schön viele Queries und frage mich, ob das wirklich so nötig ist.

Wieso nimmst net den Code von Smartors eZPortal? Der zeigt doch auch die 5 neuesten Themen an, oder habe ich da was falsches in Erinnerung? (Tip: Nimm bloß net den Code vom Intro+Portal Mod, der bremst das Board bei vielen Postings aus).

Grüße,
Tekin
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
elconde
Mitglied
Beiträge: 13
Registriert: 26.05.2004 17:09
Kontaktdaten:

Beitrag von elconde »

danke. ich habe auch schon ein paar gute mods gesehen, die ich so einsetzten kann. mein abfrage ist schon sehr schlecht (keine joins), aber es war auch das erste mysql skelett meiner coder karriere :-)
Antworten

Zurück zu „phpBB 2.0: Administration, Benutzung und Betrieb“