Je développe actuellement un site qui nécessite, pour chaque utilisateur, le stockage de la même quantité d'informations. Ce site est un site de gestion de collection. Chaque utilisateur peut suivre l'avancement de sa collection via un compte. Je pensais utiliser une table pour la collection de chaque membre, sauf que cela nécessite de créer automatiquement une table avec un nom différent pour chaque membre, à son inscription.
Mon problème est que je n'arrive pas à construire mon script en PHP, pour que la requête SQL s'effectue. J'ai la requête SQL qui fonctionne sur phpMyAdmin.
CREATE TABLE nom_table_collection_utilisateur AS
SELECT * FROM nom_table_de_référence
Pour la création de la table, je copie une table, qui est la même pour tout les utilisateurs, déjà présente dans ma base de données.
Pour moi, dans l'état de mes connaissances, c'est la seule façon de procéder. Si, vous avez d'autres idées pour procéder n’hésitez pas à proposer.
Et même sans ça, le mieux serait d'avoir 1 seul table avec potentiellement 1 ou plusieurs colonnes de type JSON par exemple si vraiment les infos sont un peu différentes mais "catégorisable". En tout cas d'autre moyen que de créer des tables pour chaque user possible. Tu t'imagine facebook avec les 2 milliards de compte inscrit si tu devait créé et gérer 2 milliards de table ?
Pardonnes cette question débile mais d'un utilisateur à l'autre les colonnes des informations de chaque collection seront identiques non ?
Sinon tu dois leur laisser la possibilité de créer leurs colonnes selon leurs guises non ?
Si ce n'est pas le cas, je ne comprends le besoin de créer des tables pour chaque Utilisateur...
Le site est pour gérer une collection de pièces. Donc, dans ma table, j'ai une colonne avec le non des pièces (pour les reconnaître) et une autre colonne avec soit un 0, pour dire que la personne n'a pas la pièce. Si, elle la possède, elle peut grâce à un formulaire, changer le statut de la pièce, qui passe à 1, pour "j'ai" dans sa table.
Il n'y a donc pas d’intérêt à leur laisser la possibilité de créer des colonnes, vu qu'il n'y a rien d'autre à écrire dans la table.
Une table par utilisateur, c'est, je dois l'avouer plus pour moi. Au niveau organisation, je trouve qu'avoir une table pour chaque collection de chaque utilisateur, c'est plus simple. Mais je pourrais très bien faire une seule table, avec une colonne pour le nom des pièces et à chaque fois une colonne pour la collection de chaque utilisateur. Tu penses que je devrais faire une table pour toutes les collections ?
quenti77 a écrit:
Et même sans ça, le mieux serait d'avoir 1 seul table avec potentiellement 1 ou plusieurs colonnes de type JSON par exemple si vraiment les infos sont un peu différentes mais "catégorisable". En tout cas d'autre moyen que de créer des tables pour chaque user possible. Tu t'imagine facebook avec les 2 milliards de compte inscrit si tu devait créé et gérer 2 milliards de table ?
Je veux éviter d'utiliser d'autre langage que le PHP et SQL, car ce sont les seuls que je connais.
C'est vrai que vu comme ça une table par utilisateur, ça peut faire beaucoup. Je pense faire une table pour toutes les collections du coup.
- Edité par SherlockHolmes5 23 juillet 2019 à 16:29:57
C'est le mieux et voici un petit exemple pour visualiser peut-être mieux la chose :
-- Table users :
id, name, email, pass
-- Table coins :
id, name
-- Table collections :
id, user_id, coin_id
-- Ajout de 2 utilisateurs
INSERT INTO users VALUES (1, 'john', 'john@localhost', 'mdp_hash');
INSERT INTO users VALUES (2, 'marie', 'marie@localhost', 'mdp_hash');
-- Ajout de 4 type de pièces :
INSERT INTO coins VALUES (1, 'française');
INSERT INTO coins VALUES (2, 'allemande');
INSERT INTO coins VALUES (3, 'belge');
INSERT INTO coins VALUES (4, 'espagnol');
-- John ajoute une pièce allemande et belge dans sa collection
INSERT INTO collections VALUES (1, 1, 2);
INSERT INTO collections VALUES (2, 1, 3);
-- Marie ajoute une pièce française, belge et espagnol dans sa collection
INSERT INTO collections VALUES(3, 2, 1);
INSERT INTO collections VALUES(4, 2, 3);
INSERT INTO collections VALUES(5, 2, 4);
-- On veut connaitre le nom des pièces des collections de tous les utilisateurs
SELECT U.name AS user_name, Cb.name AS coin_name FROM users AS U
INNER JOIN collections AS Ca ON Ca.user_id = U.id
INNER JOIN coins AS Cb ON Cb.id = Ca.coin_id;
-- En sortie on a un truc du genre :
-- john, allemande
-- john, belge
-- marie, française
-- marie, belge
-- marie, espagnol
-- Si on veut la collection de john seulement on peut retirer le JOIN user
-- vu que l'on a déjà l'id normalement de john (et si on veut pas ses infos)
SELECT Cb.name FROM collections AS Ca
INNER JOIN coins AS Cb ON Cb.id = Ca.coin_id;
-- Si on veut faire le formulaire avec toutes les pièces
SELECT Cb.name, CASE WHEN Cb.user_id IS NULL THEN 0 ELSE 1 END user_has_coin
FROM coins AS Cb
LEFT JOIN collections AS Cb ON Cb.id = Ca.coin_id;
-- Il suffit de faire des checkbox et un if $row['user_has_coin'] {}
Je t'es mis les requêtes pour que tu puissent voir ce que tu peut faire. En gros la table collections est une table de relation N <-> M entre users et coins.
PS: Pour la dernière requête il manque juste un where sur Ca.user_id qui vaut lid de l'utilisateur ou null (il faut les 2)
Il ne faut vraiment pas faire une table par utilisateur, au vu de ce que tu dis, tu devrais avoir une table "utilisateur", une table "pieces", et une troisième table de relation avec id_utilisateur et id_pieces en clés étrangères.
C'est le mieux et voici un petit exemple pour visualiser peut-être mieux la chose :
-- Table users :
id, name, email, pass
-- Table coins :
id, name
-- Table collections :
id, user_id, coin_id
-- Ajout de 2 utilisateurs
INSERT INTO users VALUES (1, 'john', 'john@localhost', 'mdp_hash');
INSERT INTO users VALUES (2, 'marie', 'marie@localhost', 'mdp_hash');
-- Ajout de 4 type de pièces :
INSERT INTO coins VALUES (1, 'française');
INSERT INTO coins VALUES (2, 'allemande');
INSERT INTO coins VALUES (3, 'belge');
INSERT INTO coins VALUES (4, 'espagnol');
-- John ajoute une pièce allemande et belge dans sa collection
INSERT INTO collections VALUES (1, 1, 2);
INSERT INTO collections VALUES (2, 1, 3);
-- Marie ajoute une pièce française, belge et espagnol dans sa collection
INSERT INTO collections VALUES(3, 2, 1);
INSERT INTO collections VALUES(4, 2, 3);
INSERT INTO collections VALUES(5, 2, 4);
-- On veut connaitre le nom des pièces des collections de tous les utilisateurs
SELECT U.name AS user_name, Cb.name AS coin_name FROM users AS U
INNER JOIN collections AS Ca ON Ca.user_id = U.id
INNER JOIN coins AS Cb ON Cb.id = Ca.coin_id;
-- En sortie on a un truc du genre :
-- john, allemande
-- john, belge
-- marie, française
-- marie, belge
-- marie, espagnol
-- Si on veut la collection de john seulement on peut retirer le JOIN user
-- vu que l'on a déjà l'id normalement de john (et si on veut pas ses infos)
SELECT Cb.name FROM collections AS Ca
INNER JOIN coins AS Cb ON Cb.id = Ca.coin_id;
-- Si on veut faire le formulaire avec toutes les pièces
SELECT Cb.name, CASE WHEN Cb.user_id IS NULL THEN 0 ELSE 1 END user_has_coin
FROM coins AS Cb
LEFT JOIN collections AS Cb ON Cb.id = Ca.coin_id;
-- Il suffit de faire des checkbox et un if $row['user_has_coin'] {}
Je t'es mis les requêtes pour que tu puissent voir ce que tu peut faire. En gros la table collections est une table de relation N <-> M entre users et coins.
PS: Pour la dernière requête il manque juste un where sur Ca.user_id qui vaut lid de l'utilisateur ou null (il faut les 2)
- Edité par quenti77 il y a environ 21 heures
Super, merci de l'aide. Je vais me servir de tout cela pour faire mon script PHP, pour créer la colonne de chaque utilisateur.
philodick a écrit:
Bonjour,
Il ne faut vraiment pas faire une table par utilisateur, au vu de ce que tu dis, tu devrais avoir une table "utilisateur", une table "pieces", et une troisième table de relation avec id_utilisateur et id_pieces en clés étrangères.
D'accord, merci des conseils, je vais faire ça.
Création auto d'une table après inscription
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL
N'oubliez pas d'activer les erreurs PDO.