requete select : probleme de virgule et de point

HD
Mammouth du PHP | 1181 Messages

27 janv. 2007, 00:16

salut
j ai une requete :
$sql ="SELECT reference FROM data WHERE poids >= $poidsmin";
le problème c'est que les poids que j'ai dans la base sont avec des , genre "2,01" alors que la condition >= ne marche que quand les chiffres sont avec des . genre "2.01"
comment faire donc pour executer cette requete sans modifier les données de la table data (j'ai pensé à str_replace mais avec une requete ayant la condition >= je ne vois pas comment faire) ?
merci d'avance pour votre aide
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Eléphanteau du PHP | 17 Messages

27 janv. 2007, 00:50

salut
j ai une requete :
$sql ="SELECT reference FROM data WHERE poids >= $poidsmin";
le problème c'est que les poids que j'ai dans la base sont avec des , genre "2,01" alors que la condition >= ne marche que quand les chiffres sont avec des . genre "2.01"
comment faire donc pour executer cette requete sans modifier les données de la table data (j'ai pensé à str_replace mais avec une requete ayant la condition >= je ne vois pas comment faire) ?
merci d'avance pour votre aide
Tu as tenté ça ?
$sql ="SELECT reference FROM data WHERE poids >= '$poidsmin'";

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 00:59

la fonction number_format() ! :idea:

HD
Mammouth du PHP | 1181 Messages

27 janv. 2007, 01:12

la fonction number_format() ! :idea:
une fonction très utile mais comment l'utiliser avec ma requete sql ? car je ne veux pas récupérer tous les poids (des milliers), les convertir avant de comparer avec poidsmin...
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 10:41

Ben, c'est tout bête !
$sql = "SELECT reference FROM data WHERE poids >= ".number_format($poidsmin, <PARAMÈTRES> );

Eléphant du PHP | 217 Messages

27 janv. 2007, 10:43

Salut,
essais avec cette requete :
SELECT reference FROM data WHERE ( REPLACE(poids,',','.') +0.0 ) >= $poidsmin

Explication :
On remplace la virgule par un point ensuite on ajoute 0.0 pour forcer la convertion de la chaine en type float.
Ensuite la comparaison peut être effectuée.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 10:54

Attention !
Si une fonction doit être appliqué à une valeur (calcul, formatage, etc.),
toujours appliquer cette fonction à la valeur de référence
plutôt qu'au champ de la table à comparer.

En effet, appliquer un traitement sur un champ de la table :non:
fait perdre tout le bénéfice des index de cette table.
Modifié en dernier par albat le 27 janv. 2007, 11:09, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 10:56

ovide, mojorisin,

Vos propositions ont pour effet de transformer une valeur numérique en chaines de caractères.
C'est lourd en ressources, pénalisant et risque de provoquer des erreurs. :non:

Eléphant du PHP | 217 Messages

27 janv. 2007, 11:05

Ha je ne savais pas cela :)

Comme quoi il vaut mieux mourrir le soir, on en apprend tous les jours :)

Sinon comme la on compare des chaines (si on ne cast pas le champs) n'y a t-il pas des risques de mauvaise comparaison ?
Avec des types négatif par exemple WHERE champs <= '-1,5'

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 11:12

Risque d'erreurs, en effet.
Il faudrait tester quelques valeurs significatives pour en vérifier les effets.

De manière générale :
- le type de données le plus léger à manipuler est le numérique,
- le plus de données le plus lourd à manipuler est la chaîne de caractères
(j'ai pas dit "le plus chiant". Ça, c'est les date/time) ;)

Donc, quand on a la chance d'avoir des données numériques,
ne surtout pas les transformer en chaînes de caractères.

HD
Mammouth du PHP | 1181 Messages

27 janv. 2007, 12:29

Ben, c'est tout bête !
$sql = "SELECT reference FROM data WHERE poids >= ".number_format($poidsmin, <PARAMÈTRES> );
j avais pas pensé à çà c'est très utile !
par contre je crois que je me suis mal fait comprendre :
$poidsmin est bien formatée : "2.01" par exemple
c'est le champs "poids" (dans la base de données) qui est mal formaté (des chiffres avec virgules)
donc je ne veux pas modifier quoi que ce soit dans la BD et je ne veux pas récupérer tous les poids (des milliers), les convertir avant de comparer avec poidsmin.
Quelle est donc la solution ?
merci ![/b][/color]
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 12:38

Je ne vois vraiment pas en quoi la solution que je t'ai proposée te pose problème ! :shock:

À moins que...

Dans quel type est déclaré ton champ poids de ta table data ? :-k



PS : le choix de data pour nommer ta table n'est pas des plus judicieux.
Car si data n'est pas un mot réservé, ce n'en est pas loin...

HD
Mammouth du PHP | 1181 Messages

27 janv. 2007, 12:41

ok pour data
sinon justement le problème est que "poids" est un champs "varchar" :(
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 janv. 2007, 12:47

justement le problème est que "poids" est un champs "varchar" :(
T'es pas dans la merde... #-o

HD
Mammouth du PHP | 1181 Messages

27 janv. 2007, 12:50

:roll:
mais bon il me reste toujours la solution que je voulais à tout prix éviter :
je ne veux pas récupérer tous les poids (des milliers), les convertir avant de comparer avec poidsmin.
:evil:
Modifié en dernier par HD le 27 janv. 2007, 12:51, modifié 1 fois.
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]