select multiple et clause where ?

Eléphant du PHP | 55 Messages

10 févr. 2006, 12:36

Bonjour tout le monde, je viens à la rescousse pour vous demandez une idée. Je cherche à faire une requete ou la clause WHERE serait en fonction des choix d'un select multiple.

par exemple j'ai un tableau comme celui-ci

Code : Tout sélectionner

<select name='country[]' class='dropdown' multiple='multiple' size='15'> <option value='fra'>France</option> <option value='jap'>Japan</option> <option value='aus'>Australia</option> <option value='Unite'>United States</option> </select>
Je récupere mon tableau ainsi...
$country  = $ibforums->input['country'];

//voilà ce que j'ai essayer

foreach($country as $choix)
{
$reqp = "field2=$choix";
}

$DB->simple_construct( array( 'select' => 'count(member_id) AS result',
									  'from'   => 'pfields_content',
									  'where'  => "$reqp" ) );
		
$DB->simple_exec();
Le souci c'est que de cette maniére il m'execute les requêtes une par une... alors que j'aimerais qu'ils fasse une requete en fonction de tous les choix en même temps.
Exemple j'aimerais ma requête sois : 'where' => "field2 = fr OR field2 = jap"

J'ai essayer de faire un count($country) d'abord et d'utiliser "for" ensuite mais je ne m'en suis pas sorti...

Si quelqu'un avait la bonté de pouvoir m'aiguiller

Merci :)

Mammouth du PHP | 19672 Messages

10 févr. 2006, 12:49

Il faut contruire ta chaine avec un implode() :
<?php
$country  = $ibforums->input['country'];

//voilà ce que je propose
foreach($country as $choix)
{
    /* Modification de chaque valeur du tableau de pays en ajoutant "field2=" */
    $country[$choix] = "field2='". $choix ."'";
}
/* Création de la chaine de la clause WHERE en insérant un " OR " entre chaque clause de choix de pays */
$reqp = implode(" OR ", $country);

$DB->simple_construct( array( "select" => "count(member_id) AS result",
                              "from"   => "pfields_content",
                              "where"  => $reqp ) );

$DB->simple_exec();
?>
Résultat, si tu as trois pays, par exemple france, belgique et espagne, la chaine produite ressemblera à :

Code : Tout sélectionner

field2='france' OR field2='belgique' OR field2='espagne'
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

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

10 févr. 2006, 12:51

Tu peux rassembler tous tes critères dans un IN : WHERE field IN ('fr', 'jap', ...)

Cela équivaut à WHERE field='fr' OR field='jap' OR ...
$condition = ""
foreach($nomDuSelect as $pays) {
 if ($condition != "") $condition.=", "; // ajout du séparateur, tu peux aussi bien mettre le OR ici
 $condition.= "'$pays'"; // de la même manière tu peux mettre field='$pays'
}

$sql = "SELECT ... WHERE field IN ($condition)"; 
// ou "SELECT ... WHERE $condition"; si tu optes pour les OR :)

Eléphant du PHP | 55 Messages

10 févr. 2006, 15:10

Je vous remerci bien bas ! Le souci est résolu grace à vous :)

Eléphant du PHP | 55 Messages

10 févr. 2006, 16:53

Désolé c'est encore moi :oops:

J'ai mi en place la solution de ryle qui fonctionne très bien...
foreach($country as $pays) { 
if ($condition != "") $condition.=" OR "; 
$condition.= "field_2='$pays'";
}
par contre dans mon select j'aimerais mettre la possibilté de ne pas choisir de pays...

Code : Tout sélectionner

<option value="any" selected>Any</option>
je voudrais donc renvoyer une requete du genre WHERE field !=''

j'ai essayer cette chose

foreach($country as $pays) { 
if ($condition != "") $condition.=" OR "; 
$condition.= "field_2='$pays'";
if ($condition == "field_2='any'") 
$condition.= "field_2!='$pays'";
}
mais ca m'envois cette requete ci => field_2='any'field_2!='any'

et si je fais tel que :
foreach($country as $pays) { 
if ($condition != "") $condition.=" OR "; 
$condition.= "field_2='$pays'";
if ($condition == "field_2='any'") $condition.=" OR "; 
$condition.= "field_2!='$pays'";
}
ca m'envois field_2='any' OR field_2!='any'

cette requete fonctionne sauf que ca casse la requete si je selectionne un pays.

Encore une tite aide s'il vous plait ? Merci

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

10 févr. 2006, 17:05

Le plus simple, si jamais la valeur du select est "any" (ou si l'une des valeur sélectionnée est "any"), c'est de ne pas mettre la condition where :)
$sql = "SELECT ... FROM maTable";
if(in_array("any", $nomDuSelect)
  $sql.= " WHERE $condition";

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

10 févr. 2006, 17:07

Hum... p'tite erreur dans le if, c'est lorsque l'on ne trouve pas le any dans le tableau qu'il faut ajouter le where ;)
$sql = "SELECT ... FROM maTable"; 
if( ! in_array("any", $nomDuSelect) )
   $sql.= " WHERE $condition";

Eléphant du PHP | 55 Messages

10 févr. 2006, 17:14

merveilleux :) encore merci