Eviter les doublons dans une requete !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Eviter les doublons dans une requete !

par Achris1049 » 31 janv. 2006, 23:24

Oui je pense que c'est exactement ce que je vais faire....

Encore merci pour votre intervention..

Cordialement

par Cyrano » 31 janv. 2006, 23:21

Ben disons que les connaissances nécessaires sont en SQL plus qu'en PHP : l'idée, c'est d'obtenir les mêmes résultats sans doublons, mais au niveau du traitement des données récupérées, il n'y a rien de particulier à modifier.

Donc ce que tu peux faire, c'est utiliser phpMyAdmin ou encore MySQl Query Browser pour bosser sur ta requête de façon à obtenir le résultat voulu: une fois la requête mise au point, il ne te restera qu'un copier/coller à faire dans le code en remplaçant les valeurs utilisées pour les tests par les variables du code PHP.

par Achris1049 » 31 janv. 2006, 23:16

oui donc c'est pas gagné ! Bon je pense que je vais laisser comme tel pour le moment et par la suite constituer un moteur qui tienne reellement la route....

Disons qu'en postant j'avais l'espoir qu'il aurais suffit de modifier un petit peu le code, mais n'ayant pas de super connaissance en php nous allons reporter cela à plus tard !

Quoiqu'il en soit c'est bien sympa a vous de m'avoir donnée quelques piste a suivre pour améliorer ce moteur...

Cordialement à tous...

par Cyrano » 31 janv. 2006, 23:08

Dans l'état actuel des choses, je dirais qu'il faudrait soir revoir la requête pour ajouter un DISTINCT quelque part, soit user d'astuce : à chaque ligne que tu affiches, tu peu enregistrer la donnée dans un tableau indexé et avant d'afficher une ligne, tu vérifie si la valeur n'est pas déjà dans ce tableau: soit elle est absente et tu affiches normalement, soit elle est déjà présente et tu sautes à la ligne suivante.

Mais ça aura un inconvénient: tu n'auras pas forcément le nombre de résultats affiché correspondant au nombre de résultats demandés par page puisque certaines lignes étant des doublons ne seront pas affichés.

Donc la solution, c'est de travailler sur ta requête SQL.

par Achris1049 » 31 janv. 2006, 23:00

En réalité je ne sais pas trop, disons qu'actuellement sur nos annuaires le moteur présent (la requete) est celle ci dessous !
<?php

		if (!isset($_GET['limit'])) { $limit = "20"; }else{ $limit = "".$_GET['limit'].""; }
		if (!isset($_GET['debut'])) { $debut = "0"; }else{ $debut = "".$_GET['debut'].""; }
			
		if (!isset($_GET['key'])) { $asked = "".$_POST['key'].""; }elseif(!isset($_POST['key'])){ $asked = "".$_GET['key'].""; }
			
		// Si un/des mot(s) clef(s) sont entre(s), on commence la recherche
		if (!empty($asked))	
		{
			$asked = strip_tags($asked);							// Supprime les tags HTML et PHP
			$asked = strtolower($asked);							// Passe la chaine en minuscule
					
			$asked = cleanString($asked);							// Supprime les caracteres non alpha-numeriques
			$asked = removeAccents($asked);							// Supprime les accents
			$asked = CheckValidName($asked);						// Supprime mots inutiles
					
			$asked = trim($asked);									// Supprime les espaces en debut et fin de chaine
			
			$db = mysql_connect($sql_host,$sql_user,$sql_pass); 
			mysql_select_db($sql_bdd,$db);
		
			$sql     = "SELECT id, poid, titre, url, description, MATCH (titre , url , description , clee) AGAINST ('".$asked."') AS score FROM ".$mysql_prefix."liensMembre WHERE MATCH (titre , url , description , clee) AGAINST ('".$asked."') AND valide='1' AND user='".$_GET['log']."' LIMIT ".$debut.", ".$limit."";
			$result  = mysql_query($sql);
			
			$sql3    = "SELECT id, MATCH (titre , url , description , clee) AGAINST ('".$asked."') AS score FROM ".$mysql_prefix."liensMembre WHERE MATCH (titre , url , description , clee) AGAINST ('".$asked."') AND valide='1' AND user='".$_GET['log']."'";
			$result2 = mysql_query($sql3);
			$result3 = mysql_query($sql3);
			
			echo '<table width="96%" border="0" align="center" cellpadding="0" cellspacing="0">';
			echo '<tr><td height="45" valign="bottom"><strong>Résultat de votre recherche</strong></td></tr>';
			echo '<tr><td>';
			
			if($debut == "0")
			{
				$nb = $debut+1;
				if(mysql_num_rows($result3) == "0")
				{
					echo '0-0';
				}
				elseif(mysql_num_rows($result3) < $limit)
				{
					echo ''.$nb.'-'.mysql_num_rows($result3).'';
				}
				else
				{
					echo ''.$nb.'-'.$limit.'';
				}
			}
			elseif($debut <> "0")
			{
				$debut1 = $debut+1;
				if(mysql_num_rows($result3) <> $limit)
				{
					echo ''.$debut1.'-'.mysql_num_rows($result3).'';
				}
				else
				{
					$limit2 = $limit+$limit+1;
					echo ''.$debut1.'-'.$limit2.'';
				}
			}
			echo ' sur '.mysql_num_rows($result3).' r&eacute;sultats contenant <strong>'.$_POST['key'].'</strong>';		

			echo '</td></tr>';
			echo '<tr><td>&nbsp;</td></tr>';
			echo '<tr><td width="74%" valign="top"><table width="100%" border="0" cellspacing="4" cellpadding="0">';
			echo '<tr><td valign="top">';
			
				$nrows = mysql_num_rows($result2);
				$flag  = 1;
				
				// Si aucun resultats n'est trouve, on retourne un message d'erreur
				if(mysql_num_rows($result2) == 0) 
				{
					echo "<span class=\"txt_rouge\">Aucun r&eacute;sultat contenant <strong>".$_POST['key']."</strong> n'a pu &ecirc;tre trouv&eacute;.</span><br>";
				}
				elseif(strlen($asked) < 4) 
				{
					// Si le mot clef fait moins de 3 caracteres, la recherche est stoppe
					echo "<span class=\"txt_rouge\">Veuillez saisir un mot cl&eacute; de 4 caract&egrave;res minimum</span>";
				}
				else
				{
					while($row = mysql_fetch_array($result)) 
					{
						$titre       = highlight($row['titre'], $asked);
						$description = highlight($row['description'], $asked);					
						$url         = highlight($row['url'], $asked);
						
						echo '<table width="97%" border="0" cellspacing="1" cellpadding="0">';
						echo '<tr><td><img src="'.$urlSite.'/annuaire/template/'.$themeAnnuaire.'/imgs/ico_site.gif" border="0">&nbsp;&nbsp;<a href="'.$row['url'].'" target="_blank"><strong><span class="titre_site_annuaire">'.stripslashes($titre).'</span></strong></a></td></tr>';
						echo '<tr><td>'.stripslashes($description).'</td></tr>';
						echo '<tr><td><span class="url_poid__site_annuaire">'.$url.' - Poids : '.$row['poid'].' Ko</span></td></tr>';
						echo '</table><br>';
					}
					
					mysql_free_result($result);
	
					// Affichages des resultats pages par pages
					$nombre = ceil($nrows/$limit);

					echo "<center>";
					
					if(isset($_GET['key'])) { $parPages = "".$_GET['key'].""; }elseif(isset($_POST['key'])){ $parPages = "".$_POST['key'].""; }
					
					if($debut > 0) 
					{
						echo "<a href=?debut=".($debut-$debut)."&limit=".($limit-$debut)."&key=".$parPages."&log=".$_GET['log'].">Pr&eacute;c&eacute;dents | </a>  ";    
					}            
					
					if ($nombre > 1) 
					{
						for($i=1; $i<=$nombre; $i++) 
						{
							echo "<a href=?debut=".(($i-1)*$limit)."&limit=".($limit+$limit)."&key=".$parPages."&log=".$_GET['log']."> ".$i." </a> ";
						}
					}

					if(($debut+$limit) < $nrows)
					{
						echo "<a href=?debut=".($debut+$limit)."&limit=".($limit+$limit)."&key=".$parPages."&log=".$_GET['log']."> | Suivants </a>";
					}

					echo "</center>";

				}
	}
	elseif(empty($_POST['key']) OR empty($_GET['key']))
	{
		// Si aucun mots clefs n'est saisi
		header("Location: ".$_SERVER['HTTP_REFERER']."");
	}
	
	echo '</td></tr></table></td>';
	echo '<td width="26%" valign="top"></td></tr>';
	echo '</table></td></tr></table></td></tr></table>';

?>
Ce moteur fonctionne très bien mais quand le meme site est inscrit dans plusieurs categories celui ci sort autant de fois qu'il est inscrit lors d'une requete le concernant ...

merci de tenter de m'aider...

par Cyrano » 31 janv. 2006, 22:54

Si ton moteur fait une recherche en base de données, tu peux ajuster ça dans ta requête avec DISTINCT qui ne retournera aucun doublon, mais est-ce que c'est bien ce dont tu as besoin ? :-k

Eviter les doublons dans une requete !

par Achris1049 » 31 janv. 2006, 22:52

Tous d'abord bonjour à tous et tous nos voeux en cette dernière journée de janvier pour la nouvelle année 2006 qui commence.

Je souhaiterais savoir comment eviter de faire sortir (si c'est possible) 2 fois le meme site dans un resultat de recherche. Je m'explique :

dans un annuaire j'ai 2 fois un site "site.com" qui se trouve dans 2 catégories différentes et je souhaiterais lors d'une recherche dans un moteur de recherches éviter sur une requete que celui ci sorte 2 fois !

D'avance merci à tous de prendre le temps de m'aider.

Cordialement patricia