not in et optimisation

Invité
Invité n'ayant pas de compte PHPfrance

20 déc. 2006, 16:31

bonjour

Explication du code

Memochoix
si 0 : on affiche pas les liens deja cliques
si 1: on affiche tous les liens mais les liens deja cliques sont affiches avec une mention 'deja cliques.'

Ce qu on recupere du champs LiensClicker sont les id des liens et est du type :-4000-15-12-18 (etc etc)
la premiere occurence par defaut est -4000 sinon le not in plante lorsque LiensCliquer est egal a zero.

On converti les tirets en virgules pour correspondre a la syntaxe de not in ().

if (isset($_SESSION['PseudoMemb'])&& isset($_SESSION['MemoChoix']))
 {
		if ($_SESSION['MemoChoix']=='0')
		{
			$Affichage ="0";
			$ReqZ = "SELECT * FROM membresparametres WHERE IdMemb=".$_SESSION['IdMemb']."";
			$CurZ = mysql_query($ReqZ);
			$BddIdZ = mysql_result($CurZ,0,"liensCliques");
 
			$N = explode ("-",$BddIdZ);
			$A = count($IdZ);
 
			$IdZ = preg_replace ("`-`", ",", "$BddIdZ");
			$IdZZ = substr($IdZ,1);
  
			$ReqC = "SELECT * FROM annu WHERE IdConc NOT IN($IdZZ) AND" . $Cond . $_POST['Order'] .$Order ;
		}
		else
		{
			$Affichage ="1";
			$ReqC = "SELECT * FROM annu " . $Cond . $_POST['Order'] .$Order ;	
		}
 
 $CursC = mysql_query($ReqC);
 $NbS = mysql_numrows($CursC);
 $NbLigne = 3;
 }
2 questions :
1)Peut o optimiser le code?
2)j aurai aime un aide pour construire la requete ou la mention deja clique s affiche.

merci pour vos reponses ! :D

Si vous avez des idees! :P

Invité
Invité n'ayant pas de compte PHPfrance

20 déc. 2006, 17:08

ok j ai trouve enfin
ca se passait dans la boucle p:
$i=0;	
if ($NbS>0) {

   if ($_POST['Page']!="")$Page=$_POST['Page'] ;

   
   if ($Page=="") $Page=0;
   $i = ($Page * $NbLigne);      
   $iMax = ($Page+1) * $NbLigne;
   while (($i < $NbS) AND ($i < $iMax))
{	
    $IdCliques= mysql_result($CursC, $i, "IdCliques");

	// si affichge =1 on compare les id pour afficher deja cliquer
	if($Affichage ="1")
	{
	// $N = explode ("-",$BddIdZ);
	// $A = count($IdZ);
	
	preg_match("-$IdCliques-", $BddIdZ, $matches);
	print_r($matches);
	}

etcetc
sinon est ce qu on peut optmisier tout ca !!! :P

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 déc. 2006, 17:13

Oh bah pour optimiser on peut faire plein de chose, mais le mieux serait peut être de revoir la structure de ta base pour avoir une table des id liens cliqués par utilisateur (ce qui permettrait d'obtenir le résultat souhaité en une seule requête) plutôt qu'un champ de données concaténées dont on ne peut rien faire... :)

Quoi qu'il en soit, voici quelques remarques en vrac ;)

- Je ne vois pas l'intérêt de la variable $Affichage ? (qui n'est en l'occurence pas utilisée dans cette partie du code) Pour la partie ou elle est potentiellement utilisée le test sur la session n'est il pas suffisant ?

- Liste tes champs : au lieu de "SELECT * FROM" fais un "SELECT liensCliques FROM". S'il n'y a qu'un champ dont la valeur t'interesse, il est inutile de ramener les autres (et c'est mieux de se débarasser de cette habitude de mettre un "SELECT *" qui ne permet pas de savoir sous quelle forme et dans quel ordre les données sont renvoyées :))

- $N = explode ("-",$BddIdZ); // pas utilisé => pas d'intérêt

- $A = count($IdZ); // pas utilisé, à supprimer ou au contraire à prendre en compte pour gérer le fait qu'il n'y ait pas d'élément (et donc ne pas mettre la condition NOT IN) ou s'il n'y en a qu'un (et avoir une simple condition "!=")

- AND" . $Cond // d'où vient cette valeur ? $_GET ? $_POST ?

- .$Order // même question, si pas de valeur = pas d'intérêt :)

- enfin, tu dois pouvoir simplifier le code en "factorisant" ta requête qui liste les liens et en ajoutant la condition "WHERE IdConc NOT IN" sous condition :
$sql = "SELECT ... FROM ..."
if(..) {
  $sql.= " WHERE ... ";
}
Quant aux liens déjà cliqués, tu as la liste des id dans $IdZZ et $N (probablement plus exploitable) donc selon ce que tu veux faire tu peux vérifier si un id a déjà été cliquer (avec ereg() ou in_array()), ou simplement dire si des lien ont déjà été cliqué sans donner plus de détail (strlen() ou count()) :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

20 déc. 2006, 17:21

excellent
je te remercie beaucoup.

je vais travailler tout ca ...

enciore merci :D