select multiple

Tamara
Invité n'ayant pas de compte PHPfrance

15 mai 2007, 21:02

Bonjour à tous, je viens demander de l'aide pour des select multiple.

voilà mon code pour récupérer les infos
    	if ( count( $this->topic->custom_fields->out_fields ) )
    	{

    		foreach( $this->topic->custom_fields->out_fields as $id => $data )
    		{

    			if ( is_array($this->ipsclass->input['field_'.$id]) AND isset($this->ipsclass->input['field_'.$id]) AND $this->ipsclass->input['field_'.$id] )
    			{
                        $f = implode( ",", $this->ipsclass->input['field_'.$id]);
                     }

    			if ( is_array($this->ipsclass->input['field_'.$id]) AND  isset($this->ipsclass->input['field_'.$id]) AND $f != ""  )
    			{
                        foreach($this->ipsclass->input['field_'.$id] as $st) 
                         {    
                                   if ($querry != "") $querry.=" OR ";
                                   $querry .= "p.field_{$id} LIKE '{$st}%'";
                         }


    			       $query[] = $querry;
    			       $url[]   = "field_{$id}=".$this->ipsclass->input['field_'.$id];
    			}


    		}


    	}
Dans cette exemple j'ai selectioner France dans un select multiple et deejay puis producteur dans un autre.

Mon souci c'est que mon résultat me donne

Code : Tout sélectionner

"p.field_5 LIKE 'France%' " [2]=> string(54) "p.field_5 LIKE 'France%' OR p.field_2 LIKE 'Deejay%' " [3]=> string(85) "p.field_5 LIKE 'France%' OR p.field_2 LIKE 'Deejay%' OR p.field_2 LIKE 'Producer%' " }

Il me renvois plusieurs fois france et deejay par exemple au lieu de me le renvoyer qu'une seule fois. Je me suis appercut que ca venais du 'point' dans mon foreach.
$querry .= "p.field_{$id} LIKE '{$st}%'";
mais si je ne met pas le point je ne recois plus les selection multiple, et me donne comme résultat "France et producteur"...(deejay disparait)

L'explication est un peu brouillone désoler j'espere que quelqu'un pourra comprendre et m'aiguiller

Merci.

ViPHP
ViPHP | 5924 Messages

15 mai 2007, 23:50

Est ce que tu peux réexpliquer plus clairement ce que tu veux faire (ce qu'il est sensé y avoir dans tes tableaux), et ce que tu veux obtenir en sortie ?

Tamara
Invité n'ayant pas de compte PHPfrance

16 mai 2007, 00:39

Oui pardon...

Alors voilà j'ai plusieurs select multiples dans une page. Je cherche à récupéré chaques choix et faire une reqûete dans ma base suivant les choix de cette page.

Exemple

Premier SELECT MULTIPLE (PAYS)

France
Italie
USA
etc...


2éme SELECT MULTIPLE (PROFFESSION)

Deejay
Promoter
Radio
Etc...


J'ai donc maintenant ce code
    	if ( count( $this->topic->custom_fields->out_fields ) )
    	{

    		foreach( $this->topic->custom_fields->out_fields as $id => $data )
    		{

    			if ( is_array($this->ipsclass->input['field_'.$id]) AND isset($this->ipsclass->input['field_'.$id]) AND $this->ipsclass->input['field_'.$id] )
    			{
                        $f = implode( ",", $this->ipsclass->input['field_'.$id]);
                     }


    			if ( is_array($this->ipsclass->input['field_'.$id]) AND  isset($this->ipsclass->input['field_'.$id]) AND $f != ""  )
    			{

                         foreach($this->ipsclass->input['field_'.$id] as $st) 
                         {      
                                   $q[] = "p.field_{$id} LIKE '{$st}%'";                               
                         } 

    				$url[]   = "field_{$id}=".$this->ipsclass->input['field_'.$id];
    			}


    		}

               $q = implode( " AND ", $q);
               $query[] = $q;
    	}
Ca fonctione à peu près, sauf que j'aimerais pouvoir spécifier OR à la place de AND si la clé est présente 2 fois.

Actuelement ma requete donne:

"p.field_5 LIKE 'France%' AND p.field_9 LIKE 'MusicFan%' AND p.field_10 LIKE 'Club%' AND p.field_10 LIKE 'Mobile%'"

et je voudrais que changer la partie p.field_10 LIKE 'Club%' AND p.field_10 LIKE 'Mobile%

Pour p.field_10 LIKE 'Club%' OR p.field_10 LIKE 'Mobile%

Est-ce que c'est moin brouillon ? :roll:

Merci encore.[/php]

ViPHP
ViPHP | 5924 Messages

16 mai 2007, 00:43

Et c'est quoi exactement la structure de ta table ?

Tamara
Invité n'ayant pas de compte PHPfrance

16 mai 2007, 00:50

CREATE TABLE `ibf_pfields_content` (
`member_id` mediumint(8) NOT NULL default '0',
`updated` int(10) default '0',
`field_2` text,
`field_4` text,
`field_5` text,
`field_6` text,
`field_7` text,
`field_8` text,
`field_9` text,
`field_10` text,
`field_11` text,
`field_12` text,
`field_13` text,
PRIMARY KEY (`member_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ViPHP
ViPHP | 5924 Messages

16 mai 2007, 01:01

La structure de ta table me parait très bizarre.
Tu as quoi dans tes champs ? Tu es obligé d'utiliser des LIKE ?
Par exemple, le champ Pays, pourquoi n'utilises tu pas un champ varchar, et pourquoi ne testes tu pas avec == ?

Invité
Invité n'ayant pas de compte PHPfrance

16 mai 2007, 01:16

C'est une table qui est créer a la "volée" dans un panneau d'administration. C'est en faite une partie custom des profiles lorsque les gens s'enregistre sur le site.


Les champs ne comporte qu'une seule réponse exemple dans le field_2 on est soit journalist soit deejay soit producteur etc ... je ne suis pas obligé d'utiliser des LIKE ... == irais très bien ce n'est pas un probléme. Mon souci c'est de pouvoir identifier les doublons des KEYS dans mon array pour que ma requete comporte un OR (si la key est en doublon et un AND si la key n'apparait qu'une seule fois ).

ViPHP
ViPHP | 5924 Messages

16 mai 2007, 01:27

En gros, si j'ai bien compris, la valeur de field_2 doit être dans input['field_2'], la valeur de field_4 doit être dans input['field_4']...
C'est ca ?
Si ca n'est pas ca, il va falloir expliquer exactement ce que tu veux faire, parce que j'ai le profond sentiment que tu t'y prends très mal pour faire ce que tu veux faire. Il faut que tu dise quelles données sont à ta disposition (en gros ce que tu veux permettre à l'utilisateur de faire), et en sortie ce que ca doit donner (mais ca c'est bon, ca se déduira du premier point).

Tamara
Invité n'ayant pas de compte PHPfrance

16 mai 2007, 01:44

Oui la ou les valeurs field_2 correspondes à input['field_2']... ce que je cherche a faire c'est à chercher dans la base par exemple les gens qui ont soit deejay soit promoter dans field_2 avec (autre exemple) les pays france et italie dans field_1...

ce qui me renverais donc tout les gens qui ont choisis dans le field_1 italie ou france AINSI que promoter et deejay dans le field_2. En admettant qu'un user ai choisis France en field_1 et club en field_2, il ne serait pas listé...


user1 => france, deejay
User2 => italie, promoter
User3 => france, promoter
User4 => italie, deejay

ViPHP
ViPHP | 5924 Messages

16 mai 2007, 01:55

Ok, bah suffit de faire ca :
$clauses = array();
foreach( $id_tab as $id ) 
{ 

    if( is_array($fields['field_'.$id])  ) 
    { 
         $clauses[] = '`field_' . $id . '` IN(' . implode(',', $fields['field_'.$id]) . ')';
    }

}
$where = implode(' AND ', $clauses);
(en remplacant les variables).

Mais je persiste à croire que ta table est mal faite...
Je sens que tu vas avoir des pertes de performances...

Invité
Invité n'ayant pas de compte PHPfrance

16 mai 2007, 15:04

Merci pour la réponse. J'ai suivi ton exemple mais j'ai toujours un petit souci...

J'ai cette requête de faite sur la base.

SELECT * FROM `ibf_pfields_content` WHERE field_5 IN ( 'France') AND field_2 IN ( 'Clubber,musicfan')

Je pensais que MYSQL été censé retourné les lignes ou field_5 contien France et field_2 Clubber OU musicfan ...mais apprament il n'en est rien. Est ce que IN ( 'Clubber,musicfan') est censé rechercher Clubber OU musicfan ? ou est-ce que je me trompe sur cette clause ? Quelqu'un aurait un lien vers la clause IN avec quelques détails...Je n'ai pas trouver grabd chose 'intéressant sur google.


Merci encore.

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

16 mai 2007, 15:18

Tu as une petite erreur au niveau des apostrophes qui délimitent tes chaines :

"IN ( 'Clubber,musicfan')" : correspond à " = 'Clubber,musicfan' "

Si tu veux un "ou" entre chaque il te faut mettre des apostrophes autour de chaque chaine :
IN ( 'Clubber', 'musicfan') : qui correspond à " xx = 'Clubber' OR xx = 'musicfan' "

Ceci étant (et en rectifiant) ta requête
field_5 IN ( 'France') AND field_2 IN ( 'Clubber', 'musicfan')
va te reourner tous les enregistrements pour lesquels field_5 est égal à 'France' ET pour lesquels field_2 sera égal à 'Clubber' OU à 'musicfan'
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Tamara
Invité n'ayant pas de compte PHPfrance

16 mai 2007, 15:30

Mon dieu la honte :oops: Merci bien en tout cas, tu viens de me sortir d'un casse tête... fichu apostrophes.

Encore merci.

ViPHP
ViPHP | 5924 Messages

16 mai 2007, 18:45

C'est de ma faute, j'ai oublié les apostrophes dans le implode :)