Script PHP pour déterminer une catégorie

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 : Script PHP pour déterminer une catégorie

par Sebe » 24 nov. 2005, 01:12

Dans ta table catégorie tu as mis "M" et non "H" ;)
Evidement, cela va beaucoup mieux ... pourtant, je ne faisais pas d'élevage (femelle & mâle)!

En tout cas, un grand MERCI ... je viendrai jouer au pendu quand j'aurai bien avancé pour le site avec le quel je m'amuse!

par ouckileou » 24 nov. 2005, 01:00

Dans ta table catégorie tu as mis "M" et non "H" ;)

par Sebe » 24 nov. 2005, 00:55

Si tu essayes le code que j'ai collé ça ne fonctionne pas ? Car chez moi c'est sûr ça marche :)

Peux-tu me montrer ta table catégories (structure et données) ? c'est la seule chose que j'a créé donc c'est peut-être de là que vient le problème...
Je te l'ai déjà envoyé par e-mail.

par ouckileou » 24 nov. 2005, 00:51

Si tu essayes le code que j'ai collé ça ne fonctionne pas ? Car chez moi c'est sûr ça marche :)

Peux-tu me montrer ta table catégories (structure et données) ? c'est la seule chose que j'a créé donc c'est peut-être de là que vient le problème...

par Sebe » 24 nov. 2005, 00:46

J'ai fait un copié/collé pour être certain de ne pas faire d'erreur et c'est identique à avant!

par ouckileou » 24 nov. 2005, 00:35

Cette requête fonctionne très bien chez moi :

Code : Tout sélectionner

SELECT s.id_societaire, s.nom, s.prenom, s.sexe, YEAR(NOW()) - YEAR(s.naissance) AS age, s_c.nom_categorie FROM societaires s INNER JOIN soc_categories s_c ON s.sexe = s_c.sexe AND YEAR(NOW()) - YEAR(s.naissance) BETWEEN s_c.age_min AND s_c.age_max WHERE s.sexe = 'H' ORDER BY s.nom ASC
Et c'est exactement la même que celle que tu as collé au dessus, je l'ai juste allégée avec les alias

Voici quelques résultats que j'obtiens (sans les noms) :

Code : Tout sélectionner

7 H 35 SE 20 H 51 V2 21 H 44 V1 23 H 13 EH 2 H 39 SE 1 H 55 V2 25 H 15 EH 6 H 31 SE 3 H 42 V1
Dans ta table catégorie, l'age minimum d'une catégorie est bien l'âge maximum+1 de la catégorie précédente ? On ne sait jamais c'est peut-être ça qui gêne...

par Sebe » 24 nov. 2005, 00:16

Ceci ne me donne rien sauf si j'enlève [WHERE societaires.sexe = 'H'] alors, il me donne toutes les 'f' avec leur catégorie!
SELECT societaires.id_societaire, societaires.nom, societaires.prenom, societaires.sexe, YEAR(NOW()) - YEAR(societaires.naissance) AS age, soc_categories.nom_categorie
FROM societaires INNER JOIN soc_categories ON societaires.sexe = soc_categories.sexe AND YEAR(NOW()) - YEAR(societaires.naissance) BETWEEN soc_categories.age_min AND soc_categories.age_max
WHERE societaires.sexe = 'H'
ORDER BY societaires.nom ASC
Pour le reste, je t'ai envoyé via e-mail

par ouckileou » 23 nov. 2005, 23:55

La deuxième requête, c'est plus logique qu'il y ait des problèmes, je ne suis pas complètement sûr de ce que je t'ai donné :)

Par contre le première est un bête SELECT, ça devrait fonctionner... et tu dis que tu n'as que des lignes 'F' en résultat ? et il y a bien des lignes 'H' dans ta table ?

Pour récupérer la variable catégorie, il faut que tu indiques dans le SELECT de sélectionner la colonne "nom_categorie"

J'aimerais bien tester pour oir si le Between marche dans une jointure, est-ce qu'il serait possible d'avoir le SQL de tes tables ? Au moins la structure si tu ne peux pas partager les données

par Sebe » 23 nov. 2005, 23:30

Y'a un truc qui ne va pas ou qui me dépasse!
SELECT societaires.id_societaire, societaires.nom, societaires.prenom, societaires.sexe, YEAR(NOW()) - YEAR(societaires.naissance) AS age
FROM societaires
ORDER BY societaires.nom
Quand je teste cela fonctionne mais j'ai tous les sexe 'f' repris et seulement cela!
SELECT societaires.id_societaire, societaires.nom, societaires.prenom, societaires.sexe, YEAR(NOW()) - YEAR(societaires.naissance) AS age
FROM societaires
INNER JOIN soc_categories ON societaires.sexe = soc_categories.sexe AND YEAR(NOW()) - YEAR(societaires.naissance) BETWEEN soc_categories.age_min AND soc_categories.age_max
WHERE societaires.sexe = 'H'
ORDER BY societaires.nom ASC
Ici, je n'ai plus personne ! ! !

De plus, je n'ai pas de variable pour récupérer ma catégorie syle 'AS categorie' ... où ai-je fait une erreur?

Merci

par ouckileou » 23 nov. 2005, 21:06

Là, je suis dans le flou. J'ai pourtant donné le nom des tables ... je ne comprends pas!
Non, pas dans le "sexe" du SELECT ;)

Ce que j'ai cité c'est ce qu'il faut faire, c'est bon, il faut faire la même chose à chaque fois que tu cites la colonnes "sexe" (et toute colonne présente dans plusieurs tables utilisées dans une requête)

par Invité » 23 nov. 2005, 20:54

Quand à ton erreur, c'est très simple :
tu manipules dans ta requête 2 tables, qui contiennent toutes les deux une colonne "sexe". Il faut donc indiquer de quelle table tu parles lorsque tu mentionnes cette colonne ;)
Comme ici :

Code : Tout sélectionner

ON p.sexe = c.sexe
Au passage tu as gardé "p" et "c" comme alias pour tes tables, mais tu n'as pas les mêmes noms de tables, tu devrais peut-être adapter tes alias à tes noms, ce sera plus clair pour toi
Là, je suis dans le flou. J'ai pourtant donné le nom des tables ... je ne comprends pas!
SELECT id_societaire, nom, prenom, sexe, YEAR(NOW()) - YEAR(naissance) AS age
FROM societaires p 
INNER JOIN soc_categories c  ON p.sexe = c.sexe AND YEAR(NOW()) - YEAR(naissance) BETWEEN c.age_min AND c.age_max
ORDER BY nom ASC 
Faut-il ajouter ceci 'soc_categories.sexe' à la place de 'c.sexe'?

Merci

par ouckileou » 23 nov. 2005, 20:02

Salut,

pour les types : tu as choisi Int, pour age_min et age_max, ainsi que pour l'id_categorie.
C'est un peu disproportionné :
"L'intervalle de validité pour les entiers signés est de -2147483648 à 2147483647."
Hors tu ne stockeras ici qu'un âge (de 0 à 150, voyons large) et tu n'auras a priori qu'une dizaine ou quinzaine de catégorie en tout. Tu pourrais donc choisir un type Tinyint, qui permet d'aller de 0 à 255 en UNSIGNED. Cela suffira et ça prendra moins de place disque (Tinyint 1 octet, Integer 4 octets, voir ici)
La documentation sur les types numériques :
http://dev.mysql.com/doc/refman/5.0/fr/ ... rview.html
C'est peut-être un peu chipoter, mais autant prendre de bonnes habitudes dès maintenant, il y a des cas ou c'est important de bien choisir ses types pour optimiser la base.

Quand à ton erreur, c'est très simple :
tu manipules dans ta requête 2 tables, qui contiennent toutes les deux une colonne "sexe". Il faut donc indiquer de quelle table tu parles lorsque tu mentionnes cette colonne ;)
Comme ici :

Code : Tout sélectionner

ON p.sexe = c.sexe
Au passage tu as gardé "p" et "c" comme alias pour tes tables, mais tu n'as pas les mêmes noms de tables, tu devrais peut-être adapter tes alias à tes noms, ce sera plus clair pour toi

par Sebe » 23 nov. 2005, 19:40

Après avoir écrit ma BD, je me suis lancé dans le code
SELECT id_societaire, nom, prenom, sexe, YEAR(NOW()) - YEAR(naissance) AS age
FROM societaires p INNER JOIN soc_categories c  ON p.sexe = c.sexe AND YEAR(NOW()) - YEAR(naissance) BETWEEN c.age_min AND c.age_max
ORDER BY nom ASC
Mais voilà, j'ai un message d'erreur:

Code : Tout sélectionner

1052 Column: 'sexe' in field list is ambiguous
Qu'est-ce que je dois entendre par là?

par Sebe » 23 nov. 2005, 18:44

Comme ma connaissance ne poste pas et m'envoit que des e-mails ... je le fais parler:
J'admet...

Il a raison... Il faudrait tout faire faire par SQL...
Maintenant, je connais mieux le SQL Oracle.. Hors tu as une DB MySQL...
J'imagine quand-même que tu pourrais récupérer directement le descriptif
avec la requête :


Select description from CatgorieTable where sexe=:sx and age<:ag and
rownum=1

rownum existe en Oracle... Je ne sais pas sous MySQL... En tous cas, tu
peux aussi récupéré le recordset de la requête précédente, et au niveau
php, récupérer directement le dernier enregistrement...
Avec des instructions du genre mysql_num_rows et ...
Faudrait que je me replonge dedans...
Donc, j'opte pour la méthode ouckileou.

Une petite question pour ma BD est-ce le type que j'ai choisi est bon?

Code : Tout sélectionner

id_categorie: [int(11)] + auto_increment nom_categorie: [char(3)] sexe: [char(1)] age_min: [int(11)] age_max: [int(11)]
Dois-je ajouter quelque chose dans les autres colonnes?

Merci

par ouckileou » 23 nov. 2005, 13:26

Salut,

l'inconvénient de cette méthode sera à mon avis le temps de traitement.
Même si cela ne sera peut-être pas si significatif, tu as ici 2 requêtes SQL (liste des personnes + liste des catégories) et 2 belles boucles imbriquées :
- boucle sur la liste des personnes
- pour chaque personne, boucle sur la liste des catégories

Personnellement, je suis partisan d'en coller un maxium dans le SQL, c'est plus rapide, et tu as des résultats quasiment prêts à l'emploi :)