Page 1 sur 1

Simplifier ma fonction

Posté : 23 mai 2009, 01:12
par Elie
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

Posté : 23 mai 2009, 10:32
par agité
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.

Posté : 23 mai 2009, 13:20
par Elie
Bah si je fais un SELECT COUNT au debut et qu'il trouve quelquechose, je peux pas afficher l'iD rechercher

Posté : 24 mai 2009, 14:10
par Patriboom
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 ...

Posté : 24 mai 2009, 18:48
par agité
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'];        
} 

Posté : 24 mai 2009, 23:13
par Elie
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.

Posté : 25 mai 2009, 21:29
par Ryle
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 :)

Posté : 25 mai 2009, 22:22
par Elie
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...

Posté : 25 mai 2009, 22:59
par Ryle
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