Totalement perdu avec insert...

Therand
Invité n'ayant pas de compte PHPfrance

09 nov. 2012, 00:40

Bonjour à tous,

Et oui, à peine un problème réglé et en voila déjà un autre..
Enfin, en sois pas un problème, mais je suis perdu!

Impossible de trouver les bonnes syntaxes, j'ai essayé avec DEFAULT avec '', update,...
Rien à faire, je ne trouve pas mon erreur!

alors, d'un coté ma bdd:
CREATE TABLE IF NOT EXISTS `user_data` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `notrade` tinyint(1) NOT NULL DEFAULT '0',
  `lastlogin` datetime NOT NULL,
  `guild_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `guild_id` (`guild_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=74 ;
et de l'autre, la page traitement de l'inscription via le site:
$insertion = "INSERT INTO users (user_id, username, password, mail, naissance, inscription) VALUES (NULL, '$pseudo', '$mdp', '$mail', '$date_naissance', NOW())";
$insertion = "INSERT INTO user_data (user_id, notrade, lastlogin, guild_id) VALUES (NULL, '0', NOW(), '0')";
Le premier insertion fonctionne, du moins si je supprime ma seconde ligne ><
Le user_id et lastlogin, je pense que c'est bon, mais notrade et lastlogin, j'ai des doutes...

Mon but est de mettre un N°id automatique pour user_id, de mettre 0 dans notrade (il sera amené à changer), la date actuelle dans lastlogin (NOW()) et enfin guild_id, le plus délicat car beaucoup d'occurrence dans d'autre fichier... (bha oui, c'est l'id de la guilde du joueur, c'est donc pas dans cette table qu'on va le créer...)


Merci pour l'aide ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 nov. 2012, 01:13

salut,

Le problème c'est que ta table user_data est mal faites, le user_id ne pas être en auto_increment, il l'est dans la table users (normal) et tu utilise la valeur créer dans users dans user_data.
Il s'agit d'une contrainte de clef étrangère (foreign key) cela permet d'indiquer (et au sgbd de gérer) la relation entre les deux tables
Le choix de la clef primaire n'est pas bon non plus vu que cette est peux être amenée à contenir plusieurs fois le même user id ?)
$insertion = "INSERT INTO users ( username, password, mail, naissance, inscription) VALUES ( '".$pseudo."', '".$mdp."', '".$mail."', '."$date_naissance."', NOW())";

$insertion = "INSERT INTO user_data (user_id, notrade, lastlogin, guild_id) VALUES (".$idUtilisateur.", 0, NOW(), 0)";
CREATE TABLE IF NOT EXISTS `user_data` (
  `user_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `notrade` tinyint(1) NOT NULL DEFAULT '0',
  `lastlogin` datetime NOT NULL,
  `guild_id` int(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `guild_id` (`guild_id`)
)
je ne vois pas pourquoi ces infos ne sont pas dans la table user, si elles sont unique pas besoin d'une table en plus.
si ce n'est pas le cas, celle ci doit être mieux structurée.


@+
Il en faut peu pour être heureux ......

Therand
Invité n'ayant pas de compte PHPfrance

09 nov. 2012, 18:26

Salut,

Deux tables car la première contiendra les informations générales de l'utilisateur site+jeu (table users)
Tandis que la table user_data contiendra des données in-game.

Dans user_data:
-user_id correspond à l'user_id auto incrédit cité une ligne plus tôt (celui de users) donc user_id (table user) et user_id (table_user) doivent être identiques.
-notrad aura pour valeur "0" par défaut et pourra être changé en "1" par un admin par exemple et pour "dans le jeu"
-lastlogin, juste la date et l'heure actuel... (toutefois il doit être différent du champ "inscription" de ma table "users" car l'utilisateur peut très bien se connecter sur le site et pas sur le jeu et vice-versa! et de toute façon "inscription" est invariable!)
-guild-id est l'id de la guilde du joueur (il peut donc y avoir le même guild_id pour plusieurs membre différents!)

Donc, je pense que dans l'ensemble c'est bon, juste cette histoire de user_id que je ne comprends pas, comment mettre une valeur par défaut quand elle est "0" et une autre qui est en valeur par défaut 'oui', attribut "NULL"
Arg! je comprends vraiment plus rien ><

Sinon pour ton code, j'ai fais:
$insertion = "INSERT INTO users (user_id, username, password, mail, naissance, inscription) VALUES (NULL, '$pseudo', '$mdp', '$mail', '$date_naissance', NOW())";
$insertion = "INSERT INTO user_data (user_id, notrade, lastlogin, guild_id) VALUES (".$idUtilisateur.", '0', NOW(), '0')";
Je pense que tu as laissé passé une petite erreur dans '".$date_naissance."' avec le point une case trop loin et aussi $idUtilisateur qui forcement n'existe pas chez moi.. est il égal à $user_id?

Erf, je bute sur un truc aussi bête ><

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 nov. 2012, 20:51

l'erreur de mon code c'est le . avant les " au lieu de l'inverse "..

Je te conseil d'utiliser la concaténation c'est plus clair et peu t'éviter des soucis plus tard.


Donc la il te manque des connaissances sur la modélisation des données.

dans ton cas le MCD pourrait ressembler à ceci
Image
le code SQL correspondant :
CREATE TABLE user(
        userId      int(11) Auto_increment  NOT NULL ,
        username    Varchar(25) NOT NULL ,
        passwd      Varchar(128) NOT NULL ,
        mail        Varchar(255) NOT NULL ,
        naissance   Date NOT NULL ,
        inscription Date NOT NULL ,
        lastLogin   Datetime,
        PRIMARY KEY (userId)
)ENGINE=InnoDB;

CREATE TABLE guild(
        guildId int(11) Auto_increment  NOT NULL ,
        nom     Varchar(25) NOT NULL ,
        PRIMARY KEY (guildId)
)ENGINE=InnoDB;

CREATE TABLE Perso(
        persoId       int(11) Auto_increment  NOT NULL ,
        nom           Varchar(25) NOT NULL ,
        notrad        Int NOT NULL default 0 ,
        lastLogin     Datetime,
        userId_user   Int NOT NULL ,
        guildId_guild Int NOT NULL ,
        PRIMARY KEY (persoId),
        UNIQUE (nom)
)ENGINE=InnoDB;

ALTER TABLE Perso ADD CONSTRAINT FK_Perso_userId_user FOREIGN KEY (userId_user) REFERENCES user(userId);
ALTER TABLE Perso ADD CONSTRAINT FK_Perso_guildId_guild FOREIGN KEY (guildId_guild) REFERENCES guild(guildId);
il y a les réponses que tu cherche.
Comme tous code sur un forum par copier coller ça sert à rien XD
ce modèle est prévu pour un système permettant à une personne (user) d'avoir plusieurs "personnages" (table perso).
Il y a aussi la description d'une guilde (pas complète, par exemple pas de notion de rang comme le GM ^^).

Pour la modélisation je te conseil de lire des tutos sur le modelé entité - association de la méthode merise.
Je pense que tu as laissé passé une petite erreur dans '".$date_naissance."' avec le point une case trop loin et aussi $idUtilisateur qui forcement n'existe pas chez moi.. est il égal à $user_id?
c'est possible, des fois y a des raté quand on code dans un textarea :)
Si non $idutilisateur c'est assez parlant pour que tu trouve, effectivement le code n'est pas utilisable direct, c'est pas le but. Le but c'est que tu comprenne pour faire toi même ;)

@+
Il en faut peu pour être heureux ......

Therand
Invité n'ayant pas de compte PHPfrance

10 nov. 2012, 02:30

Bonsoir,

Je te remercie pour tes réponses.
Je suis entièrement d'accord avec toi, personnellement, mes pages php sont de moi (en suivant de l'aide sur des tutos divers quand j'en ai eu besoin) et malgré tout, je pense avoir acquis une bonne petite expérience personnelle au fil des années.
Pour "$idUtilisateur" j'imagine que c'est une clé temporaire (ou récupéré via l'url?) crée entre les deux insert qui va stocker l'id et me le rendre sur ma seconde table..

Mais deux soucis me font face...

Bon, aujourd'hui gros point réalisé vu que mon client peut se connecter via mon serveur :p (ce serveur étant ma première instance sous un UNIX nu, comprenez que je suis plutôt content)
Le reste de la journée et du début de lanuit je l'ai passé à chercher une solution car :

-modifier la base (du moins la table user-data et users, les deux dont j'ai besoin ici..) je préfère éviter en vue des liaisons.. en tout 12 tables composent ma base + mes scripts ruby serveur et franchement j'ai pas la motivation de tout réorganiser..
-J'ai encore pas mal de boulot et j'ai pris pas mal de retard, je cherche donc une solution simple et rapide (même si je préfèrerais qqch de bien propre, mais pour l'instant je m'en contenterais..)

Après pas mal d'heure de recherche, voila se que j'ai réussi à obtenir:
user_data:
   CREATE TABLE IF NOT EXISTS `user_data` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `notrade` tinyint(1) NOT NULL DEFAULT '0',
  `lastlogin` datetime NOT NULL,
  `guild_id` int(10) unsigned DEFAULT '0',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
Que pensez-vous de la nouvelle structure? (sachant que pour le reste de mes scripts elle ne pose aucuns problèmes)
          $insertion = 
		 "INSERT INTO users (user_id, username, password, mail, naissance, inscription)
              VALUES (NULL, '$pseudo', '$mdp', '$mail', '$date_naissance', NOW())";
		 "INSERT INTO user_data (user_id)
	      VALUES (NULL)";
Et ici mon insert, j'ai essayé de récupérer l'id avec une fonction toute prête... euuu je ne me souvient plus du nom... mais c'était "..._ID()"
Cela ne fonctionne pas..
Mon code actuel fonctionne, mais n'ajoute que dans la table user_data..., dans users, rien..

Je continue mes recherche grâce à tes précisions, mais je commence à me rendre fou avec cette sql ><
Cdt

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 nov. 2012, 15:55

L'id utilisateur ne peux pas être la clef primaire de la table data car la clef primaire de la table user.

Si ces données sont unique ajoute les a l'utilisateur.
Ce n'est pas un problème d'ajouter des infos a une table. S'en est un quand on en supprime

Il n'y a pas de raison que la table existe avec les infos que tu donne.

Ensuite il faut que tu utilise le mécanisme des clef étrangère pour maintenir la cohérence des données dans la table.

@+
Il en faut peu pour être heureux ......

Therand
Invité n'ayant pas de compte PHPfrance

11 nov. 2012, 17:59

Merci pour ton aide!

J'ai finalement trouvé mon bonheur avec une seconde requête.
Petit bémol, j'ai du changer de methode et donc du remettre les info de connexion à la BDD.
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=rmxosdb', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

$bdd->exec('INSERT INTO user_data(user_id, notrade, lastlogin, guild_id) VALUES(NULL, DEFAULT, NOW(), NULL)');

echo 'Inscription validée';
L’inconvénient de ce système, c'est le souci de double requête: si deux membres s'inscrivent en même temps, il se peut qu'un ID sortent avant l'autre et donc le second inscrit dans la table user devient le premier dans la table user data..
Pas un problème en sois pour moi du fait que les données entré dans la table user_data sont de base les même pour tout le monde sauf l'ID bien sur..

Quoi qu'il en soit merci et.. Sujet résolu ;)