Newsindex zu viele SQL-Anfragen

Hilfe zu Modulen und Tags
Post Reply
lokbase

Newsindex zu viele SQL-Anfragen

Post by lokbase »

Hi,
ich habe jetzt eine Website umgesetzt, in der auch ein Newsindex verwendet wird. Das ganze läuft über ein Template welches extern angelegt ist. Derzeit erhalte ich bei jedem Aufruf 79 SQL-Anfragen was ich etwas viel finde für die Ausgabe von Datum, Titel, Teaser und Link.

Mein Code im Template findet Ihr im nachfolgenden. Eingebunden ist die News mit einem Tag in einer normalen Seite, die ohne News, also nur Text lediglich 7 SQL Anfragen benötigt.

Kann ich das noch optimieren. Wie gesagt sonst habe ich 7 SQL-Anfragen.

Liebe Grüße
Matthias

Code: Select all

<!-- ::: Pressemitteilungen ::: -->
<div>
<table style="width:560px;">
{foreach from=$items item=entry}

<tr>
<td width="80" valign="top" style="padding:4px; color:#006BB5; font-weight:bold;">{$entry->formatpostdate}</td>
<td valign="top" style="padding:4px">
<strong>{eval var=$entry->title}</strong> 
{if $entry->summary}
{eval var=$entry->summary} 
{/if}
<br />
<strong>{$entry->morelink}</strong>
</td>
</tr>
<tr>
<td colspan="2" style="background: repeat-x url(images/strich_trenner_lang.gif);">
</td>
</tr>
{/foreach}
<tr>
<td colspan="2">
<a href="#seitenstart"><img src="./uploads/Grafiken/press_topback.gif" border="0" align="right"></a>
</td>
</tr>
</table>
</div>
<!-- ::: ENDE Pressemitteilungen ::: -->
Piratos

Re: Newsindex zu viele SQL-Anfragen

Post by Piratos »

Templates selbst sind nicht in der Lage irgend etwas aktiv zu machen - können somit also auch keine SQL - Queries auslösen.

Setz doch mal einen Link zum ansehen.
evoluzzer
Forum Members
Forum Members
Posts: 27
Joined: Thu May 19, 2005 9:11 pm

Re: Newsindex zu viele SQL-Anfragen

Post by evoluzzer »

Hi zusammen,

die Erfahrung habe ich auch gemacht mit Seiten auf den die ganzen News pro Kategorie aufgelistet werden d.h. sind 78 News vorhanden, sind 78 + die normal üblichen SQL-Anfragen die Folge. Also extrem viel. Der Punkt steht bei mir auf der Todo-Liste, die Frage ist nur wann komme ich dazu....

Gruss
Chris
evoluzzer
Forum Members
Forum Members
Posts: 27
Joined: Thu May 19, 2005 9:11 pm

Re: Newsindex zu viele SQL-Anfragen

Post by evoluzzer »

Hi,

wenn ich mal den Debugmodus anschalte und mir die SQL-Abfragen bei der NewsListeseiten anschaue, bekomme ich anscheinend zu jedem Newsentry diese Abfrage:

Code: Select all

(mysql): SELECT username, password, active, first_name, last_name, admin_access, email FROM cms_users WHERE user_id = '4'
Error (0):

(mysql): SELECT username, password, active, first_name, last_name, admin_access, email FROM cms_users WHERE user_id = '2'
Error (0):

(mysql): SELECT username, password, active, first_name, last_name, admin_access, email FROM cms_users WHERE user_id = '6'
Error (0):

(mysql): SELECT username, password, active, first_name, last_name, admin_access, email FROM cms_users WHERE user_id = '6'
Error (0): 
usw.....

Das sieht mir hier nach einem Fehler im Newsmodul aus. Mal weiterforschen....

gruß
Chris
Piratos

Re: Newsindex zu viele SQL-Anfragen

Post by Piratos »

Diese Abfrage gibt es nur in der class.user.inc.php (function LoadUserByID($id) )und nicht im News Module.

Allerdings wird die Funktion in News action.default.php tatsächlich bei jedem Datensatz aufgerufen
NUR um den Usernamen zu erhalten.

Diese Zeilen ändern von:

$theuser = UserOperations::LoadUserById( $row['author_id'] );
$onerow->author_id = $row['author_id'];
$onerow->author = $theuser->username;

Nach:

$onerow->author_id = $row['author_id'];
$onerow->author = 'Irgendetwas';

Ein Fehler im Sinne eines Fehlers ist es nicht, bloss schlecht durchdacht.
Piratos

Re: Newsindex zu viele SQL-Anfragen

Post by Piratos »

Wenn man nicht auf den Usernamen verzichten will, dann ändert man das so:

Code: Select all

 if ($dbresult)
        {
          $au_id=array();
          $au_n=array();
          $userresult = $db->Execute('SELECT user_id, username FROM '. cms_db_prefix() .'users');
          while ($userresult && $row = $userresult->FetchRow())
          {$au_id[] = $row['user_id'];$au_n[] = $row['username'];}
        }
		while ($dbresult && $row = $dbresult->FetchRow())
		{
			$onerow = new stdClass();
            $k1= array_search ( $row['author_id'],$au_id);
            $username=$au_n[$k1];
			//$theuser = UserOperations::LoadUserById( $row['author_id'] );
			$onerow->author_id = $row['author_id'];
			//$onerow->author = $theuser->username;
			$onerow->author = $username;
usw. usw.
Das bedeutet 1 Query für die User insgesamt und nicht pro Datensatz.
Piratos

Re: Newsindex zu viele SQL-Anfragen

Post by Piratos »

Und wenn man nun alles auf einen Schlag haben will dann macht man folgende Änderung (kein einziger zusätzlicher Query für den ollen Usernamen)

Code: Select all

if (isset($params["category"]) && $params["category"] != '')
		{
			$categories = explode(',', $params['category']);
			$query = "SELECT mn.* , mnc.news_category_name, u.user_id, u.username FROM " . cms_db_prefix() . "module_news mn, " . cms_db_prefix() . "module_news_categories mnc, " . cms_db_prefix() . "users u WHERE mnc.news_category_id = mn.news_category_id  AND STATUS = 'published'  AND u.user_id = mn.author_id  AND(";
			$count = 0;
			foreach ($categories as $onecat)
			{
				if ($count > 0)
				{
					$query .= ' OR ';
				}
				if (strpos($onecat, '|') !== FALSE || strpos($onecat, '*') !== FALSE)
					$query .= "upper(mnc.long_name) like upper('" . trim(str_replace('*', '%', $onecat)) . "')";
				else
					$query .= "mnc.news_category_name = '" . trim($onecat) . "'";
				$count++;
			}
			$query .= ") AND ";
		}
		else
			$query = "SELECT mn.* , mnc.news_category_name, u.user_id, u.username FROM " . cms_db_prefix() . "module_news mn, " . cms_db_prefix() . "module_news_categories mnc, " . cms_db_prefix() . "users u WHERE mnc.news_category_id = mn.news_category_id  AND STATUS = 'published'  AND u.user_id = mn.author_id  AND ";

		$query .= "(".$db->IfNull('start_time',"'".$db->DBTimeStamp(1)."'")." < '".$db->DBTimeStamp(time())."') ";
		$query .= " AND ((".$db->IfNull('end_time',"'".$db->DBTimeStamp(1)."'")." = '".$db->DBTimeStamp(1)."') OR (end_time > '".$db->DBTimeStamp(time())."')) ";

		if (isset($params['sortby'])) 
		{ 
			$query .= "ORDER BY '" . str_replace("'", '', str_replace(';', '', $params['sortby'])) . "' "; 
		} 
		else 
		{ 
			$query .= "ORDER BY news_date "; 
		} 

		if (isset($params["sortasc"]) && ($params['sortasc'] == 1 || $params['sortasc'] == 'true' || $params['sortasc'] == 'True')) 
		{ 
			$query .= "asc"; 
		} 
		else 
		{ 
			$query .= "desc"; 
		}
		
		$dbresult = '';
		$number = -1;
		if( isset( $params['number'] ) )
		{
			$number = $params['number'];
		}

		$start = -1;
		if( isset( $params['start'] ) )
		{
			$start = $params['start'];
		}

		if( $start >= 0 || $number >= 0 )
		{
			$dbresult =& $db->SelectLimit($query, $number, $start);
		}
		else
		{
			$dbresult =& $db->Execute($query);
		}

		while ($dbresult && $row = $dbresult->FetchRow())
		{
			$onerow = new stdClass();
			$onerow->author_id = $row['author_id'];
			$onerow->author = $row['username'];

usw. usw.
		
Post Reply

Return to “Module und Tags”