Simplifier ma fonction

Mammouth du PHP | 1339 Messages

23 mai 2009, 01:12

Salut,

Je voulais savoir s'il était possible de simplifier ma fonction pour n'avoir qu'une requete ?
	// On recupere l'id du produit grace au nom
	function idProjetByName($titre) {
	
		$sql = "SELECT id_projet FROM `tbl_projet` WHERE titre LiKE '".str_replace('_', ' ', $titre)."'";	
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		
		// On arrondi les angles
		if(mysql_num_rows($req) == 0) {
			
			$sql = "SELECT id_projet FROM `tbl_projet` WHERE SOUNDEX(titre) = SOUNDEX('".$titre."')";	
			$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
	
		}
		
		$row = mysql_fetch_array($req);
		
		return $row['id_projet'];
		
	}
Merci, Elie
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Mammouth du PHP | 965 Messages

23 mai 2009, 10:32

Un SELECT COUNT pour vérifier le nombre d'entrées sans parcourir toute la base de donnée puis un SELECT sinon ça devrait aller.

Mammouth du PHP | 1339 Messages

23 mai 2009, 13:20

Bah si je fais un SELECT COUNT au debut et qu'il trouve quelquechose, je peux pas afficher l'iD rechercher
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Mammouth du PHP | 881 Messages

24 mai 2009, 14:10

Si les deux tables peuvent être liée ou comparée de quelque façon, tu pourrais traiter en une seule requête en intégrant ce lien dans une LEFT JOIN ... ON ...
Soyez artisans de paix

Mammouth du PHP | 965 Messages

24 mai 2009, 18:48

Bah si je fais un SELECT COUNT au debut et qu'il trouve quelquechose, je peux pas afficher l'iD rechercher
Je comprends pas très bien ce que tu cherche à faire, mais si tu fais un SELECT COUNT pour connaitre le nombre d'entrées plutôt que de faire un SELECT puis mysql_num_rows() c'est mieux.

Ensuite je vois pas pourquoi tu fais de cette manière la, tu cherche à avoir le résultat de ta recherche avec un SOUNDEX et un str_replace() sur sur $titre utilise cette manière de faire :
   
function idProjetByName($titre) 
{
  $reqSoundEx = mysql_query("SELECT id_projet FROM `tbl_projet` WHERE SOUNDEX(titre) = SOUNDEX('".str_replace('_',' ',$titre)."')");         
  $result     = mysql_fetch_array($reqSoundEx);
        
  return $result['id_projet'];        
} 

Mammouth du PHP | 1339 Messages

24 mai 2009, 23:13

La fonction est simple :)

SOUNDEX c'est bien mais pas fiable a 100% il aime pas les numeros, si je recherche

le_titre_2 ou le_titre_1 il m'affichera la meme chose.

Donc je fais un premiere recherche avec un remplacement des _ par des espaces mais des fois j'ai lenorme_titre et donc ca fait "lenorme titre" et ca trouve rien :)

Donc je me résous au SOUNDEX

En gros, si il trouve qqchose avec le str_replace (mysql_num_row > 0) bah je mysql_query cette requete et si il trouve rien, je lance un soundex et je mysql_query le soudex...

EDiT pour info, pour un SOUNDEX " " et "_" c'est pareil.
Bon sinon tu me fais un message privé et on se fait un TeamViewer

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

25 mai 2009, 21:29

Pourquoi ne pas mettre tes deux conditions dans ta requête avec un OR et ajouter un distinct sur les résultats pour éviter les doublons ?
$sql = "SELECT DISTINCT id_projet 
  FROM tbl_projet 
  WHERE titre LIKE '%".str_replace('_', ' ', $titre)."%'"
    OR SOUNDEX(titre) = SOUNDEX('".$titre."')";   
J'ai ajouté des % pour le like (à toi de voir s'ils sont utiles) et virer les "`" dont tu peux te passer des lors que tu nommes tes tables proprement (sans utiliser de mots clés réservés :) .. ça allège le code et rend ta requête plus lisible).

Tu peux également remplacer tes "_" par des % au lieu des espaces, pour étendre les résultats possibles :)

HTH :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 1339 Messages

25 mai 2009, 22:22

Je veux justement pas de resultat le plus possible ...

En fait je fais de l'url rewriting du genre

monsite.com/le_titre_de_mon_projet.html (projet.php?titre=le_titre_de_mon_projet)

Faudrait que je regarde ce qui se passe si je met les 2 conditions dans la meme requete...
Bon sinon tu me fais un message privé et on se fait un TeamViewer

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

25 mai 2009, 22:59

Beuh si c'est pour de l'url rewriting, ce ne devrait pas être un like ou un soundex, mais des égalités strictes : à un titre de projet (et donc une url) correspond un projet, mais à un "à peu près de titre de projet" ne devrait rien correspondre du tout (en tout cas en terme d'url)...

Sinon cela veut dire que tu pourrais avoir 30 url semblables, qui ouvriraient toutes le même contenu, et je suis pas convaincu que les moteurs de recherche soient très friands de ce genre de procédé... :-k
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...