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
?>
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é :
[quote]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[/quote]
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 : [b]style LIKE "%sport%"[/b]
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 :
[list]style = "sport;soiree"
style = "sport"
style = "decontracte_bas;sport;soiree"
style = "decontracte_bas;maillotdebain;sport"[/list]
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 :
[quote]$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 />';
}[/quote]
Suggestion de reformulation :
[php]
//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
[/php]
Voici donc ce que j'ai fait:
[code]--
--
-- 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');
[/code]
[b]Le formulaire est le même que le tiens.[/b] (je l'ai mis à part et appelé "test.htm")
[b]Le programme php:[/b]
[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
?>[/php]