Débutant Tables MySQL

Résolu/Fermé
Blopette Messages postés 315 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 3 octobre 2012 - 16 avril 2008 à 21:09
Blopette Messages postés 315 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 3 octobre 2012 - 17 avril 2008 à 15:41
Bonjour! Je débute dans le PHP et MySQL, alors je n'y connais pas grand chose (même presque rien).

J'ai un projet de site où les gens pourront s'inscrire et remplir certaines informations, qui seront ensuite traitées et qui permettront d'afficher d'autres informations sur certaines pages. Je suppose que PHP interviendra à ce niveau.

Mais comme je n'y connais rien, je me demande si les tables que je projette de créer sont correctes. J'ai noté des interrogations en gras (?). Voici mes tables (Nom | Type | Description) :

1/
Table pour l'inscription : 
JoueurID | SERIAL | rempli automatiquement à chaque nouvelle ligne ?
Enreg | DATE | date d'enregistrement remplie automatiquement
Pseudo | VARCHAR(25) | rempli à l'inscription par le membre via PHP ?
Mdp | VARCHAR(25) | rempli à l'inscription par le membre
Pays | VARCHAR(25) | rempli à l'inscription par le membre
Email | VARCHAR(25) | rempli à l'inscription par le membre
Avatar | VARCHAR(255) | le membre entre l'url d'une image pour qu'elle puisse s'afficher sur son profil grâce à PHP ?


2/ J'aurais aussi voulu que le membre puisse choisir entre plusieurs catégories d'objets avec ENUM("meuble","jouet") par exemple, et que j'aie à ma disposition une liste de ceux qui ont choisi meuble et une autre liste de ceux qui ont choisi jouet, et pouvoir en "cocher" certains.


3/ En admettant que des gens aient pu s'inscrire (\o/), serait-il possible qu'ils entrent leur score à un jeu, et que PHP (ou autre chose) fasse un calcul simple (division) grâce à une donnée précisée auparavant, et affiche le résultat sur la page?
Je pensais créer une table pour le Jeu1 avec une colonne JoueurID et une colonne Score, mais où figurera la donnée identique à chaque calcul? Je suis plutôt perdue, je ne suis même pas sûre qu'il y a besoin d'une table pour cela... Et puis il y aurait plusieurs jeux, donc plusieurs scores et plusieurs données.


Si vous pouviez m'apporter quelques précisions s'il vous plaît, ce serait super!

Merci d'avance :)

4 réponses

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
17 avril 2008 à 10:16
Bonjour,

Pour commencer félicitation pour ton message, clair, bien écrit et simple à comprendre, c'est pas souvent qu'on tombe sur quelqun qui explique si bien :D

Pour te répondre :

1/
JoueurID | SERIAL | rempli automatiquement à chaque nouvelle ligne ?
=> Oui, l'identifiant est généralement unique par définition, et doit donc être rempli automatiquement lors d'une insertion. (auto-increment). Il faut également que cette propriété soit définie comme la clef primaire de ta table.

Enreg | DATE | date d'enregistrement remplie automatiquement
=> Oui, libre à toi de l'écrire dans ta requête SQL d'insertion (le mieux je trouve) ou de calculer en PHP et de l'inclure comme variable dans ta requête d'insertion.

Pseudo | VARCHAR(25) | rempli à l'inscription par le membre via PHP ?
Mdp | VARCHAR(25) | rempli à l'inscription par le membre
Pays | VARCHAR(25) | rempli à l'inscription par le membre
Email | VARCHAR(25) | rempli à l'inscription par le membre
=> Oui, tout cela sont des variables issue de ton formulaire, qui devront être vérifiées et validée au préalable en PHP (pour éviter que l'utilisateur n'entre des données qui corrompt ta base de données). Ces variables seront passée à ta requête SQL d'insertion.

Avatar | VARCHAR(255) | le membre entre l'url d'une image pour qu'elle puisse s'afficher sur son profil grâce à PHP ?
=> Encore un oui, si tu as l'url de l'image, lorsque tu affichera ta page, il te suffira de faire une requête SQL pour récupérer les informations d'un utilisateur - dont l'url de l'avatar - et d'y inclure une balise image ayant pour source l'url en question.
Ex :
<img src="$url" ... />



2) Si tu veux que tes utilisateurs puisse choisir une ou plusieurs catégories d'objet, il va falloir que tu les matérialise dans ta base de données, afin d'enregistrer les liens entre ces catégories et tes utilisateurs.
Pour ce faire, tu devra donc créer une table "categorie" qui regroupera certaines informations.
Par exemple :
- identifiant (numerique, auto-increment)
- label (varchar)

Ensuite tu pourra insérer directement tes catégories dans ta base, de manière à pouvoir lister sur une page PHP toutes tes catégories via une requête SQL SELECT sur ta base de donneés (dans cette nouvelle table). Ainsi tu as tes catégories en base et non en dur dans ton code PHP.

Reste ensuite à pouvoir faire un lien entre les catégories et les utilisateur.
Pour ce faire, il te suffit de créer une autre table qui symbolisera ce lien. Tu sais que dans la table utilisateur tu as un identifiant, unique pour chaque utilisateur, et de même dans ta table de catégorie.
Ta nouvelle table s'appellera par exemple 'utilisateur_cat' et regroupera les informations suivantes :
- utilisateur_identifiant (primary key)
- categrorie_identifiant (primary key)

Ces deux idendifiants ne doivent pas être en auto-increment puisque tu les replira toi même par des identifiants déjà connus (celui de l'utilisateur et celui de la catégorie sélectionnée)
Par contre, ces deux identifiants doivent être défini tout deux comme des clés primaires, puisque ce qui fait l'unicité dans cette table, c'est le couple (utilisateur_id,catégorie_id).
On est d'accord qu'un utilisateur ne peux pas sélectionner deux fois la même catégorie.

3) La par contre je te dirai non :)
Le mieux pour faire ce que tu veux c'est de créer une nouvelle table "jeu" qui aura pour propriétés :
- identifiant (int, auto-increment, primary key)
- label (varchar) => nom du jeu
- valeur (int) => contante de division, propre à chaque jeu

Ensuite, la donnée "score" elle n'est pas propre à jeu, mais plutôt au couple 'joueur-jeu'. Tu vois donc que cette données ne peux pas être inclue dans la table 'jeu' même.
Il faut, de la même manière que pour la table qui relie 'utilisateur' à 'categorie', faire une nouvelle table de liaison (que l'on appelle 'relation') qui reliera nos deux tables 'utilisateur' et 'jeu'. Elle se nomera 'score' par exemple et aura les propriétés suivantes :
- id_score (int, primary key)
- id_utilisateur (int, primary key)
- id_jeu (int, primary key)
- score (int)

De cette manière (sans prendre en compte ce qui est en gras), un joueur pourra n'avoir qu'un seul score / jeu. Si tu veux qu'il puisse en avoir plusieurs, il faudra inclure en plus un notion d'identifiant pour la table 'score' (ajouté en gras ci dessus). Ainsi, le couple (id_score,id_utilisateur,id_jeu) sera toujours unique.

1
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
17 avril 2008 à 10:01
Salut Blopette,

Pour la structure de ta table, tu demandes à plusieurs endroits : via PHP ?

C'est étrange comme question. Oui, PHP doit tout faire tout seul comme un grand. Tu ne penses quand même pas donner un accès à la base de données à chacun de tes visiteurs pour qu'ils insèrent leurs données eux-mêmes ? ;-)

Tu n'indiques pas quel outil tu utilises pour accéder à ta base : PhpMyAdmin ?

Savoir avec quel outil tu le fais pourra faciliter les conseils futurs.

Raph
0
Blopette Messages postés 315 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 3 octobre 2012 273
17 avril 2008 à 12:32
Merci beaucoup pour vos réponses!

Comme je suis sous Linux, j'ai installé Mysql, et aussi Apache.


Pour le 1/ j'ai tout compris (\o/) merci!

Par contre dans le 2/, quand tu dis :
Ta nouvelle table s'appellera par exemple 'utilisateur_cat' et regroupera les informations suivantes :
- utilisateur_identifiant (primary key)
- categorie_identifiant (primary key)

Ces deux idendifiants ne doivent pas être en auto-increment puisque tu les remplira toi même par des identifiants déjà connus (celui de l'utilisateur et celui de la catégorie sélectionnée).
Par contre, ces deux identifiants doivent être défini tout deux comme des clés primaires, puisque ce qui fait l'unicité dans cette table, c'est le couple (utilisateur_id,catégorie_id). 

Je comprends qu'il faut que utilisateur_identifiant et categorie_identifiant soient définis comme clés primaires, mais si on ne les met pas en auto-increment, quel type de données ce sera? Est-ce qu'on peut les mettre en tant que (primary key) seulement?!

Grâce au 3/, j'ai enfin compris la notion de couple! :)


Merci beaucoup pour toutes ces informations! =)
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
17 avril 2008 à 13:59
Re,

Réponse au 2) :
Non il en faut pas que ces champs soient en auto-increment puisque c'est toi qui les rempli avec les id des utilisateur déjà créé, ainsi que des id des catégories déjà créée.
Images que tu mettes ça en auto-incrément, que va-t-il se passer ? Tu n'aura pas de correspondance entre les identifiant utilisateur de la table 'utilisateur_cat' et ceux de la table 'utilisateur'.
Le but est de créer un lien entre les tables 'utilisateur' et 'categorie', et ce lien est symbolisé par un enregistrement dans une troisième table, qui regroupe l'identifiant de l'utilisateur et de la catégorie qui sont lié.

Conclusion, lorsque tu ajoute un nouvel utilisateur, l'identifiant étant défini comme auto-increment, il sera généré automatiquement par SQL (et donc géré en interne). De même pour les catégories (mise à part que les catégories c'est toi qui va les créer à la main (ou par script) à l'avance, puisqu'il ne sera pas possible sur ton site de créer des catégories j'imagine).
Par contre, lorsqu'un utilisateur va sélectionner une catégorie, au niveau du code PHP dans ta page tu connaitra l'identifiant de l'utilisateur et de la catégorie, et tu pourra via une requête SQL insérer un nouvel enregistrement dans la table 'utilisateur_cat' pour symboliser ce choix de l'utilisateur.

Par la suite tu sera aussi en mesure, lorsque l'utilisateur se sera identifier sur le site, de retrouver les catégories qu'il a choisi (SELECT * FROM utilisateur_cat WHERE id_utilisateur = $id_utilisateur).
0
Blopette Messages postés 315 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 3 octobre 2012 273 > kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
17 avril 2008 à 15:41
Merci pour cette réponse complète ^^
0
phoenix08 Messages postés 3 Date d'inscription jeudi 27 mars 2008 Statut Membre Dernière intervention 4 juillet 2008
17 avril 2008 à 12:45
J'aimerai savoir sil est possible de determiner par une commande sous console, le debit d'une interface
0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
17 avril 2008 à 13:42
phoenix08, la question de cette discussion est très éloignée de la tienne, tu devrais sans doute lancer une nouvelle discussion (ça coûte pas plus cher ;-).

Bon, chez moi sous Linux, je fais :
dmesg | grep -i eth[0-9] | grep link


Résultat de la commande :
[   48.168000] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[ 1455.932000] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[ 6174.884000] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[15932.532000] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[20637.744000] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1


Donc le débit de mon interface eth0 (première carte Ethernet) et de 100 Megabit par seconde (Mb/s) soit 12,5 Megaoctets par second (Mo/s).

Raph
0