requete de recherche impossible a formuler

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : requete de recherche impossible a formuler

par sadeq » 11 sept. 2006, 09:06

Le plaisir est pour moi :wink:

par RinaBK » 09 sept. 2006, 12:54

Oui, effectivement ta suggestion est pas mal du tout !! C’est vrai que elle est mieux formulée et en plus, elle ne prend pas beaucoup de place !! C’est géniale, et merci beaucoup !!!! Je vais dès maintenant utiliser ta manière de faire, car ça me plait ! ;)

Aussi, je voulais te montrer en live la page que tu m’as aidé à faire :
http://www.bk-sims.ch/vetements.php

…et je te remercie encore infiniment pour ton aide qui me fut très précieuse !!! Merci :merci:

par sadeq » 07 sept. 2006, 13:15

D'abord je suis content pour toi :wink:

Ta tout à fait raison de t'organiser comme tu veux quant à l'agencement de ton code.

Mais il me semble que ton code d'exécution et de lecture du résultat de la requête pose 3 problèmes logiques :
  • 1. même si $db n'existe pas (pas de ressource ouverte par le header) une instruction mysql_query est lancée en vain et c'est une perte de temps processeur

    2. le mysql_fetch_array qui suit et qui lit le résultat de mysql_query ne sait pas vraiment si il y a eu résultat ou pas et dans le cas où il y en a pas un gros crash survient.

    3. la variable $sql est utilisée à double rôle : elle est dans un premier temps porteuse de la chaîne sql et dans un second elle devient le résultat (ressource) de l'exécution de mysql_query. Sachant que les deux types ne sont pas les mêmes cette façon de faire est source de confusion pour le programmeur qui lit et maintient le programme (en dehors de toi)
La corrective est devoir identifier les ressource de lien avec la BD par des noms uniques et de les vérifier avant tout usage pour gérer les erreurs et optimiser le code en évitant de faire appel à des fonctions dépendantes de ressources absentes.


Je suggère ce qui suit :
if (!$db) echo 'Impossible de vous afficher le résultat';   
else {  
    $resultat = mysql_query ($sql, $db) or die ('Impossible de vous afficher le résultat'); 
    if ($resultat && mysql_num_rows($resultat)>0)  
      	while ($row = mysql_fetch_array($resultat)) { 
      		extract($row); 
      		//affichage de la ligne
			echo $nom.'<br />Version : '.$version.'<br />Type : '.$type.'<br />Age : '
				.$age.'<br />Style : <ul><li>'.str_replace(';','<li>',$style).'</ul><br /><br />'; 
   		} //fin while
  	else echo "<p>Aucun téléchargement n'est disponible pour le moment.";
}//fin if !$db

par RinaBK » 07 sept. 2006, 12:08

C'est juste !! Je ne pensais plus à ce % pour le jocker !! Heureusement que tu es là pour me reveiller un peu :lol:

Donc, suite à ça, j'ai modifié ma requête comme suit :
$sql ='SELECT * FROM download WHERE categorie="vetements" 
	AND (version LIKE "%'.implode('%" || version LIKE "%', $version).'%") 
	AND (type LIKE "%'.implode('%" || type LIKE "%', $type).'%") 
	AND (age LIKE "%'.implode('%" || age LIKE "%', $age).'%")
	AND (style LIKE "%'.implode('%" || style LIKE "%', $style).'%")
	ORDER BY id DESC';
..Et tu sais quoi ?? ça marche !!!! \:D/
Bé je dois te dire un super, méga grand MERCI !!! Car je n'aurais jamais réussi toute seule à trouver la bonne métode et en plus j'ai pu découvrire de nouvelles choses !! :D Alors encore MERCI !!!


Par contre, pour ta correction sur le code PHP qui execute la requête... C'est tout à fait juste ta correction, car je l'ai apprise exactement comme la correction que tu as faite. Mais je me suis rendu compte que je me retrouvais avec des lignes et des lignes de code.. Et pour finir, j'y voyais plus rien du tout :( Donc, j'ai trouvé une autre technique, qui pour l'instant à laire de fonctionner très bien. Sur ma page header.php j'ouvre ma db comme suit :
// Connexion à la db
$db = '';
if (!include('config.php')) { echo 'Impossible de trouver le fichier de configuration'; }
$db = mysql_pconnect(HOTE, NAME, PASSE) or die ('Impossible de se connecter à la db');
mysql_select_db(BASE, $db) or die ('Impossible de se connecter à la db');
ensuite, dans ma page footer.php je referme la connexion comme suit :
 mysql_close($db);
Une fois la connexion et la deconnexion sur la db faite, je peu travailler avec mes tables dans la page... (Bon, lorsque j'utilise cette technique, il est bien clair que je travaille seulement avec 1 seule base de donnée)
Donc, dans mes page, je n'ai plus qu'à faire le code suivant pour travailler sur la db :
$sql ='SELECT * FROM download';
$sql = mysql_query($sql, $db);
if (!$db) {
	echo 'Impossible de vous afficher le résultat';
}
else {
	while ($row = mysql_fetch_array($sql)) {
		extract($row);
		.....
	}
}
Ainsi mon code est beaucoup plus petit, le contrôle d'erreur sur la db est prenoncé au cas ou il y aurait un problème et les codes qui se placeront autour, seront nettement plus visible et accessible que si j'ai une connexion qui me prend 20 lignes en exagérant. Bon, comme j'ai pu le constater, cette méthode n'est pas la méthode classic et courrante, mais je trouve que lorsque l'on a beaucoup de ligne de code sur une page, c'est plus simple pour s'y retrouver et voir du premier coup d'oeil ce qui se passe...

Mais penses-tu que cette méthode peut comporter des problèmes suivant certains cas ?

par sadeq » 07 sept. 2006, 09:40

Oaw, t'as tout compris c'est très bien et en plus t'as tout bien modifié comme je l'ai imaginé.

En ce qui concerne la requête, c'est vrai que je n'ai pas pensé au problème que t'as soulevé :
si l’on a un vêtement qui a uniquement "sport" et un autre qui a "sport;soiree", si l’on sélectionne uniquement "sport" le vetement qui se présente sous "sport;soiree" ne s’affichera pas
Mais il est possible de le résoudre en profitant de LIKE pour lui demander de chercher le mot à l'intérieur de la chaîne "style" de la table.

Exemple :
La condition : style LIKE "%sport%"
Cherche le mot "sport" quelque soit sa position dans la chaîne "style" et c'est le caractère générique % qui modifie le comportement de LIKE ainsi.
Cette condition retourne vrai si :
  • style = "sport;soiree"
    style = "sport"
    style = "decontracte_bas;sport;soiree"
    style = "decontracte_bas;maillotdebain;sport"
Et reste fausse si le mot n'existe pas dans la chaîne.

Maintenant, il faut modifier la requête en concéquence sans toucher ni à la base de données ni au formulaire ni au programme php.

Ceci dit je te passe tout ce que j'ai fait qui correspond exactement à ce que tu as fait.

Mais avant il faut que je revienne sur un morceau de ton code php qui me semble à réécrire dans la manière la plus courante.
Il s'agit de la partie php qui exécute la requête :
$sql = mysql_query($sql, $db);
echo '<br />'.$sql.'<br />'.mysql_error().'<br />';
$fichierNB = mysql_num_rows($sql);
if ($fichierNB == 0) { ?>Aucun téléchargements n'est disponibles pour le moment.<? }
while ($row = mysql_fetch_array($sql)) {
extract($row);
echo $nom.'<br />Version : '.$version.'<br />Type : '.$type.'<br />Age : '.$age.'<br />Style : '.$style.'<br /><br /><br />';
}
Suggestion de reformulation :
//Pour le débogage : afficher la requête
echo '<hr>Débogage: (veuillez copier cette requête et l\'exécuter directement sous Mysql)<br><pre>'.$sql.'</pre><hr>';

//Connexion 
$con = mysql_connect("localhost", "root", "")or die ("Erreur: ".mysql_errno()." - ".mysql_error()); 
if ($con){
	//Ouverture de la base 
	$db = mysql_select_db("test", $con) or die ("Erreur: ".mysql_errno()." - ".mysql_error()); 
	if ($db){
		//Exécution de la requête
		$resultat = mysql_query($sql, $con) or die ("Erreur: ".mysql_errno()." - ".mysql_error()); 
		//si la requête est exécutée
		if ($resultat){
			//Nombre de lignes retournées
   			$fichierNB = mysql_num_rows($resultat); 
   			if ($fichierNB > 0) {
				//lire le résultat 
   			 	while ($row = mysql_fetch_array($resultat)) { 
      						extract($row); 
      						//affichage de la ligne
							echo $nom.'<br />Version : '.$version.'<br />Type : '.$type.'<br />Age : '
							.$age.'<br />Style : <ul><li>'.str_replace(';','<li>',$style).'</ul><br /><br />'; 
   				} //fin while
  			} else { echo "<p>Aucun téléchargement n'est disponible pour le moment."; } 
		}//fin if $resultat
	}//fin if $db
}//fin if $con
Voici donc ce que j'ai fait:

Code : Tout sélectionner

-- -- -- Structure de la table `download` -- CREATE TABLE `download` ( `id` bigint(20) unsigned NOT NULL auto_increment, `dates` date NOT NULL, `heures` time NOT NULL, `nom` varchar(250) NOT NULL, `description` text NOT NULL, `fichier` varchar(250) NOT NULL, `version` varchar(250) default NULL, `categorie` varchar(250) NOT NULL, `type` varchar(250) default NULL, `age` varchar(250) default NULL, `objet` varchar(250) default NULL, `style` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ; -- -- Contenu de la table `download` -- INSERT INTO `download` (`id`, `dates`, `heures`, `nom`, `description`, `fichier`, `version`, `categorie`, `type`, `age`, `objet`, `style`) VALUES (8, '2006-08-29', '01:13:10', 'Asia (rose)', 'Vu que le jeu de base des Sims2 vous propose très peu le model de la robe asiatique, voici une recoloration de cette robe en rose. Cela vous permettra d’avoir un peu plus de choix concernant cette magnifique robe asiatique.\r\n\r\n', 'asia_000_000', 'sims2', 'vetements', 'femme', 'adultes', '', 'decontracte_bas;maillotdebain;sport'); INSERT INTO `download` (`id`, `dates`, `heures`, `nom`, `description`, `fichier`, `version`, `categorie`, `type`, `age`, `objet`, `style`) VALUES (9, '2006-08-29', '05:13:48', 'Asia (orange)', 'Voici la rose asiatique que vous propose le jeu de base. La différence avec la robe que vous connessez déjà, c’est que c’elle-ci est une recoloration en orange. Grâce à cette recoloration, vous allez enfin avoir un peu plus de choix sur les couleurs de cette magnifique robe asiatique.', 'asia_000_001', 'business', 'vetements', 'femme', 'adultes', '', 'decontracte_2pc'); INSERT INTO `download` (`id`, `dates`, `heures`, `nom`, `description`, `fichier`, `version`, `categorie`, `type`, `age`, `objet`, `style`) VALUES (10, '2006-08-29', '05:17:35', 'Asia (Jaune)', 'Comme vous l’avez très certainement remarqué, cette magnifique robe asiatique est une recoloration de c’elle que le jeu de base vous propose. Grâce à cette robe, vous aurez d’avantage de choix concernant les couleurs proposées par cette robe si jolie.', 'asia_000_002', 'nightlife', 'vetements', 'femme', 'adultes', '', 'decontracte_2pc;soiree');
Le formulaire est le même que le tiens. (je l'ai mis à part et appelé "test.htm")

Le programme php:
<?php
//Le formulaire
include "test.htm";

//Ne pas exécuter le programme si aucun envoi
if (!$_POST)  exit;

//Inisialisations des varialbes 
$spaceTable = 3; 
$spaceSpacing = 3; 
$spacePadding = 3; 

$fichierNB = 0; 
$nom = ''; 

$version = array(); 
$version_all = ''; 

$type = array(); 
$type_all = ''; 

$age = array(); 
$age_all = ''; 

$style = array();
$style_all = ''; 

//Extractions des variables d'envois ($_POST & $_GET) 
extract($_POST);

//affectation de valeurs
if ($version_all == 'all') { 
   $version = array('sims2','university','nightlife','chrismas','business','familyfun'); 
} 
if ($type_all == 'all') { 
   $type = array('femme','homme'); 
} 
if ($age_all == 'all') { 
   $age = array('bambins','enfants','adolescents','universitaires','adultes','seniors'); 
} 
if ($style_all == 'all') { 
   $style = array('decontracte_haut','decontracte_bas','decontracte_2pc','soiree','sousvetement','pyjamas','maillotdebain','sport'); 
}

//Requête SQL
$sql = 'SELECT * FROM download WHERE categorie="vetements"  
AND ( style LIKE "%'.implode(';', $style).'%" ) 
AND (version LIKE "'.implode('" || version LIKE "', $version).'")  
AND (type LIKE "'.implode('" || type LIKE "', $type).'")  
AND (age LIKE "'.implode('" || age LIKE "', $age).'")   
ORDER BY id DESC';

//Pour le débogage : afficher la requête
echo '<hr>Débogage: (veuillez copier cette requête et l\'exécuter directement sous Mysql)<br><pre>'.$sql.'</pre><hr>';


//Connexion 
$con = mysql_connect("localhost", "root", "")or die ("Erreur: ".mysql_errno()." - ".mysql_error()); 
if ($con){
	//Ouverture de la base 
	$db = mysql_select_db("test", $con) or die ("Erreur: ".mysql_errno()." - ".mysql_error()); 
	if ($db){
		//Exécution de la requête
		$resultat = mysql_query($sql, $con) or die ("Erreur: ".mysql_errno()." - ".mysql_error()); 
		//si la requête est exécutée
		if ($resultat){
			//Nombre de lignes retournées
   			$fichierNB = mysql_num_rows($resultat); 
   			if ($fichierNB > 0) {
				//lire le résultat 
   			 	while ($row = mysql_fetch_array($resultat)) { 
      						extract($row); 
      						//affichage de la ligne
							echo $nom.'<br />Version : '.$version.'<br />Type : '.$type.'<br />Age : '
							.$age.'<br />Style : <ul><li>'.str_replace(';','<li>',$style).'</ul><br /><br />'; 
   				} //fin while
  			} else { echo "<p>Aucun téléchargement n'est disponible pour le moment."; } 
		}//fin if $resultat
	}//fin if $db
}//fin if $con

?>

par RinaBK » 06 sept. 2006, 20:57

Je dois te dire un super grand merci !!! :pouce: Car l’histoire de définir l’attribut name="style[0]" je ne connaissais pas du tout ! Enfin, j’avais déjà vu cette façon de faire, mais j’avoue n'avoir jamais bien réfléchi à ce sujet. Aussi, il est clair que ça aide pour beaucoup de chose !! Car enfin, je peux me permettre d’utiliser des tableaux dans mes formulaires, ce que je ne pouvais pas faire avant. :D

Donc, j’ai tout modifié afin que mes variables retourne des tableaux au lieu de simple variable et j’ai aussi remis ma table (db) en ordre.

Donc, ma table pour ma base :

Code : Tout sélectionner

CREATE TABLE download ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, dates DATE NOT NULL, heures TIME NOT NULL, nom VARCHAR(250) NOT NULL, description TEXT NOT NULL, fichier VARCHAR(250) NOT NULL, version VARCHAR(250), categorie VARCHAR(250) NOT NULL, type VARCHAR(250), age VARCHAR(250), style VARCHAR(250), objet VARCHAR(250), PRIMARY KEY (id) );

Mon formulaire de recherche :

Code : Tout sélectionner

<form action="" method="POST"> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr> <td align="left" valign="top" colspan="6"><b>Choisir une version</b></td> </tr> <tr> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_Sims2.jpg" border="0"><br /> <input type="checkbox" name="version[0]" value="sims2" class="checkbox"><br /> Sims2 </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_University.jpg" border="0"><br /> <input type="checkbox" name="version[1]" value="university" class="checkbox"><br /> University </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_NightLife.jpg" border="0"><br /> <input type="checkbox" name="version[2]" value="nightlife" class="checkbox"><br /> NightLife </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_ChrismasParty.jpg" border="0"><br /> <input type="checkbox" name="version[3]" value="chrismas" class="checkbox"><br /> Chrismas Party </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_OpenBusiness.jpg" border="0"><br /> <input type="checkbox" name="version[4]" value="business" class="checkbox"><br /> Open Business </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_FamilyFun.jpg" border="0"><br /> <input type="checkbox" name="version[5]" value="familyfun" class="checkbox"><br /> Family Fun </td> </tr> <tr> <td align="center" valign="top" colspan="6"> <br /> <br /> <table border="0" cellspacing="0" cellpadding="0"> <tr> <td align="left" valign="top"><img src="<?=$path;?>images/fourres/mini_Sims2.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_University.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_NightLife.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_ChrismasParty.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_OpenBusiness.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_FamilyFun.jpg" border="0" width="35" height="50"></td> </tr> </table> <input type="checkbox" name="version_all" value="all" class="checkbox"> Toutes les versions </td> </tr> </table> <br /> <br /> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" width="100%" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr><td align="left" valign="top" colspan="6"><b>Choisir le sexe</b></td></tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="type[0]" value="femme" class="checkbox"></td> <td align="left" valign="middle" width="32%">Femmes</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="type[1]" value="homme" class="checkbox"></td> <td align="left" valign="middle" width="32%">hommes</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="type_all" value="all" class="checkbox"></td> <td align="left" valign="middle" width="32%">Femmes & Hommes</td> </tr> </table> <br /> <br /> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" width="100%" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr><td align="left" valign="middle" colspan="6"><b>Choisir l'âge</b></td></tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age[0]" value="bambins" class="checkbox"></td> <td align="left" valign="middle" width="32%">Bambins</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age[1]" value="enfants" class="checkbox"></td> <td align="left" valign="middle" width="32%">Enfants</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age[2]" value="adolescents" class="checkbox"></td> <td align="left" valign="middle" width="32%">Adolescents</td> </tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age[3]" value="universitaires" class="checkbox"></td> <td align="left" valign="middle" width="32%">Universitaires</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age[4]" value="adultes" class="checkbox"></td> <td align="left" valign="middle" width="32%">Adultes</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age[5]" value="seniors" class="checkbox"></td> <td align="left" valign="middle" width="32%">Seniors</td> </tr> <tr> <td align="center" valign="middle" colspan="6"> <input type="checkbox" name="age_all" value="all" class="checkbox"> Tous les âges </td> </tr> </table> <br /> <br /> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" width="100%" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr><td align="left" valign="middle" colspan="6"><b>Choisir le styles vestimentaires</b></td></tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[0]" value="decontracte_haut" class="checkbox"></td> <td align="left" valign="middle">Décontractés Haut</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[1]" value="decontracte_bas" class="checkbox"></td> <td align="left" valign="middle">Décontractés Bas</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[2]" value="decontracte_2pc" class="checkbox"></td> <td align="left" valign="middle">Décontractés 2 pièces</td> </tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[3]" value="soiree" class="checkbox"></td> <td align="left" valign="middle">Soirées</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[4]" value="sousvetement" class="checkbox"></td> <td align="left" valign="middle">Sous-vêtements</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[5]" value="pyjamas" class="checkbox"></td> <td align="left" valign="middle">Pyjamas</td> </tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[6]" value="maillotdebain" class="checkbox"></td> <td align="left" valign="middle">Maillots de bains</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="style[7]" value="sport" class="checkbox"></td> <td align="left" valign="middle">Sports</td> <td align="right" valign="middle" width="1%">&nbsp;</td> <td align="left" valign="middle">&nbsp;</td> </tr> <tr> <td align="center" valign="middle" colspan="6"> <input type="checkbox" name="style_all" value="all" class="checkbox"> Tous les styles </td> </tr> </table> <br /> <br /> <p align="center"><input type="submit" value="Afficher"></p> </form>
et mon code avec ma requête :

Code : Tout sélectionner

// Inisialisations des varialbes $spaceTable = 3; $spaceSpacing = 3; $spacePadding = 3; $fichierNB = 0; $nom = ''; $version = array(); $version_all = ''; $type = array(); $type_all = ''; $age = array(); $age_all = ''; $style = array(); $style_all = ''; // Extractions des variables d'envois ($_POST & $_GET) if ($_POST) { extract($_POST); } if ($version_all == 'all') { $version = array('sims2','university','nightlife','chrismas','business','familyfun'); } if ($type_all == 'all') { $type = array('femme','homme'); } if ($age_all == 'all') { $age = array('bambins','enfants','adolescents','universitaires','adultes','seniors'); } if ($style_all == 'all') { $style = array('decontracte_haut','decontracte_bas','decontracte_2pc','soiree','sousvetement','pyjamas','maillotdebain','sport'); } if ($_POST) { $sql ='SELECT * FROM download WHERE categorie="vetements" AND ( style = "'.implode(';', $style).'" ) AND (version LIKE "'.implode('" || version LIKE "', $version).'") AND (type LIKE "'.implode('" || type LIKE "', $type).'") AND (age LIKE "'.implode('" || age LIKE "', $age).'") ORDER BY id DESC'; echo "<p><pre>$sql</pre></p>"; $sql = mysql_query($sql, $db); echo '<br />'.$sql.'<br />'.mysql_error().'<br />'; $fichierNB = mysql_num_rows($sql); if ($fichierNB == 0) { ?>Aucun téléchargements n'est disponibles pour le moment.<? } while ($row = mysql_fetch_array($sql)) { extract($row); echo $nom.'<br />Version : '.$version.'<br />Type : '.$type.'<br />Age : '.$age.'<br />Style : '.$style.'<br /><br /><br />'; } }

Cependant, le résultat de ma requête n’affiche toujours pas le bon résultat, pourtant lorsque je visualise ma requête, elle semble tout à fait correcte… En faite, j’ai remarqué que cela venait du bout de requête :

Code : Tout sélectionner

AND ( style = "'.implode(', ', $style).'" )
A vrais dire, si l’on a un vêtement qui a uniquement "sport" et un autre qui a "sport;soiree", si l’on sélectionne uniquement "sport" le vetement qui se présente sous "sport;soiree" ne s’affichera pas. Donc, j’ai modifié la requête comme suit :

Code : Tout sélectionner

$sql ='SELECT * FROM download WHERE categorie="vetements" AND (version LIKE "'.implode('" || version LIKE "', $version).'") AND (type LIKE "'.implode('" || type LIKE "', $type).'") AND (age LIKE "'.implode('" || age LIKE "', $age).'") AND (style LIKE "'.implode('" || style LIKE "', $style).'") ORDER BY id DESC';
Mais apparemment, le même problème est toujours présent… J’ai donc essayé de changer les || par des OR, mais rien ne change au résultat. Ça m’a donné l’impression que je devais décoller les mots séparé par des ; donc, j'ai changé les ; par des , et un espace suivant la virgule, mais après mon test, rien ne change non plus… Je n’obtiens toujours pas les bonnes réponses sur l’affichage des données de la db. Ce que je trouve hallucinant, c’est que ma requête semble pourtant correcte !? Enfin, je ne sais pas ce que toi tu en penses ?

par sadeq » 06 sept. 2006, 14:11

Commençons par "le problème" avec le formulaire. J'ai constaté d'ailleurs avant ta façon de définir les options de même type et cela ne m'a pas convenu vu qu'il existe une autre façon de faire beaucoup mieux et simple à programmer.

Par l'exemple on comprend mieux:
pour les options de choix de sexe par exemple, j'écrirai :

Code : Tout sélectionner

<input type="checkbox" name="type[0]" value="femme"> Femme <input type="checkbox" name="type[1]" value="homme"> Homme
Remarque que mes options ont le même nom exprimé sous forme de tableau avec []. Ici c'est un tableau de 2 cases 0 et 1.
Avec cette méthode php reçoit une variable $type sous forme de tableau qui ne contient que les cases/options sélectionnées
Le tableau reçu est donc : $type[0] = "femme" et/ou $type[1] = "homme" selon la sélection :
  • Si l'on sélectionne les deux : $type[0] = "femme" et $type[1] = "homme"
    Si l'on sélectionne femme : $type[0] = "femme" ($type[1] n'est pas transmise)
    Si l'on sélectionne homme : $type[1] = "homme" ($type[0] n'est pas transmise)
Vérifie cette méthode et réécrit si tu veux bien ton formulaire et ton programme php en conséquence tu vas voir ça va simplifier certaine choses.

Maintenant le principal casse-tête : les styles véstimentaires.
Dans la même optique et avec la méthode précédente on doit pouvoir manipuler un tableau $style qui contient toutes les options/styles sélectionnées mais coté base de données je te propose pour ne pas compliquer la structure de ta table de déclarer un seul champs "style" varchar(255) qui contiendra une suite de styles séparés par une virgule ou un point-virgule (selon le standard des listes) puisque comme ça php peut exploiter ce champ en utilisant un "explode" pour le transformer en tableau $style ou inversement "implode" pour transformer le tableau $style en chaine équivalente au champ de la table.

Le schèma logique de cette solution est le suivant :
Côté BD (table)
Champ "style" varchar(255)
Une valeur possible : "decontracte_haut;soiré"
Une autre valeur possible : "decontracte_bas;maillotdebain;sport"
Les valeurs possibles sont séparées par un point-virgule (c'est un choix)

Coté php (dans la requête SQL)
Pour les 4 tableaus $style, $version, $type et $age, un implode écrit automatiquement la chaîne de la condition.
$sql ='SELECT * FROM download WHERE categorie="vetements"  
AND ( style = "'.implode(';', $style).'" ) 

AND (version LIKE "'.implode('" || version LIKE "', $version).'")  

AND (type LIKE "'.implode('" || type LIKE "', $type).'")  
  
AND (age LIKE "'.implode('" || age LIKE "', $age).'")   
  
ORDER BY id DESC';
voir la fonction implode() qui permet ici d'assembler sous forme de chaîne les valeurs contenues dans le tableau $style en les séparant par un point-virgule

Coté html (dans le formulaire)

Code : Tout sélectionner

<input type="checkbox" name="style[0]" value="decontracte_haut"> decontracte haut <input type="checkbox" name="style[1]" value="decontracte_bas"> decontracte bas <input .... .... etc.

par RinaBK » 06 sept. 2006, 12:50

Heu, tout d'abord tu as une erreur de copie/coller de la variable $decontracte_2pc dans ta requête :
Ooh oui !!! Effectivement, j’ai de nouveau mal recopié ma requête… Décidément, cette erreur me poursuit ! :roll:

…Moi je persiste à penser que le problème est dans la logique des types de vétements.
Oui, tout comme toi, je le pense aussi !! C’est ce petit morceau de requête qui pause problème…

Je ne vois pas pourquoi tu ne les as pas traité comme les autres critères (version, age et sexe)
Moi à ta place j'utiliserai un champ "type_vetement" ou "type" tout simplement qui peut avoir différentes valeurs : decontracte_haut, decontracte_bas ...
Puisque l'utilisateur choisi un ou plusieurs types de vetement quand il cherche les articles de catégorie "vetements"
Ce qui réduit les champs de la table, répond mieux à la logique de sélection exclusive et se cadre mieux avec le rôle de la table où un enregistrement a une catégorie qui n'est pas toujours "vetements" et un type. Et c'est simplement dans le cas où la catégorie est "vetements" qu'on peut parler de types : decontracte_haut, decontracte_bas, decontracte_2pc, soiree, sousvetement, pyjamas, maillotdebain et sport.
Oui, tu as entièrement raison ! D’ailleurs, au départ, c’est exactement ce que je voulais faire. Seulement, lorsque j’ai créé ma page d’enregistrement des vêtements, je me suis rendue compte que lorsque l’on utilise des cases à cocher, le formulaire prend en compte uniquement la dernière case à coché. Le problème dans le style vestimentaire, c’est qu’un vêtements peut être à la fois une tenue décontracté 2 pièces et à la fois une tenue de soirée… C’est ce qui m’a compliqué les choses.

Dans mon formulaire d’enregistrement, tous les autres champs sont des boutons radio, ce qui fait que 1 seule saisie est demandé… En revanche pour le style vestimentaire, je dois utiliser des cases à cocher… Donc, suite à cela, j’ai du modifier ma table afin d’avoir 1 champs pour chaque style vestimentaire… Et je dois t’avouer que de devoir modifier ma table ne m’enchantais vraiment pas du tout ! Car à présent, je trouve cette table beaucoup trop grande et je n’aime pas trop ça… D’ailleurs, voici ma table avant le changement :

Code : Tout sélectionner

CREATE TABLE download ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, dates DATE NOT NULL, heures TIME NOT NULL, nom VARCHAR(250) NOT NULL, description TEXT NOT NULL, fichier VARCHAR(250) NOT NULL, version VARCHAR(250), categorie VARCHAR(250) NOT NULL, type VARCHAR(250), age VARCHAR(250), style VARCHAR(250), objet VARCHAR(250), PRIMARY KEY (id) );
Comme tu le constateras, elle était bien mieux comme cela. Donc, j’ai du m’amuser à ajouter à cette maudite table, les champs pour les styles vestimentaires :

Code : Tout sélectionner

ALTER TABLE download ADD decontracte_haut INT(1) UNSIGNED AFTER age, ADD decontracte_bas INT(1) UNSIGNED AFTER decontracte_haut, ADD decontracte_2pc INT(1) UNSIGNED AFTER decontracte_bas, ADD soiree INT(1) UNSIGNED AFTER decontracte_2pc, ADD sousvetement INT(1) UNSIGNED AFTER soiree, ADD pyjamas INT(1) UNSIGNED AFTER sousvetement, ADD maillotdebain INT(1) UNSIGNED AFTER pyjamas, ADD sport INT(1) UNSIGNED AFTER maillotdebain;
Et supprimer le champ style. Il est clair que je préfère grandement revenir à ma table d’origine ! Mais si je reviens à ma table d’origine, comment vais-je faire l’enregistrement du champ style, si mon formulaire prend en compte uniquement le dernier choix coché ?

par sadeq » 06 sept. 2006, 11:59

Heu, tout d'abord tu as une erreur de copie/coller de la variable $decontracte_2pc dans ta requête :
if ($_POST) {
$sql = 'SELECT * FROM download WHERE categorie="vetements"
AND ( decontracte_haut='.$decontracte_haut.'
|| decontracte_bas='.$decontracte_bas.'
|| decontracte_2pc='.$decontracte_2pc.'
|| soiree='.$decontracte_2pc.'
|| sousvetement='.$decontracte_2pc.'
|| pyjamas='.$decontracte_2pc.'
|| maillotdebain='.$decontracte_2pc.'
|| sport='.$decontracte_2pc.' )
Mais ce n'est pas ça le problème qui me tracasse !
Moi je persiste à penser que le problème est dans la logique des types de vétements.
Dans cette forme:
  • decontracte_haut='.$decontracte_haut.'
    || decontracte_bas='.$decontracte_bas.'
    || decontracte_2pc='.$decontracte_2pc.'
    || soiree='.$soiree.'
    || sousvetement='.$sousvetement.'
    || pyjamas='.$pyjamas.'
    || maillotdebain='.$maillotdebain.'
    || sport='.$sport.'
Je ne vois pas pourquoi tu ne les as pas traité comme les autres critères (version, age et sexe)
Moi à ta place j'utiliserai un champ "type_vetement" ou "type" tout simplement qui peut avoir différentes valeurs : decontracte_haut, decontracte_bas ...
Puisque l'utilisateur choisi un ou plusieurs types de vetement quand il cherche les articles de catégorie "vetements"
Ce qui réduit les champs de la table, répond mieux à la logique de sélection exclusive et se cadre mieux avec le rôle de la table où un enregistrement a une catégorie qui n'est pas toujours "vetements" et un type. Et c'est simplement dans le cas où la catégorie est "vetements" qu'on peut parler de types : decontracte_haut, decontracte_bas, decontracte_2pc, soiree, sousvetement, pyjamas, maillotdebain et sport.

La requête devient :

Code : Tout sélectionner

SELECT * FROM download WHERE categorie="vetements" AND ( type_vetement='.$decontracte_haut.' || type_vetement='.$decontracte_bas.' || type_vetement='.$decontracte_2pc.' || type_vetement='.$soiree.' || type_vetement='.$sousvetement.' || type_vetement='.$pyjamas.' || type_vetement='.$maillotdebain.' || type_vetement='.$sport.' ) AND (version LIKE "'.$version_00.'" || version LIKE "'.$version_01.'" || version LIKE "'.$version_02.'" || version LIKE "'.$version_03.'" || version LIKE "'.$version_04.'" || version LIKE "'.$version_05.'") AND (type LIKE "'.$type_00.'" || type LIKE "'.$type_01.'") AND (age LIKE "'.$age_00.'" || age LIKE "'.$age_01.'"|| age LIKE "'.$age_02.'"|| age LIKE "'.$age_03.'"|| age LIKE "'.$age_04.'"|| age LIKE "'.$age_05.'") ORDER BY id DESC
Où le champ "type_vetement" est un varchar qui peut contenir les valeurs: decontracte_haut, decontracte_bas, decontracte_2pc, soiree, sousvetement, pyjamas, maillotdebain et sport.

Ceci dit il faut modifier la structure de la table, les initialisations des variables php et la requête SQL.

Alors pourquoi je dis ça? Pour la simple raison que ton programme actuel est bons ta requête est telle qu'elle est exprimée retourne toujours tous les enregistrements ou rien car effectivement ce sont les types de vétements qui faussent cette requête puisqu'ils existent toujours en même temps 0 ou 1 ça change rien.
Tu te rends compte, quand l'utilisateur ne choisi pas un type de vétement ce dernier est à 0, mais selon la requête tous les enregistrements où ce type est à 0 seront sélectionnés c'est un problème non!

par RinaBK » 05 sept. 2006, 23:15

Tout d’abord, je te remercie grandement pour ton aide qui m’est très précieuse !!
Le formulaire fonctionne très bien mais manque le marquage des options par défaut (recommandé)
Oui, effet… Au départ, j’avais mis les champs "Tout sélectionné (all)" sélectionné par défaut. Mais lors de mes nombreux test pour ma requête, j’ai remarqué que j’avais tendance à oublier d’enlever le "Tout sélectionné" sur certaine catégorie lorsque je voulais préciser autre chose… Donc, je me suis dis, que dès que ma requête est juste, je ferais un petit contrôle qui obligera le visiteur à sélectionner obligatoirement au minimum un champ à chaque sélection. Mais ça, c’est un truc que je peu faire en tout dernier.

Par contre j'ai modifié les initialisations des variables numériques qui doivent être à 0 ou 1 selon ta volonté.
Oui, je trouve que c’est une très bonne chose !! Merci d’y avoir penser.
Ainsi, que le test sur $style_all et non $age_all (ça doit être une erreur de copie/coller) pour mettre ces variables à 1.
Oup’s… Même pas ! J’ai réellement oublié de changer ma variable dans mon code :oops: Rolalala… Je suis impardonnable et honteuse lol :oops: :oops: Merci pour cette correction !!


Le résultat est que la requête marche bien quand je sélectionne tous les styles vestimentaires mais dans le cas contraire elle ne retourne rien. C'est normal car ses styles sont les fameux champs numériques qui valent soit 1 ou 0 et qui sont combinés dans des conditions par un AND ce qui veut dire que si au moins un style est à 0 la requête ne retourne rien
Voilà ! C’est exactement ce que je me suis rendue compte avec les nombreux tests que j’ai fait… Et justement, je n’arrive pas à trouver la solution pour que cela passe même si l’une des valeur numérique soit à 0… Soit la requête m'affiche tous les résultat, soit elle ne m'affiche rien du tout :roll:

pour quoi proposer le choix des styles vestimentaires (et marquer en plus que c'est facultatif) alors qu'elles sont obligatoires au fonctionnement de la requête ?
Oula !! Très bonne remarque !!! …Et grossière erreur de ma part, vu qu’il est impératif que au minimum 1 champ soit coché pour que la recherche soit effective. Surtout que j’ai placé le champ "Tout sélectionné" qui permet d’afficher tout les styles… Je m’empresse de supprimer ce facultatif qui n’a rien à faire là ! Merci pour cette remarque !!




En ce qui concerne les corrections des codes, rien a signalé, tu as très bien fait et je t’en remercie !!! En revanche, j’ai testé la requête, mais apparemment, elle ne fonctionne toujours pas… Lorsque je sélectionne "Tous les styles" pour le style vestimentaire, rien à dire, j’ai tout qui s’affiche. Mais lorsque je sélectionne 1 ou plusieurs styles, là aussi j’ai tout qui s’affiche, même les styles qui ne devraient pas s’afficher…

Par la suite, j’ai légèrement modifié la requète, hitoire de faire d’autre tests. J’ai changé les || par OR comme ceci :

Code : Tout sélectionner

$sql = 'SELECT * FROM download WHERE categorie="vetements" AND ( decontracte_haut='.$decontracte_haut.' OR decontracte_bas='.$decontracte_bas.' OR decontracte_2pc='.$decontracte_2pc.' OR soiree='.$decontracte_2pc.' OR sousvetement='.$decontracte_2pc.' OR pyjamas='.$decontracte_2pc.' OR maillotdebain='.$decontracte_2pc.' OR sport='.$decontracte_2pc.' ) AND (version LIKE "'.$version_00.'" || version LIKE "'.$version_01.'" || version LIKE "'.$version_02.'" || version LIKE "'.$version_03.'" || version LIKE "'.$version_04.'" || version LIKE "'.$version_05.'") AND (type LIKE "'.$type_00.'" || type LIKE "'.$type_01.'") AND (age LIKE "'.$age_00.'" || age LIKE "'.$age_01.'"|| age LIKE "'.$age_02.'"|| age LIKE "'.$age_03.'"|| age LIKE "'.$age_04.'"|| age LIKE "'.$age_05.'") ORDER BY id DESC';
Mais j’obtiens exactement le même résultat que si je n’avais rien changé de la requête que tu m’a donné. A croire que la db ne veut vraiment pas faire ce qu'on aimerait qu'elle fasse ^^

Bon, vu que j'ai modifié quelque trics sur mon programme, je te le recopie afin que tu vois le résultat :

La db :

Code : Tout sélectionner

CREATE TABLE download ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, dates DATE NOT NULL, heures TIME NOT NULL, nom VARCHAR(250) NOT NULL, description TEXT NOT NULL, fichier VARCHAR(250) NOT NULL, version VARCHAR(250), categorie VARCHAR(250) NOT NULL, type VARCHAR(250), age VARCHAR(250), decontracte_haut INT(1) UNSIGNED, decontracte_bas INT(1) UNSIGNED, decontracte_2pc INT(1) UNSIGNED, soiree INT(1) UNSIGNED, sousvetement INT(1) UNSIGNED, pyjamas INT(1) UNSIGNED, maillotdebain INT(1) UNSIGNED, sport INT(1) UNSIGNED, objet VARCHAR(250), PRIMARY KEY (id) ); INSERT INTO `download` VALUES (8, '2006-08-29', '01:13:10', 'Asia (rose)', 'Vu que le jeu de base des Sims2 vous propose très peu le model de la robe asiatique, voici une recoloration de cette robe en rose. Cela vous permettra d’avoir un peu plus de choix concernant cette magnifique robe asiatique.\r\n\r\n', 'asia_000_000', 'sims2', 'vetements', 'femme', 'adultes', 0, 0, 1, 0, 0, 0, 0, 0, ''); INSERT INTO `download` VALUES (9, '2006-08-29', '05:13:48', 'Asia (orange)', 'Voici la rose asiatique que vous propose le jeu de base. La différence avec la robe que vous connessez déjà, c’est que c’elle-ci est une recoloration en orange. Grâce à cette recoloration, vous allez enfin avoir un peu plus de choix sur les couleurs de cette magnifique robe asiatique.', 'asia_000_001', 'business', 'vetements', 'femme', 'adultes', 0, 0, 1, 0, 0, 0, 0, 0, ''); INSERT INTO `download` VALUES (10, '2006-08-29', '05:17:35', 'Asia (Jaune)', 'Comme vous l’avez très certainement remarqué, cette magnifique robe asiatique est une recoloration de c’elle que le jeu de base vous propose. Grâce à cette robe, vous aurez d’avantage de choix concernant les couleurs proposées par cette robe si jolie.', 'asia_000_002', 'nightlife', 'vetements', 'femme', 'adultes', 0, 0, 1, 0, 0, 0, 0, 0, '');
la page de recherche :

Code : Tout sélectionner

// Inisialisations des varialbes $spaceTable = 3; $spaceSpacing = 3; $spacePadding = 3; $fichierNB = 0; $nom = ''; $version = ''; $version_all = ''; $version_00 = ''; $version_01 = ''; $version_02 = ''; $version_03 = ''; $version_04 = ''; $version_05 = ''; $type = ''; $type_all = ''; $type_00 = ''; $type_01 = ''; $age = ''; $age_all = ''; $age_00 = ''; $age_01 = ''; $age_02 = ''; $age_03 = ''; $age_04 = ''; $age_05 = ''; $style_all = ''; $decontracte_haut = 0; $decontracte_bas = 0; $decontracte_2pc = 0; $soiree = 0; $sousvetement = 0; $pyjamas = 0; $maillotdebain = 0; $sport = 0; // Extractions des variables d'envois ($_POST & $_GET) if ($_POST) { extract($_POST); } if ($version_all == 'all') { $version_00 = 'sims2'; $version_01 = 'university'; $version_02 = 'nightlife'; $version_03 = 'chrismas'; $version_04 = 'business'; $version_05 = 'familyfun'; } if ($type_all == 'all') { $type_00 = 'femme'; $type_01 = 'homme'; } if ($age_all == 'all') { $age_00 = 'bambins'; $age_01 = 'enfants'; $age_02 = 'adolescents'; $age_03 = 'universitaires'; $age_04 = 'adultes'; $age_05 = 'seniors'; } if ($style_all == 'all') { $decontracte_haut = 1; $decontracte_bas = 1; $decontracte_2pc = 1; $soiree = 1; $sousvetement = 1; $pyjamas = 1; $maillotdebain = 1; $sport = 1; } if ($_POST) { $sql = 'SELECT * FROM download WHERE categorie="vetements" AND ( decontracte_haut='.$decontracte_haut.' || decontracte_bas='.$decontracte_bas.' || decontracte_2pc='.$decontracte_2pc.' || soiree='.$decontracte_2pc.' || sousvetement='.$decontracte_2pc.' || pyjamas='.$decontracte_2pc.' || maillotdebain='.$decontracte_2pc.' || sport='.$decontracte_2pc.' ) AND (version LIKE "'.$version_00.'" || version LIKE "'.$version_01.'" || version LIKE "'.$version_02.'" || version LIKE "'.$version_03.'" || version LIKE "'.$version_04.'" || version LIKE "'.$version_05.'") AND (type LIKE "'.$type_00.'" || type LIKE "'.$type_01.'") AND (age LIKE "'.$age_00.'" || age LIKE "'.$age_01.'"|| age LIKE "'.$age_02.'"|| age LIKE "'.$age_03.'"|| age LIKE "'.$age_04.'"|| age LIKE "'.$age_05.'") ORDER BY id DESC'; $sql = mysql_query($sql, $db); echo '<br />'.$sql.'<br />'.mysql_error().'<br />'; $fichierNB = mysql_num_rows($sql); if ($fichierNB == 0) { ?>Aucun téléchargements n'est disponibles pour le moment.<? } while ($row = mysql_fetch_array($sql)) { extract($row); echo $nom.' / '.$version.'<br />'; } }

par sadeq » 05 sept. 2006, 16:39

Alors, j'ai fais le test de ton programme et voici mes constations et questions :
  • 1. Le formulaire fonctionne très bien mais manque le marquage des options par défaut (recommandé)

    2. Par contre j'ai modifié les initialisations des variables numériques qui doivent être à 0 ou 1 selon ta volonté. Ainsi, que le test sur $style_all et non $age_all (ça doit être une erreur de copie/coller) pour mettre ces variables à 1.

    3. Pour tester j'ai créé la table download, l'ai rempli avec 2 enregistrements de test et affiché la requête SQL telle qu'elle se présente à l'exécution après avoir choisi les critères à partir du formulaire et cliqué sur le bouton afficher.
Le résultat est que la requête marche bien quand je sélectionne tous les styles vestimentaires mais dans le cas contraire elle ne retourne rien. C'est normal car ses styles sont les fameux champs numériques qui valent soit 1 ou 0 et qui sont combinés dans des conditions par un AND ce qui veut dire que si au moins un style est à 0 la requête ne retourne rien

Mais ma question est : pour quoi proposer le choix des styles vestimentaires (et marquer en plus que c'est facultatif) alors qu'elles sont obligatoires au fonctionnement de la requête ?

A mon avis ces styles vestimentaires doivent être combinés dans la requête avec un OR au même titre que les versions, les types et les âges
pour sélectionner les vétements dont au moins un style est choisi et ainsi ne pas obliger l'utilisateur de sélectionner tous les styles pour sélectionner des vétements.

Sans oublier que peut être faudrait-il (et moi je le recommande) marquer sur le formulaire les options par défaut. Je te propose d'activer les cases "tous les ..." par défaut. Comme ça dans le cas les styles vestimentaires par défaut l'option "tous les styles" est activées.


Voici le test que j'ai fais:

Code : Tout sélectionner

-- -- Structure de la table `download` -- CREATE TABLE `download` ( `id` bigint(20) unsigned NOT NULL auto_increment, `dates` date NOT NULL, `heures` time NOT NULL, `nom` varchar(250) NOT NULL, `description` text NOT NULL, `fichier` varchar(250) NOT NULL, `version` varchar(250) default NULL, `categorie` varchar(250) NOT NULL, `type` varchar(250) default NULL, `age` varchar(250) default NULL, `decontracte_haut` int(1) unsigned default NULL, `decontracte_bas` int(1) unsigned default NULL, `decontracte_2pc` int(1) unsigned default NULL, `soiree` int(1) unsigned default NULL, `sousvetement` int(1) unsigned default NULL, `pyjamas` int(1) unsigned default NULL, `maillotdebain` int(1) unsigned default NULL, `sport` int(1) unsigned default NULL, `objet` varchar(250) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Contenu de la table `download` -- INSERT INTO `download` (`id`, `dates`, `heures`, `nom`, `description`, `fichier`, `version`, `categorie`, `type`, `age`, `decontracte_haut`, `decontracte_bas`, `decontracte_2pc`, `soiree`, `sousvetement`, `pyjamas`, `maillotdebain`, `sport`, `objet`) VALUES (1, '2006-09-05', '10:00:00', 'nom1', 'd1', 'f1', 'sims2', 'vetements', 'femme', 'bambins', 1, 1, 1, 1, 1, 1, 1, 1, 'o1'); INSERT INTO `download` (`id`, `dates`, `heures`, `nom`, `description`, `fichier`, `version`, `categorie`, `type`, `age`, `decontracte_haut`, `decontracte_bas`, `decontracte_2pc`, `soiree`, `sousvetement`, `pyjamas`, `maillotdebain`, `sport`, `objet`) VALUES (2, '2006-09-03', '14:00:00', 'nom2', 'd2', 'f2', 'university', 'vetements', 'homme', 'enfants', 1, 1, 1, 1, 1, 1, 1, 1, 'o2');
Dans le formulaire ajouter l'attribut "CHECKED" dans les options jugées actives par défaut.


Voici le programme PHP :
<?php
//   Inisialisations des varialbes 
$spaceTable = 3; 
$spaceSpacing = 3; 
$spacePadding = 3; 

$fichierNB = 0; 
$nom = ''; 

$version = ''; 
$version_all = ''; 
$version_00 = ''; 
$version_01 = ''; 
$version_02 = ''; 
$version_03 = ''; 
$version_04 = ''; 
$version_05 = ''; 

$type = ''; 
$type_all = ''; 
$type_00 = ''; 
$type_01 = ''; 

$age = ''; 
$age_all = ''; 
$age_00 = ''; 
$age_01 = ''; 
$age_02 = ''; 
$age_03 = ''; 
$age_04 = ''; 
$age_05 = ''; 

$style_all = ''; 
$decontracte_haut = 0;  //Partie Modifiée
$decontracte_bas = 0; 
$decontracte_2pc = 0; 
$soiree = 0; 
$sousvetement = 0; 
$pyjamas = 0; 
$maillotdebain = 0; 
$sport = 0; 



//   Extractions des variables d'envois ($_POST & $_GET) 
if ($_POST) { extract($_POST); } 



if ($version_all == 'all') { 
   $version_00 = 'sims2'; 
   $version_01 = 'university'; 
   $version_02 = 'nightlife'; 
   $version_03 = 'chrismas'; 
   $version_04 = 'business'; 
   $version_05 = 'familyfun'; 
} 
if ($type_all == 'all') { 
   $type_00 = 'femme'; 
   $type_01 = 'homme'; 
} 
if ($age_all == 'all') { 
   $age_00 = 'bambins'; 
   $age_01 = 'enfants'; 
   $age_02 = 'adolescents'; 
   $age_03 = 'universitaires'; 
   $age_04 = 'adultes'; 
   $age_05 = 'seniors'; 
} 
if ($style_all == 'all') { //Modifié 
   $decontracte_haut = 1; 
   $decontracte_bas = 1; 
   $decontracte_2pc = 1; 
   $soiree = 1; 
   $sousvetement = 1; 
   $pyjamas = 1; 
   $maillotdebain = 1; 
   $sport = 1; 
}


//Requête SQL modifiée pour sélectionner les vétements dont au moins un style est choisi
$sql = 'SELECT * FROM download WHERE categorie="vetements" 
AND ( decontracte_haut='.$decontracte_haut.'  
|| decontracte_bas='.$decontracte_bas.'  
|| decontracte_2pc='.$decontracte_2pc.'  
|| soiree='.$soiree.'  
|| sousvetement='.$sousvetement.'  
|| pyjamas='.$pyjamas.'  
|| maillotdebain='.$maillotdebain.'  
|| sport='.$sport.' ) 

AND (version LIKE "'.$version_00.'" || version LIKE "'.$version_01.'" 
|| version LIKE "'.$version_02.'" || version LIKE "'.$version_03.'" 
|| version LIKE "'.$version_04.'" || version LIKE "'.$version_05.'") 

AND (type LIKE "'.$type_00.'" || type LIKE "'.$type_01.'")
 
AND (age LIKE "'.$age_00.'" || age LIKE "'.$age_01.'"|| 
age LIKE "'.$age_02.'"|| age LIKE "'.$age_03.'"|| age LIKE "'.$age_04.'"|| age LIKE "'.$age_05.'") 
 
ORDER BY id DESC';

//Affichage de SQl pour le test
echo "<p><pre>$sql</pre>";

?>

par RinaBK » 04 sept. 2006, 17:42

Ecoutes, je ne suis pas d'accord sur LIKE qui n'est pas justifié dans ton cas et je ne comprends pas pourquoi tu juge que OR ne fonctionne pas!
En faite, ce n’est pas un jugement… C’est que j’avais déjà essayé avec le OR et cela n’avait pas fonctionné dans les résultats… Mais tout comme toi, j’avais commencé par mettre OR en premier c’est qu’après que j’ai du changer avec les || suite au résultat envoyé par la db. En mettant les || ça a marché donc j'ai laissé.
J'ai modifié la première partie où d'ailleurs les champs sont numériques et donc il ne faut pas utiliser les "" (voir mon ex-post).
oup's... :oops: Effectivement, je n'avais vraiment pas fait attention aux " et je m'en excuse très sincèrement ! Mais malheureusement, même en changeant les " cela ne fonctionne pas...

Code : Tout sélectionner

$sql = 'SELECT * FROM download WHERE categorie="vetements" AND decontracte_haut='.$decontracte_haut.' AND decontracte_bas='.$decontracte_bas.' AND decontracte_2pc='.$decontracte_2pc.' AND soiree='.$decontracte_2pc.' AND sousvetement='.$decontracte_2pc.' AND pyjamas='.$decontracte_2pc.' AND maillotdebain='.$decontracte_2pc.' AND sport='.$decontracte_2pc.' AND ( (version LIKE "'.$version_00.'" || version LIKE "'.$version_01.'" || version LIKE "'.$version_02.'" || version LIKE "'.$version_03.'" || version LIKE "'.$version_04.'" || version LIKE "'.$version_05.'") AND (type LIKE "'.$type_00.'" || type LIKE "'.$type_01.'") AND (age LIKE "'.$age_00.'" || age LIKE "'.$age_01.'"|| age LIKE "'.$age_02.'"|| age LIKE "'.$age_03.'"|| age LIKE "'.$age_04.'"|| age LIKE "'.$age_05.'") ) ORDER BY id DESC';
Je ne sais pas si ça peut t'aider, mais voici le formlaire d'envois :

Code : Tout sélectionner

<form action="" method="POST"> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr> <td align="left" valign="top" colspan="6"><b>Choisir une version</b> (facultatif)</td> </tr> <tr> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_Sims2.jpg" border="0"><br /> <input type="checkbox" name="version_00" value="sims2" class="checkbox"><br /> Sims2 </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_University.jpg" border="0"><br /> <input type="checkbox" name="version_01" value="university" class="checkbox"><br /> University </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_NightLife.jpg" border="0"><br /> <input type="checkbox" name="version_02" value="nightlife" class="checkbox"><br /> NightLife </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_ChrismasParty.jpg" border="0"><br /> <input type="checkbox" name="version_03" value="chrismas" class="checkbox"><br /> Chrismas Party </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_OpenBusiness.jpg" border="0"><br /> <input type="checkbox" name="version_04" value="business" class="checkbox"><br /> Open Business </td> <td align="center" valign="top"> <img src="<?=$path;?>images/fourres/mini_FamilyFun.jpg" border="0"><br /> <input type="checkbox" name="version_05" value="familyfun" class="checkbox"><br /> Family Fun </td> </tr> <tr> <td align="center" valign="top" colspan="6"> <br /> <br /> <table border="0" cellspacing="0" cellpadding="0"> <tr> <td align="left" valign="top"><img src="<?=$path;?>images/fourres/mini_Sims2.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_University.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_NightLife.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_ChrismasParty.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_OpenBusiness.jpg" border="0" width="35" height="50"><img src="<?=$path;?>images/fourres/mini_FamilyFun.jpg" border="0" width="35" height="50"></td> </tr> </table> <input type="checkbox" name="version_all" value="all" class="checkbox"> Toutes les versions </td> </tr> </table> <br /> <br /> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" width="100%" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr><td align="left" valign="top" colspan="6"><b>Choisir le sexe</b> (facultatif)</td></tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="type_00" value="femme" class="checkbox"></td> <td align="left" valign="middle" width="32%">Femmes</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="type_01" value="homme" class="checkbox"></td> <td align="left" valign="middle" width="32%">hommes</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="type_all" value="all" class="checkbox"></td> <td align="left" valign="middle" width="32%">Femmes & Hommes</td> </tr> </table> <br /> <br /> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" width="100%" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr><td align="left" valign="middle" colspan="6"><b>Choisir l'âge</b> (facultatif)</td></tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age_00" value="bambins" class="checkbox"></td> <td align="left" valign="middle" width="32%">Bambins</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age_01" value="enfants" class="checkbox"></td> <td align="left" valign="middle" width="32%">Enfants</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age_02" value="adolescents" class="checkbox"></td> <td align="left" valign="middle" width="32%">Adolescents</td> </tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age_03" value="universitaires" class="checkbox"></td> <td align="left" valign="middle" width="32%">Universitaires</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age_04" value="adultes" class="checkbox"></td> <td align="left" valign="middle" width="32%">Adultes</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="age_05" value="seniors" class="checkbox"></td> <td align="left" valign="middle" width="32%">Seniors</td> </tr> <tr> <td align="center" valign="middle" colspan="6"> <input type="checkbox" name="age_all" value="all" class="checkbox"> Tous les âges </td> </tr> </table> <br /> <br /> <table border="<?=$spaceTable;?>" cellspacing="<?=$spaceSpacing;?>" cellpadding="<?=$spacePadding;?>" width="100%" bordercolorlight="#A4D1FF" bordercolordark="#6FB7FF"> <tr><td align="left" valign="middle" colspan="6"><b>Choisir le styles vestimentaires</b> (facultatif)</td></tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="decontracte_haut" value="1" class="checkbox"></td> <td align="left" valign="middle">Décontractés Haut</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="decontracte_bas" value="1" class="checkbox"></td> <td align="left" valign="middle">Décontractés Bas</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="decontracte_2pc" value="1" class="checkbox"></td> <td align="left" valign="middle">Décontractés 2 pièces</td> </tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="soiree" value="1" class="checkbox"></td> <td align="left" valign="middle">Soirées</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="sousvetement" value="1" class="checkbox"></td> <td align="left" valign="middle">Sous-vêtements</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="pyjamas" value="1" class="checkbox"></td> <td align="left" valign="middle">Pyjamas</td> </tr> <tr> <td align="right" valign="middle" width="1%"><input type="checkbox" name="maillotdebain" value="1" class="checkbox"></td> <td align="left" valign="middle">Maillots de bains</td> <td align="right" valign="middle" width="1%"><input type="checkbox" name="sport" value="1" class="checkbox"></td> <td align="left" valign="middle">Sports</td> <td align="right" valign="middle" width="1%">&nbsp;</td> <td align="left" valign="middle">&nbsp;</td> </tr> <tr> <td align="center" valign="middle" colspan="6"> <input type="checkbox" name="style_all" value="all" class="checkbox"> Tous les styles </td> </tr> </table> <br /> <br /> <p align="center"><input type="submit" value="Afficher"></p> </form>

...et l'initialisations des variables, ainsi que la permutation des "Tous les champs" :

Code : Tout sélectionner

// Inisialisations des varialbes $spaceTable = 3; $spaceSpacing = 3; $spacePadding = 3; $fichierNB = 0; $nom = ''; $version = ''; $version_all = ''; $version_00 = ''; $version_01 = ''; $version_02 = ''; $version_03 = ''; $version_04 = ''; $version_05 = ''; $type = ''; $type_all = ''; $type_00 = ''; $type_01 = ''; $age = ''; $age_all = ''; $age_00 = ''; $age_01 = ''; $age_02 = ''; $age_03 = ''; $age_04 = ''; $age_05 = ''; $style_all = ''; $decontracte_haut = ''; $decontracte_bas = ''; $decontracte_2pc = ''; $soiree = ''; $sousvetement = ''; $pyjamas = ''; $maillotdebain = ''; $sport = ''; // Extractions des variables d'envois ($_POST & $_GET) if ($_POST) { extract($_POST); } if ($version_all == 'all') { $version_00 = 'sims2'; $version_01 = 'university'; $version_02 = 'nightlife'; $version_03 = 'chrismas'; $version_04 = 'business'; $version_05 = 'familyfun'; } if ($type_all == 'all') { $type_00 = 'femme'; $type_01 = 'homme'; } if ($age_all == 'all') { $age_00 = 'bambins'; $age_01 = 'enfants'; $age_02 = 'adolescents'; $age_03 = 'universitaires'; $age_04 = 'adultes'; $age_05 = 'seniors'; } if ($age_all == 'all') { $decontracte_haut = 1; $decontracte_bas = 1; $decontracte_2pc = 1; $soiree = 1; $sousvetement = 1; $pyjamas = 1; $maillotdebain = 1; $sport = 1; }

Peut-être que l'erreur vient d'aileurs !? enfin, je ne sais pas, du moins cela fait tellement de temps que je suis là-dessus que j'ai l'impression de ne plus rien voir :(
En tout cas, merci encore de m'aider !! Car cela fait plusieurs jour que je suis coincée sur ce bout de code !

par sadeq » 04 sept. 2006, 15:21

Ecoutes, je ne suis pas d'accord sur LIKE qui n'est pas justifié dans ton cas et je ne comprends pas pourquoi tu juge que OR ne fonctionne pas!

NB: Attention || est un opérateur de concaténation de chaines binaire sous PostgreSQL.

J'ai modifié la première partie où d'ailleurs les champs sont numériques et donc il ne faut pas utiliser les "" (voir mon ex-post).

Dans la forme que j'ai donné dans mon post précédent, le format est juste reste maintenant de vérifier les erreurs logiques.
Pour ce faire il faut établir un jeu d'essai pertinent dans ta table et tester la requête directement avec des valeurs pertinentes. en suite généraliser avec des variables.

par RinaBK » 04 sept. 2006, 11:33

Je te remercie infiniement pour ta réponse, mais en faite, les morceau de requete que tu as corrigé fonctionnaient très bien... D'ailleurs, elle ne fonctionne pas correctement si je mets OR...

Le bout de requète qui ne fonctionnait pas et pour lequel j'ai besoin d'assisstance est le bout que tu as laisser :

Code : Tout sélectionner

AND decontracte_haut="'.$decontracte_haut.'" AND decontracte_bas="'.$decontracte_bas.'" AND decontracte_2pc="'.$decontracte_2pc.'" AND soiree="'.$soiree.'" AND sousvetement="'.$sousvetement.'" AND pyjamas="'.$pyjamas.'" AND maillotdebain="'.$maillotdebain.'" AND sport="'.$sport.'"
C'est sur ce bout là que j'ai un problème ! En plus, j'avais pas remarqué, mais j'ai mal recopié ma requète dans mon précédent message :oops: Mais cela ne change pas le problème, car la requete est juste dans mon fichier. Donc, c'est la partie en rouge qui serait à corriger :
$sql = 'SELECT * FROM download WHERE categorie="vetements" AND decontracte_haut="'.$decontracte_haut.'" AND decontracte_bas="'.$decontracte_bas.'" AND decontracte_2pc="'.$decontracte_2pc.'" AND soiree="'.$soiree.'" AND sousvetement="'.$sousvetement.'" AND pyjamas="'.$pyjamas.'" AND maillotdebain="'.$maillotdebain.'" AND sport="'.$sport.'" AND ( (version LIKE "'.$version_00.'" || version LIKE "'.$version_01.'" || version LIKE "'.$version_02.'" || version LIKE "'.$version_03.'" || version LIKE "'.$version_04.'" || version LIKE "'.$version_05.'") AND (type LIKE "'.$type_00.'" || type LIKE "'.$type_01.'") AND (age LIKE "'.$age_00.'" || age LIKE "'.$age_01.'"|| age LIKE "'.$age_02.'"|| age LIKE "'.$age_03.'"|| age LIKE "'.$age_04.'"|| age LIKE "'.$age_05.'") ) ORDER BY id DESC';

par sadeq » 04 sept. 2006, 10:50

Il faut utiliser l'opérateur OR au lieu de || et l'opérateur = au lieu de LIKE qui n'est pas justifié ici.

Tes conditions auront alors cette forme :
categorie="vetements"
AND decontracte_haut='.$decontracte_haut.'
AND decontracte_bas='.$decontracte_bas.'
AND decontracte_2pc='.$decontracte_2pc.'
AND soiree='.$soiree.'
AND sousvetement='.$sousvetement.'
AND pyjamas='.$pyjamas.'
AND maillotdebain='.$maillotdebain.'
AND sport='.$sport.'

AND
  • (
    version = "'.$version_00.'"
    OR version = "'.$version_01.'"
    OR version = "'.$version_02.'"
    OR version = "'.$version_03.'"
    OR version = "'.$version_04.'"
    OR version = "'.$version_05.'"
    )
AND
  • (
    type = "'.$type_00.'"
    OR type = "'.$type_01.'"
    )
AND
  • (
    age = "'.$age_00.'"
    OR age = "'.$age_01.'"
    OR age = "'.$age_02.'"
    OR age = "'.$age_03.'"
    OR age = "'.$age_04.'"
    OR age = "'.$age_05.'"
    )
Format général:
12 conditions jointes par AND dont les 3 dernières sont composées de jountures OR.
1 et 2 et 3 et 4 et 5 et 6 et 7 et 8 et 9 et (10) et (11) et (12)

tel que :
Une de 6 versions (10) = (10.1 ou 10.2 ou 10.3 ou 10.4 ou 10.5 ou 10.6)
Un de 2 types (11) = (11.1 ou 11.2)
Un de 6 ages (12) = (12.1 ou 12.2 ou 12.3 ou 12.4 ou 12.5 ou 12.6)

Etat général:
  • - Cette condition générale sera fausse si une des 12 conditions est fausse. Ce qui veut dire pour chacune des 3 dernières (10, 11 et 12) que toutes les sous-conditions jointes par OR sont fausses si la condition composée est fausse.

    - Cette condition générale sera vraie si toutes les 12 conditions sont vraies. Ce qui veut dire qu'une au moins des sous-conditions est vraie pour chacune des 3 dernières (10, 11 et 12)