Mailinglisten-Archive |
Hi :) Ich habe hier ein merkwuerdiges Problem mit PHP und MySQL. Seit einiger Zeit sammle ich Daten ueber die abgerufenen Artikel in einer Tabelle und fuehre darueber Abfragen aus um die Top-Artikel in bestimmten Zeitraeumen zu ermitteln und auch um Related Articles anzuzeigen. Das funktioniert, ist allerdings extrem langsam (die Tabellen haben Indizes). Ich habe eine Funktion geschrieben, die "Lesercharts" ausgibt. Die funktioniert ebenfalls, gibt allerdings seit gestern bei einem bestimmten select ein leeres Ergebnis aus (es kommt also keine Fehlermeldung, er gibt nur einfach nichts aus). Eigentlich sollte die MYSQL dabei nur 20 Zeilen ausgeben, die jeweils kaum Inhalt haben. Dafuer muessen allerdings ein paar mehr Datensaetze durchforstet werden. Momentan sind es 120000. Die einzelnen Felder, die hier im Where auftauchen, haben Indexe. Dennoch ist es ziemlich langsam. Kann es sein, dass es fuer die MySQL zu gross ist? Der Aufruf der funktioniert sieht so aus: $resultdatum = MYSQL_QUERY("select date_sub(now(),interval 90 day)"); $datum = mysql_result($resultdatum,0); lesercharts("select artikelid,count(*) as anzahl from personalize where datum > '$datum' and tabelle='stories' group by artikelid order by anzahl desc limit 0,10","10","Top-Stories","ermittelt aus den abgerufenen Stories der letzten 90 Tage","select band as band,band as titel,autor as autor,datum as datum,intro as review from stories","stories"); Der Aufruf der nicht funktioniert sieht so aus: $resultdatum = MYSQL_QUERY("select date_sub(now(),interval 7 day)"); $datum = mysql_result($resultdatum,0); lesercharts("select artikelid,count(*) as anzahl from personalize where datum > '$datum' and tabelle='cdreviews' group by artikelid order by anzahl desc limit 0,20","20","Aktuelle Lesercharts","ermittelt aus den abgerufenen CD-Reviews der letzten 7 Tage","select band as band,titel as titel,autor as autor,datum as datum,review as review from cdreviews","cdreviews"); Und hier die Funktion Insgesamt werden erst die Datensaetze aus der Personalisierungs-Tabelle ausgewaehlt und dann werden zu jedem Datensatz aus den anderen Tabellen die benoetigten Informationen zur Anzeige ausgesucht (also erst Tabelle und Artikel-ID, dann anhand dieser Informationen Interpret usw.). function lesercharts($query,$number,$tabletitle,$tablecomment,$query2,$bereich) { // query: Datenbankabfrage fuer personalize-Datenbank // number: Anzahl der Datensaetze // tabletitle: Titel fuer Tabelle // tablecomment: Kommentar fuer Tabelle // query2: Datenbankabfrage fuer Ausgabe (Titel usw. auslesen anhand der ID aus der ersten Abfrage) // band, titel, autor, datum, punkte, review stehen zur Verfuegung global $tablebordercolor; global $tablebgcolor; global $server; // Jeder Bereich verfuegt ueber eigene Dateien und Parameter. Dies wird hier festgelegt. if ($bereich=="cdreviews") { $aufruf="cdreviews.php3?was=review&id="; } else if ($bereich=="stories") { $aufruf="stories.php3?was=story&id="; } else if ($bereich=="livereviews") { $aufruf="live.php3?was=review&id="; } else if ($bereich=="forum") { $aufruf="read.php3?id="; } else if ($bereich=="portal") { $aufruf="jump.php3?id="; } ?> <center> <table border="0" cellspacing="0" cellpadding="0" width="90%"><tr><td> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="strichrot" valign="MIDDLE"><b><font face="Arial,Helvetica,sans-serif" size="3" color="#e7e7e7"><? print "$tabletitle"; ?></font></b></td> </tr> </table> </td></tr> <tr><td><br></td></tr> <tr><td bgcolor="#<? echo $tablebordercolor; ?>"> <table width="100%" border="0" cellspacing="1" cellpadding="6"> <tr bgcolor="#<? echo "$tablebgcolor"; ?>"> <td> <table width="100%"> <? print "<tr><td colspan=\"5\"><font size=\"1\" face=\"Arial,Helvetica,sans-serif\">($tablecomment)</font></td></tr>"; $result = MYSQL_QUERY($query); $checknumber = MYSQL_NUMROWS($result); if ($checknumber<20) { $number=$checknumber; } $i=0; while ($i<$number) { $artikelid = mysql_result($result,$i,"artikelid"); $resultartikel=mysql_query($query2." where id='$artikelid'"); $band = mysql_result($resultartikel,0,"band"); $band = stripslashes ($band); $band3=urlencode($band); $titel = mysql_result($resultartikel,0,"titel"); $titel = stripslashes ($titel); $autor = mysql_result($resultartikel,0,"autor"); $autor = stripslashes ($autor); $datum = datum(mysql_result($resultartikel,0,"datum")); $review = mysql_result($resultartikel,0,"review"); $review = stripslashes($review); $reviewgesamt = $review; $review=cuttext($review,150); $nummer=$i+1; print "<tr><td align=\"right\"><font size=\"2\" face=\"Arial,Helvetica,sans-serif\">$nummer</font></td>"; if ($band!=$titel || $bereich=="cdreviews") { // Bei manchen Bereichen gibt es keine Trennung zwischen Titel und Band, so dass eine Spalte weggelassen werden muss // Da bei CD-Reviews aber manchmal sowohl Titel als auch Band identisch sein koennen, muss diese Abfrage bei den CD-Reviews ausgelassen werden print "<td><font size=\"2\" face=\"Arial,Helvetica,sans-serif\"><a href=\"$server/suchen.php3?suchennach=$band3\" title=\"The Dark Portal öffnen und nach $band suchen\" target=\"_top\">$band</a></font></td>"; } print "<td><font size=\"2\" face=\"Arial,Helvetica,sans-serif\"><a href=\"$server/$aufruf$artikelid\" title=\"$band - $titel \n\n$review...\" target=\"_top\">$titel</a></font></td><td><font size=\"2\" face=\"Arial,Helvetica,sans-serif\">$datum</font></td><td><font size=\"2\" face=\"Arial,Helvetica,sans-serif\">$autor</font></td></tr>"; $i++; } ?> </table> </td> </tr> </table> </td> </tr> </table><br> <? mysql_free_result($result); mysql_free_result($resultartikel); } --- *** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive