annuler un number_format
Bonjour à tous,
voici mon problème.
j'ai une table dans laquelle j'ai des prix qui ne sont pas formatés (càd qu'il n'y a pas de séparateur de milliers). Pour des raisons de lecture, j'ai sur ma page web formaté ce prix de façon à insérer le séparateur des milliers. Mes prix se retrouvent dans une liste déroulante.
J'ai une page recherche où apparaît également cette liste déroulante de prix (avec séparateur de millier). On peut donc faire une recherche sur le prix. Le prix sélectionné est récupéré et je fais une recherche dans ma BD.
Le problème est donc que mon prix récupéré lors de la recherche est formaté (millier) alors que celui dans la base de données ne l'est pas. Donc mon résultat de recherche n'est pas pas correcte.
En gros, je voudrais repasser d'un
$prix=number_format($prix, 0, ',', '.');
à mon prix sans le séparateur de milliers.
J'ai cherché sur le net mais aucune solution.
J'ai essayé de changer le 'type' de mon prix dans ma base Mysql pareil. Pour info mon type est en 'mediumint'.
Autre problème, j'aimerais pouvoir faire une recherche sur 'Tous' les prix (et donc avoir un champs Tous les prix) mais cela ne marche pas à cause du 'type' choisi.
Voilà une idée qui pourrait me faire avancer?
Merci de m'avoir lu !
Réponses apportées à cette discussion
Salut,
déjà dans ta base, le type devrait être un flottant, donc type DECIMAL(10,2) par exemple de façon à permettre l'enregistrement des décimales, un entier va tronquer tes données.
Ensuite pour le number_format(), je suggère l'espace comme séparateur de milliers, c'est beaucoup plus classique. Enfin n'oublie pas que dans une base de données, la décimale est séparée par un point et non une virgule, donc il faudrait commencer par virer les points et ensuite remplacer la virgule par un point pour effectuer ta requête.
Mais pour une liste déroulante, ce que je suggèrerais, c'est de mettre l'affichage que tu préfères, mais pour l'attribut value de ta balise option, de conserver le format SQL sans le transformer : de cette manière, le type sera bon lors de la soumission du formulaire sans modification puisque c'est précisément cette valeur qui est récupérée et non ce qui est affiché.
Hello Cyrano,
merci pour ta réponse. J'ai suivi tes conseils et cela fonctionne. J'ai malgré tout encore un soucis.
Je voudrais avoir dans ma liste de prix la possibilité de faire une recherche sur "tous les prix" (= indifférent au prix). J'avais donc pensé mettre une ligne "tous les prix" dans ma base de données, mais cela ne va pas puisque mon champs est est DECIMAL.
As-tu une solution?
Merci
Je ne saisis pas la nature du problème : lorsque tu fais une recherche, tu peux ajouter un filtre... ou non.
Soit tu ajoutes un filtre sur les prix, par exemple les prix inférieurs à xxx,xx, ou encore les prix compris entre xxx,xx et yyy,yy, ou encore seulement les prix supérieurs à yyy,yy . mais si tu veux tous les prix, tu ne mets tout simplement pas de filtre dessus ...
En fait,
je voudrais arriver à un résultat comme ceci :
Tous (serait ici égale à une recherche indifférent au prix)
500
1000
2000
Je pourrais mettre "Tous" en value de ma balise . Cela fonctionne une première fois, mais comme je stock la valeur sélectionnée dans une variable de façon à réaficher dans la liste prix, le prix choisi pour la recherche, la valeur de mon value est donc remplacée par celle de ma valeur prix choisi.
Je ne sais pas si c'est très clair?
Pas trop, mais je crois deviner : tu n'as pas dans ta liste d'options « Tous les prix » et donc lors du ré-affichage du formulaire, c'est la première valeur qui est sélectionnée d'office, donc ici 500 si on reprend ton exemple. Si c'est ça, la solution est évidente non ?
Heu par exemple si le visiteur sélectionne 1000, quand il aura lancé sa recherche et que son résultat s'affichera, 1000 apparaitra dans la liste "prix" du moteur de recherche. Donc le réponse 1000 est stockée dans une variable "Prix".
Donc "Tous" n'apparait pas puisque pas repris dans ma table "Prix" de ma base de données.
C'est bien ce que j'avais compris : et donc... ?
Réfléchis : tu construis ta liste avec les valeurs qui sont dans la base : mais qu'est-ce qui t'interdit d'avoir (en dur) une première option avec « Tous » qui serait là de toutes façons quel que puisse être le nombre de prix extraits de la base ?
Heu
ma fonction qui liste les prix dans ma BD est la suivante
function select_prix($selected_prix) { $request_prix =mysql_query("SELECT * FROM prix") or die("Sélection de la base impossible !"); echo '<SELECT name="select_prix" size="1" style="width:97px">'; echo '<OPTION>'.$selected_prix.'</OPTION>'; while($donnees_prix=mysql_fetch_array($request_prix)) { $prix =$donnees_prix['prix']; $prix_format=number_format($prix, 0, ',', ' '); //Permet de séparer les milliers echo '<OPTION value='.$prix.'>< '.$prix_format.' </OPTION>'; } echo '</SELECT<br />'; }
Sur ma page "resultat de recherche" j'ai une variable "$selected_prix" qui récupère en $_POST la valeur sélectionnée.
Sur ma page "moteur de recherche" j'ai :
echo '<legend>Prix : </legend><br />';if (!empty($_POST['select_prix']) && ($_POST['select_prix'] !="")) { $selected_prix=$_POST['select_prix']; } else { $selected_prix='--Prix--'; } select_prix($selected_prix);
Donc si mon formulaire "recherche" est soumis avec une valeur de prix: $selected_prix="valeur_choisie" sinon $selected_prix="--Prix--" (=texte d'info)
Mais je ne vois pas comment ajouter "Tous" à ma liste? Ou alors j'ai mal construit ma recherche?
Ok, on va simplifier un peu :
D'abord ton code de récupération de sélection s'il y en a une de faite :
echo '<legend>Prix : </legend><br />';
$selected_prix = (isset($_POST['select_prix']) && ($_POST['select_prix'] !="-1"))
? $_POST['select_prix']
: null;
echo select_prix($selected_prix);
Premier changement, on fait un echo sur l'appel de la fonction : essaye de prendre l'habitude de ne jamais mettre un echo() dans une fonction, c'est une mauvaise pratique même si c'est techniquement valide et que ça fonctionne parfaitement, avec le temps, ça va te faciliter la séparation des codes. Donc au lieu de simplement appeler la fonction qui va se charger d'afficher la liste, la fonction va me retourner la chaine attendue et là seulement je l'affiche.
La fonction maintenant, construction de la liste :
function select_prix($selected_prix = null)
{
$request_prix = mysql_query("SELECT * FROM prix") or die("Sélection de la base impossible !");
$sListePrix = <<<CODE_HTML
<select name="select_prix" style="width:97px">
<option value="-1">-- TOUS --</option>
CODE_HTML;
while(false !== ($donnees_prix = mysql_fetch_assoc($request_prix)))
{
$selected = (isset($selected_prix) && $donnees_prix['prix'] == $selected_prix)
? ' selected="selected"'
: null;
$prix_format = number_format($donnees_prix['prix'], 0, ',', ' '); //Permet de séparer les milliers
$sListePrix .= <<<CODE_HTML
<option value="{$donnees_prix['prix']}">{$prix_format}</option>
CODE_HTML;
}
$sListePrix = <<<CODE_HTML
</select><br />
CODE_HTML;
return($sListePrix);
}
Et là regarde bien: par défaut, le paramètre $selected_prix vaut NULL. Ensuite, la première option vaut -1 et affiche « --TOUS-- », et cette option sera toujours là. Mais si un prix spécifique a été sélectionné, alors je vais sélectionner l'option correpondante : pour ça, à chaque tour de boucle, je compare la valeur de $selected_prix et de la valeur en provenance de la base : selon le cas, $selected vaudra l'attribut selected="selected" ou null : je l'insère de toutes façons dans la balise juste après l'attribut value.
Essaye ça et reviensavec les éventuelles objections ;)
ERRATA : dans la fonction, j'ai omis un point de concaténation.
La fermeture de la liste devrait donc être :
$sListePrix .= <<<CODE_HTML
</select><br />
CODE_HTML;
Pas d'objection votre honneur! ;)
Cela fonctionne effectivement, sauf que c'est d'office "Tous" qui s'affiche après une recherche et non le prix sélectionné. Je voulais que "Tous" se retrouve dans la liste et pas en tête de liste. Je sais malgré tout récupérer le choix autrement et l'afficher sur ma page.
J'avoue que j'ai encore du mal avec ta façon de coder. On a chacun sa technique.
Merci encore une fois pour ton aide et tes conseils ! J'en prends bonne note à chaque fois.