recherche sur plusieurs champs... où se trouve la chaîne ?

Petit nouveau ! | 2 Messages

26 janv. 2006, 16:04

Salut

J'aurais besoin d'un petit coup de main...

Je suis en train de faire un moteur de recherche pour mon site (qui parle de cinoche).
Au début, je suis parti sur un truc tout simple, du type (je vous la fait courte)
SELECT titre_du_film, acteur1, acteur2, acteur3 FROM table1 WHERE (acteur1 LIKE '%".$recherche."%' OR acteur2 LIKE '%".$recherche."%' OR acteur3 LIKE '%".$recherche."%')
'titre_du_film', 'acteur1', 'acteur2' et 'acteur3' étant des champs de ma table, bien sûr.


Le résultat est marrant si on tape un titre, ca marche bien, mais ca me pose un problème : ca me retourne l'entrée où le texte a été trouvé, mais pas le champs dans lequel il a été trouvé!
Or, moi, j'aurais besoin de savoir dans quel champ il l'a trouvé pour les acteurs...
Je sais pas si je me fais bien comprendre, alors voici un exemple :


ex: Je cherche un type qui s'appelle "charles", mais je sais plus son nom.
Je rentre "charles" dans le moteur.
Et ca tombe bien, j'en ai plusieurs dans ma table:
- dans une entrée, 'acteur2', il y a Charles Bronson,
- dans une autre entrée, il y a "charles bidule" dans le champ 'acteur3'.

Après, je voudrais que ma boucle affiche tous les "Charles" de la table :
Charles Bronson
Charles bidule
Charles machin"
etc.

Bref, la question en elle même:

Y a-t-il moyen de connaitre le champ dans lequel une requête SQL trouve l'occurance de la chaine de caractère recherchée?

J'ai cherché du coté de 'mysql_field_name', pas concluant...
puis avec ça :
if ($donnees=mysql_fetch_assoc($req))
{
			
		while(list($key, $val)=each($donnees)) 
		{
			 echo 'clef du tableau ='.$key.'<br/> chaine='.$val.'<br/>';
			 
		}
		
		
}
Ce dernier est un peu plus concluant, mais il me fait évidement un listing de touts les champs séléctionnés du tableau. Or moi, je veux uniquement celui où il a trouvé la chaine de caractère.

Si vous pouviez m'aider là, parce que je m'arrache les cheveux...

Merci !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 janv. 2006, 16:57

Tu étais proche de la solution sauf que c'est ta requête qui ne répond pas au besoin.
L'idée est de construire une requête SQL qui annule les champs qui ne répndent pas aux critères de recherche. Comme ça sous PHP on a un repère pour n'exploiter que les champs porteurs de résultats.

Je m'explique: il faut que la requête teste un acteur s'il répond au critère si oui elle inclu sa valeur dans le résultat sinon elle met sa valeur à vide.

Voici SQL qui permet de faire ça :

Code : Tout sélectionner

SELECT titre, if (acteur1 LIKE '%charles%' , acteur1,'') as acteur1, if (acteur2 LIKE '%charles%' , acteur2,'') as acteur2, if (acteur3 LIKE '%charles%' , acteur3,'') as acteur3 FROM film
Ici on cherche le mot-clé "charles" dans les acteurs. Le IF SQL teste le champ et décide si vrai retourne sa valeur sinon retourne vide.

Et voici finalement le code PHP qui exécute cette requête et exploite le résultat pour n'afficher que les champs répondants au critère.
<?php
$sql = "
SELECT titre, 
if( acteur1 LIKE '%charles%', acteur1, '' ) AS acteur1, 
if( acteur2 LIKE '%charles%', acteur2, '' ) AS acteur2, 
if( acteur3 LIKE '%charles%', acteur3, '' ) AS acteur3
FROM film
";
$résultat = mysql_db_query("test", $sql, mysql_connect("localhost", "root", ""));
echo "<p>Résultat:";
if ($résultat)
	while ($ligne = mysql_fetch_assoc($résultat)){
		if ($ligne)
			foreach ($ligne as $champ=>$valeur){
				if ($valeur) echo "<p>$champ = $valeur";
			}
	}
else echo "<p>Rien!";
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 2 Messages

26 janv. 2006, 18:45

J'ai qu'un mot à te dire : MERCI !

J'aurais jamais pu trouver ça...

En tout cas, je l'ai adapté à ce que je voulais faire, ca marche nickel, et en prime, j'ai appris des trucs.

Encore merci !