Verbetering php script

Status
Niet open voor verdere reacties.

sanma

Gebruiker
Lid geworden
11 dec 2008
Berichten
170
Hallo,

Ik gebruik het onderstaande scriptje voor advertenties op te halen die nog niet door de gebruiker getoond zijn, dit werkt opzich goed maar ik heb het idee dat dit veel makkelijker kan. Er staan vaak meer dan 100 advertenties dus de query wordt hiermee erg lang (NOT IN(1,2,3,4,5,6 etc)).

Ik zou graag weten of dit beter/sneller kan, ik heb gehoord met gebruik van JOIN maar hier kom ik met dit voorbeeld niet echt aan uit.

PHP:
	$array = array();

	$geklikt = mysql_query("
								SELECT
									id1
								FROM
									advertentiekliks
								WHERE
									gebruikersnaam = '".mysql_real_escape_string($userdata['username'])."'
							");

	while($row = mysql_fetch_assoc($geklikt))
	{

		$array[] = $row['id1'];

	}

	$query = mysql_query("
							SELECT
                                id
							FROM
                                advertenties
							WHERE
								kliks > 0
                            AND
								id NOT IN(".implode(", ", $array).")
	                	");

	$advertentieinfo= mysql_fetch_assoc($query);
 
Bekijk dit eens
paginator
PHP:
<?php 
 // Connects to your Database 
 mysql_connect("your.hostaddress.com", "username", "password") or die(mysql_error()); 
 mysql_select_db("address") or die(mysql_error()); 
  //This checks to see if there is a page number. If not, it will set it to page 1 
 if (!(isset($pagenum)))  { 
 $pagenum = 1; 
 } 
  //Here we count the number of results 
 //Edit $data to be your query 
 $data = mysql_query("SELECT * FROM topsites") or die(mysql_error()); 
 $rows = mysql_num_rows($data); 
  //This is the number of results displayed per page 
 $page_rows = 4; 
  //This tells us the page number of our last page 
 $last = ceil($rows/$page_rows); 
 //this makes sure the page number isn't below one, or more than our maximum pages 
 if ($pagenum < 1)  { 
 $pagenum = 1; 
 }  elseif ($pagenum > $last)  { 
 $pagenum = $last; 
 } 
 //This sets the range to display in our query 
 $max = 'limit ' .($pagenum - 1) * $page_rows .',' .$page_rows;
 
sorry van vorige post net niet juist genoeg

dit zal al beter zijn maar correct ? niet getest
PHP:
<?php

$array = array();
    $geklikt = mysql_query("SELECT  id1 "+ //De query van jou was met een linebreak dus kwam er /n bij 
                           " FROM advertentiekliks"+
                           " WHERE gebruikersnaam = '".mysql_real_escape_string($userdata['username'])."'");
    while($row = mysql_fetch_assoc($geklikt)){
        $array[] = $row['id1'];
    }

    $query = mysql_query(   "SELECT id "+
                            "FROM advertenties "+
                            "WHERE kliks > 0  AND  id NOT IN(".implode(", ", $array).")");
    $advertentieinfo= mysql_fetch_assoc($query);

?>
 
Hallo,

Bedankt voor het reageren, de eerste oplossing is echter een heel ander script en de tweede is exact hetzelfde als mijn huidige oplossing.

De bedoeling is vervolgens dat door een while lus de advertenties onder elkaar komen te staan die dus niet voorkomen in advertentiekliks van die gebruiker.
 
als je let op de commentaar regel zie je dat mogelijks uw query het hierdoor niet doet.
Bij mijn weten zijn enters niet toegelaten. het kan opgelost zijn door de tijd maar dat kan ik niet bevestigen
 
Hallo,

Dat is niet het probleem, het script werkt goed maar ik heb het idee dat het heel omslachtig is, dus ik zoek een manier om deze query te optimaliseren zodat deze sneller kan.
 
Zoiets dan? Test maar even in phpmyadmin oid met een explain ervoor. Moet je even kijken of er goed gebruik gemaakt wordt van keys e.d.
Code:
SELECT	a.id
FROM	advertenties a
LEFT JOIN advertentiekliks k
	ON	k.id1 = a.id
	AND	k.gebruikersnaam = ?
WHERE	a.kliks > 0
	AND	k.id1 IS NULL
 
Heel erg bedankt thadin dit is een super verbetering!

Ik heb de explain gedaan dan krijg ik dit, ik ben benieuwd of ik nog andere indexen moet aanmaken of het zo goed is:

tabel a, type = ALL, possible_keys = NULL, key_len = NULL
tabel k, type = ref, possible_keys = gebruikersnaam_id1, key_len = NULL

tabel a, ref = NULL rows = 6997, Using where
tabel k, ref = const,website.a.id rows = 10, Using where; Using index; Not exists


Alvast heel erg bedankt weer!
 
Wellicht een key maken van advertentiekliks.gebruikersnaam

Maar het is sowieso beter om op IDs te koppelen, aangezien een naam nog wel eens wil veranderen en ints fijner zijn om mee te werken.
Dus dan zou je een kolom gebruiker_id in advertentiekliks plaatsen en daar een key van maken, het liefst ook nog een foreign key (innodb)
 
Het aantal kliks is behoorlijk groot en zodra ik het script vervang met deze krijg ik al snel een error: mysql too many connections.

Hij verwerkt het wel maar het lijkt alsof dit langzamer is dan het oude "script"
 
Zoals ik al aangaf; de oude situatie maakte gebruik van keys, deze niet.

Dus je kunt je database proberen te normaliseren (wat sowieso goed is om te doen) en anders de oude versie blijven gebruiken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan