help pour une requete qui doit varier en fonction variables

kairi084
Invité n'ayant pas de compte PHPfrance

29 août 2010, 18:29

Bonjour,

je vous ecris car j'ai grand besoin de votre aide pour résoudre un problème qui m'échappe =(.
Pour faire simple, j'ai un formulaire avec plusieurs menu déroulant qui correspondent a des filtres pour affiner ma recherche.

Mon but est de faire varier la requête de SELECT en fonction de ce que je recevrai en POST de mon formulaire qui contient mes menus deroulants.

A la base je peux recevoir de mon formulaire les variables suivantes :
$frequence = $_POST['frequence'];
$marque = $_POST['marque'];
$technologie = $_POST['technologie'];
$taille = $_POST['taille'];
$resolution = $_POST['resolution'];
$ports = $_POST['ports'];

ps : ces champs issus des menu déroulants sont facultatifs de peux en prendre aucun, comme je peux en cumuler 3-5.....

Mon but faire varier ma requete en fonction de ce que je recevrai

Au debut j'ai fait ca :

SELECT * FROM `tv` WHERE `frequence`= ".$frequence." OR `constructeur`= ".$marque." OR `technologie`= ".$technologie." OR `taille` = ".$taille." OR `resolution`=".$resolution." OR `ports` = ".$ports."

et dans mon menu déroulant j' ai choisi de faire une recherche par " frequence".
mais voila cela ne marche pas =(

deja mais "or" sont en dure et enfin comme je ne recois que la frequence, les autres champs se retrouvent a vide.


Je suis désespéré , j'ai cherché partout mais je ne sais pas comment faire pour adapter ma requetes en fonction des champs que je recevrais =(((


sil vous plait, si quelqu'un peu m'aider !!

un grand merci !!

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

29 août 2010, 20:43

Ta requête SQL n'est rien de plus qu'une chaine comme une autre pour php. Il te suffit donc de la construire en concaténant les éléments dont tu as besoin quand tu en as besoin. Voici une méthode possible :
$condition = array(); // tableau des conditions

$sql = "SELECT ... FROM ... ";

if (isset($_POST['frequence'])) // si ma valeur est passée, je l'ajoute au tableau des conditions
  $condition[] = " frequence = '".mysql_real_escape_string($_POST['frequence'])."'";

if (isset($_POST['constructeur']))
  $condition[] = " constructeur = '".mysql_real_escape_string($_POST['constructeur'])."'";

...

if (count($condition) > 0) // si j'ai des conditions, j'ajoute le where et mes conditions séparées par un AND (ou un OR selon ce que tu veux faire)
  $sql.= " WHERE " . implode(' AND ', $condition);

echo $sql; // pour voir le résultat
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 19672 Messages

29 août 2010, 20:47

Autre petit soucis indépendant de ce que vient de suggérer Ryle :
Au debut j'ai fait ca :

SELECT * FROM `tv` WHERE `frequence`= ".$frequence." OR `constructeur`= ".$marque." OR `technologie`= ".$technologie." OR `taille` = ".$taille." OR `resolution`=".$resolution." OR `ports` = ".$ports."

et dans mon menu déroulant j' ai choisi de faire une recherche par " frequence".
mais voila cela ne marche pas =(
T'est-il venu à l'idée de faire afficher ta requête générée à l'écran pour voir de quoi avait l'air le résultat et pour la tester en faisant un copier/coller depuis l'écran vers un client MySQL genre PHPMyAdmin ou MySQL en ligne de commande par exemple ? Sinon, tu devrais essayer : l'erreur est assez mineure mais bloquante et mysql ne peut retourner qu'une erreur du genre « colonne inconnue ».

Essaye ça et observe bien, tu vas découvrir tout seul l'erreur ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

kairi084
Invité n'ayant pas de compte PHPfrance

29 août 2010, 22:36

bonsoir,

tout dabord un grand merci pour vos reponses !!!

je vais tester demain et je vous dirais =) et encore une fois MERCI , c'est vraiment gentil davoir pris du temps pour me repondre.
par contre Cyrano je ne vois pas trop ou est l'erreur désolé =(, je suis novice j'ai un peu de mal.
J'ai bien fait ce que tu m'a dit à savoir tester la requête sur l'interface phpmyadmin en remplaçant les variables par des valeurs et cela fonctionne =(

est ce la concaténation avec les variables qui te posait problème??

SELECT *
FROM `tv`
WHERE `frequence` = "120"
OR `constructeur` = "LG"
OR `technologie` = "lcd"
OR `taille` = "107"
OR `resolution` = "1024*720"
OR `ports` = "hdmi"


bonne soirée

Mammouth du PHP | 19672 Messages

30 août 2010, 06:06

J'ai un gros doute : il faudrait voir la vraie ligne de code où tu construis ta requête : là tu n'en as mis que la partie requête, pas la ligne complète. Je suis quasiment certain de mon fait et il va obligatoirement en ressortir une requête erronée, avec les mêmes valeurs que ce que tu as affiché, mais que MySQL va rejeter avec un message d'erreur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

kairi084
Invité n'ayant pas de compte PHPfrance

02 sept. 2010, 18:59

Bonjour,

suite a votre préciseuse aide j'ai fais ce code sur mon site
mais voila j'obtiens cette erreur ci :
SELECT * FROM `tv` WHERE frequence = ‘120′ AND constructeur = ‘Hitachi’
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource line 227

j'ai beau retourner le code dans tous les sens je comprend pas =(((

pourriez vous m'aider svp =(

$condition = array();

if (isset($_POST['frequence']) && ($_POST['frequence'] != 'frequence')) // si ma valeur est passe, je l'ajoute au tableau des conditions
$condition[] = " frequence = '{$_POST['frequence']}' ";

if (isset($_POST['marque'])&& ($_POST['marque'] != 'marque'))
$condition[] = " constructeur = '{$_POST['marque']}' ";

if (isset($_POST['technologie'])&& ($_POST['technologie'] != 'technologie'))
$condition[] = " technologie = '{$_POST['technologie']}' ";

if (isset($_POST['taille'])&& ($_POST['taille'] != 'taille'))
$condition[] = " taille = '{$_POST['taille']}' ";

if (isset($_POST['resolution'])&& ($_POST['resolution'] != 'resolution'))
$condition[] = " resolution = '{$_POST['resolution']}' ";

if (isset($_POST['ports'])&& ($_POST['ports'] != 'ports'))
$condition[] = " ports = '{$_POST['ports']}' ";


if (count($condition) > 0){ // si j'ai des conditions, j'ajoute le where et mes conditions séparées par un AND (ou un OR selon ce que tu veux faire)
$sql= "SELECT * FROM `tv` WHERE " . implode(' AND ', $condition);

echo $sql;

ViPHP
ViPHP | 5462 Messages

02 sept. 2010, 19:16

montre la ou ça marche pas

Mammouth du PHP | 19672 Messages

02 sept. 2010, 19:20

Il faudrait récupérer l'erreur retournée par MySQL lors de l'exécution : que se passe-t-il lorsque tu exécute cette requête directement dans un client MySQL en ligne de commande ou bien dans PHPMyAdmin ?

Sinon, pour optimiser un peu ton code, j'ai noté des répétitions au niveau des noms de champs et de colonnes ou de valeurs. On peut donc factoriser un peu et faire ceci :
$aCols = array('frequence','marque','technologie','taille','resolution','ports');
// Tableau de stockage des conditions de tri
$aWhere = array();
// Chaine de la clause WHERE de la requête.
$sWhere = null;
foreach ($aCols as $col)
{
    // si ma valeur est passe, je l'ajoute au tableau des conditions
    if (isset($_POST[$col]) && ($_POST[$col] != $col)) 
    {
        $aWhere[] = " `". $col ."` = '". $_POST[$col] ."' ";
    } 
}
if(count($aWhere) > 0)
{
    $sWhere = ' WHERE '. implode(' AND ', $aWhere);
}

if (count($condition) > 0)
{
    // si j'ai des conditions, j'ajoute le where et mes 
    // conditions séparées par un AND (ou un OR selon ce 
    // que tu veux faire)
    $sql = "SELECT * FROM `tv`". $sWhere;
}
echo $sql;
Comme ça, si tu rajoutes un jour une colonne dans ta table et le champ correspondant dans ton formulaire, tu n'auras même pas besoin de toucher ce code là sauf pour rajouter le nom de la colonne dans le tableau $aCols : délai d'exécution de ce genre de mise à jour, approximativement 3 à 5 secondes selon le nombre de lettre à taper pour saisir le nouveau nom de colonne ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

kairi084
Invité n'ayant pas de compte PHPfrance

02 sept. 2010, 19:57

tout dabord merci pour votre gentillesse et merci de vouloir m'aider =)

juste une petite question

if (count($condition) > 0) : condition cela correspond a quoi? car je ne le vois pas défini plus haut

Mammouth du PHP | 19672 Messages

02 sept. 2010, 21:31

tout dabord merci pour votre gentillesse et merci de vouloir m'aider =)

juste une petite question

if (count($condition) > 0) : condition cela correspond a quoi? car je ne le vois pas défini plus haut
Autant pour moi, tu as raison, remplace $condition par $aWhere.

Mais en fait j'ai oublié autre chose : tu peux carrément supprimer ce test. Le code devient alors :
$aCols = array('frequence','marque','technologie','taille','resolution','ports');
// Tableau de stockage des conditions de tri
$aWhere = array();
// Chaine de la clause WHERE de la requête.
$sWhere = null;
foreach ($aCols as $col)
{
    // si ma valeur est passe, je l'ajoute au tableau des conditions
    if (isset($_POST[$col]) && ($_POST[$col] != $col)) 
    {
        $aWhere[] = " `". $col ."` = '". $_POST[$col] ."' ";
    } 
}
// si j'ai des conditions, j'ajoute le where et mes 
// conditions séparées par un AND (ou un OR selon ce 
// que tu veux faire)
if(count($aWhere) > 0)
{
    $sWhere = ' WHERE '. implode(' AND ', $aWhere);
}

$sql = "SELECT * FROM `tv`". $sWhere;
echo $sql;
 
Désolé pour cette erreur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

kairi084
Invité n'ayant pas de compte PHPfrance

03 sept. 2010, 07:40

Encore une fois un grand merci !!! mais j'aurais uen dernière petite question si cela ne t'embete pas :oops:

Ton code marche nikel mais quand je veux stoker $sql dans un mysql_query pour l'excécuter il me pete une erreur , je ne comprends vraiment pas =(
Pourrais tu m'aider stp, je suis désolé d'être si novice =(

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource on line 215

$aCols = array('frequence','marque','technologie','taille','resolution','ports');
// Tableau de stockage des conditions de tri
$aWhere = array();
// Chaine de la clause WHERE de la requête.
$sWhere = null;
foreach ($aCols as $col) {
// si ma valeur est passe, je l'ajoute au tableau des conditions
if (isset($_POST[$col]) && ($_POST[$col] != $col)) {
$aWhere[] = " `". $col ."` = '". $_POST[$col] ."' ";
}
}
// si j'ai des conditions, j'ajoute le where et mes
// conditions séparées par un AND (ou un OR selon ce
// que tu veux faire)
if(count($aWhere) > 0) {
$sWhere = ' WHERE '. implode(' AND ', $aWhere);
}

$sql = "SELECT * FROM `tv`". $sWhere;
$afficheProduct = mysql_query($sql);
while ($donneesTV = mysql_fetch_array($afficheProduct)) {
echo $donneesTV['frequence'];

}

Mammouth du PHP | 19672 Messages

03 sept. 2010, 11:32

Salut,
tu t'y prends surtout mal pour trouver les bugs.
Tu as ce message :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource on line 215
On, on sait donc que MySQL a retourné une erreur et du coup les fonctions suivantes ne peuvent pas fonctionner. Pour trouver la nature exacte du problème, il faut identifier l'erreur qui a été retournée. Fais donc afficher ta requête générée à l'écran, copie et colle dans phpMyAdmin et reviens avec le résultat : si MySQL a retourné une erreur, tu vas en voir les détails.

J'ajoute quand même un truc qui peut aider sans passer par phpMyAdmin : modifie un peu cette ligne-ci :
$afficheProduct = mysql_query($sql);
En remplaçant par :
$afficheProduct = mysql_query($sql) or die("Erreur lors de la requête SQL<br />\nRequête : <pre>". $sql ."</pre>\nCode d'erreur : ". mysql_errno() ."<br />\nMessage : ". mysql_error());
Et ensuite exécute ton code et regarde ce qui se passe, le résultat devrait être beaucoup plus parlant.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

kairi084
Invité n'ayant pas de compte PHPfrance

03 sept. 2010, 11:51

merci beaucoup !!

tout fonctionne !! effectivement j'ai encore beaucoup à apprendre en matière de debugage :oops:

encore une fois merci pour ta patience

j'ai beaucoup appris de ces erreurs !