problème liaison table

Eléphant du PHP | 388 Messages

09 mars 2010, 19:12

bonjour a tous j'ai deux tables une utilisateurs et une autre annonces
dans la table utilisateurs ma clé primaire est numutilisateurs
j'ai rajouté dans ma table annonce numutilisateurs

mais quand une personne met une annonce, dans annonces je n'est pas le numutilisateurs qui change par défaut cela met 0.

Voici ma requete sql de ma table utilisateurs.
CREATE TABLE IF NOT EXISTS `utilisateurs` (
  `NUMUTILISATEURS` int(8) NOT NULL auto_increment,
  `TYPEUTILISATEURS` int(1) NOT NULL,
  `NOMUTILISATEURS` varchar(30) NOT NULL,
  `PRENOMUTILISATEURS` varchar(30) NOT NULL,
  `MAILUTILISATEURS` varchar(50) NOT NULL,
  `TELEPHONE` varchar(10) default NULL,
  `RUEUTILISATEURS` varchar(100) default NULL,
  `VILLEUTILISATEUR` varchar(30) default NULL,
  `CPUTILISATEURS` char(5) default NULL,
  `MDP` varchar(50) NOT NULL,
  `CODEACTIVATION` varchar(20) default NULL,
  `REGION` varchar(20) NOT NULL,
  `SIRET` varchar(15) NOT NULL,
  `DENOMINATION` varchar(30) NOT NULL,
  ` DateInscription` datetime NOT NULL,
  PRIMARY KEY  (`NUMUTILISATEURS`),
  KEY `FK_REFERENCE_11` (`TYPEUTILISATEURS`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=41 ;

et voici ma requête de ma table annonces
CREATE TABLE IF NOT EXISTS `annonces` (
  `numannonce` int(8) NOT NULL auto_increment,
  `departement` varchar(50) NOT NULL,
  `region` varchar(50) NOT NULL,
  `categorie` varchar(50) NOT NULL default '',
  `typeannonce` varchar(50) NOT NULL default '',
  `souscategorie` varchar(50) NOT NULL default '',
  `titreannonce` varchar(50) NOT NULL default '',
  `descriptionannonce` text NOT NULL,
  `prix` varchar(50) NOT NULL default '',
  `NUMUTILISATEURS` int(8) NOT NULL,
  PRIMARY KEY  (`numannonce`),
  KEY `NUMUTILISATEURS` (`NUMUTILISATEURS`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;

je ne voit pas se qui cloche pouvez vous m'aider merci d'avance

Eléphant du PHP | 453 Messages

09 mars 2010, 23:48

Et l'eau,

Tu t'es trompé de terme. Ce n'est pas key qu'il faut utiliser mais plutôt foreign key (clef étrangère). Key n'est qu'un index de table. Là dans ton cas, nous sommes dans une relation de un à plusieurs (1*n). En effet, un utilisateur peut avoir plusieurs annonces alors qu'une annonce ne peut avoir qu'un seul utilisateur.

Donc, ça se passe comme ceci (en faisant simple) :
CREATE TABLE IF NOT EXISTS `annonces` (
  `numannonce` int(8) NOT NULL AUTO_INCREMENT,
  `departement` varchar(50) NOT NULL,
  `region` varchar(50) NOT NULL,
  `categorie` varchar(50) NOT NULL DEFAULT '',
  `typeannonce` varchar(50) NOT NULL DEFAULT '',
  `souscategorie` varchar(50) NOT NULL DEFAULT '',
  `titreannonce` varchar(50) NOT NULL DEFAULT '',
  `descriptionannonce` text NOT NULL,
  `prix` varchar(50) NOT NULL DEFAULT '',
  `NUMUTILISATEURS` int(8) NOT NULL,
  PRIMARY KEY  (`numannonce`),
  FOREIGN KEY `NUMUTILISATEURS` REFERENCE utilisateurs(`NUMUTILISATEURS`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;
1. ce sujet devrait plutôt être posté dans le forum SQL.
2. il est de rigueur que ce soit les instructions SQL qui doivent être en majuscule et non le nom des champs.
3. je t'invite à tenir une ligne de conduite sur l'écriture (majuscule/minuscule). Pas de mélange indigeste.
4. commenter ses tables c'est pas mal aussi
5. VARCHAR c'est pas mal. N'oublie pas qu'il y a d'autres types de champs. ;)
6. pas de date ? (?!)

Bonne soirée à toi
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 388 Messages

10 mars 2010, 10:19

arffff... je me suis cracké d'endroit :? je te remercie pour ta réponse question bête pour réinjecter

Code : Tout sélectionner

FOREIGN KEY `NUMUTILISATEURS` REFERENCE utilisateurs(`NUMUTILISATEURS`)
Je peut juste lancer une requête SQL pour enregistrer cette clé ?
Ou doit-je refaire toute ma table ?

Oui effectivement j'ai oublié le champs Date #-o merci .

Je vais essayer cela

Eléphant du PHP | 388 Messages

10 mars 2010, 13:58

j'ai essayé de recrée une table avec ton changement cela me donne le message d'erreur que voici

MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REFERENCE utilisateurs(`NUMUTILISATEURS`)
) ENGINE=MyISAM DEFAULT CHARSET=lati' at line 13

Eléphant du PHP | 453 Messages

10 mars 2010, 14:09

Et l'eau,
je me suis cracké d'endroit
C'est pas grave. Il n'y a pas de péril en la demeure. :)

<<<EDIT
j'ai essayé de recrée une table avec ton changement cela me donne le message d'erreur que voici

MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REFERENCE utilisateurs(`NUMUTILISATEURS`)
) ENGINE=MyISAM DEFAULT CHARSET=lati' at line 13
Réponse ci-après. Et encore désolé pour ce contre temps.
EDIT;


Oups, j'ai fait une petite erreur de syntaxe. J'aurais dû vérifier ma syntaxe (S à référence). En plus lorsque j'ai écris, j'ai eu le doute. Désolé pour cette perte de temps.
FOREIGN KEY `champ_clef_etrangere_table_courante` REFERENCES table_source(`champ_source`) 
Ou doit-je refaire toute ma table ?
Non, tu peux altérer ta table. Il me semble que ce lien devrait t'aider (lu en biais). lien général à mettre dans les favoris. Si tu utilises Firefox :love4:, sache qu'il existe un moteur de recherche. ;)
Oui effectivement j'ai oublié le champs Date #-o merci .
Je dirai qu'il n'y a pas qu'une date... Avant d'insérer des données dans une base, toujours bien réfléchir sur sa base. Après il est tout à fait possible de faire des modifications. Mais paye tes contraintes, transport de données, mise à jour, créations de champs temporaires, etc.. Si au départ, tu réfléchis bien dessus, tu évites au maximum les manipulations. Je t'invites à prendre une feuille et un crayon et dessiner ta BDD. Ainsi, tu auras une vue d'ensemble. Il y a souvent des choses plus frappante (aï, ouille :lol: ) lorsque tu vois ta base. Sinon, tu peux télécharger DIA pour modéliser (lien dans ma signature). Dia permet juste d'élaborer un diagramme. Il y a également MySql Workbench aussi.

Apparemment, tu écris les instructions toi même et là je te dis +1. Surtout quand on commence à coder en SQL. La console Mysql, c'est pas beau, ce n'est pas ergonomique, mais beaucoup plus enrichissant. Après quand on a plus d'expérience en SQL, on peut utiliser des utilitaires qui rendent la vie plus facile. ;)

Aussi, je t'invite à mettre sur le forum un enregistrement de ta base (même bidon). Si tu préfères garder le secret de tes instructions, données, je t'autorise à m'envoyer un mp. Sache que c'est exceptionnel. Car là, ta base est quand même bancal (forme standard d'une SGBDR). Je veux bien te donner un coup de pouce. Toutefois, l'architecture sera mis sur le forum afin que d'autres membres puissent te donner des idées ou autres auxquels je n'aurais pas pensées.

Bonne journée à toi. :)
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 388 Messages

10 mars 2010, 18:37

merci pour ta reponse j'ai bien lue sur ALTER TABLE mais si je supprimer NUMUTILISATEURS

Pour l'inserer a nouveau je peut faire cela
ALTER TABLE  FOREIGN KEY `numutilisateurs`  REFERENCES utilisateurs(`numutilisateurs`) 

OU

ALTER TABLE annonces  ADD FOREIGN KEY `numutilisateurs`  REFERENCES utilisateurs(`numutilisateurs`) 

:?

Ma clé numutilisateurs étant ma clé primaire de ma table utilisateurs

j'ai essayé cela elle c'est bien enregistré mais le HIC #-o c'est que l'id de l'utilisateur ( NUMUTILISATEURS) qui pose ne s'affiche pas dans mon annonce

Code : Tout sélectionner

ALTER TABLE `annonces` ADD CONSTRAINT `NUMUTILISATEURS` FOREIGN KEY (`NUMUTILISATEURS`) REFERENCES `utilisateurs` (`NUMUTILISATEURS`);

Eléphanteau du PHP | 31 Messages

10 mars 2010, 20:35

Bonjour,

Je n'ai pas bien compris en quoi la clé étrangère est la solution du problème.

On a deux requête de création de table, il faudrait la requête d'injection pour savoir d'où vient le problème. D'autant plus que, si c'est MySql qui est utilisé, les clés étrangères ne sont pas supportées par tous les moteurs.

Peux tu nous montrer la requête qui te sert à enregistrer des données dans la table ainsi que l'éventuel code que tu utilises ?

Eléphant du PHP | 388 Messages

10 mars 2010, 20:49

mais les clé étrangère fond bien la liaison entre les tables,
exemple l'utilisateur 1 pose nue annonce, dans la tables annonce on verra que c'est l'utilisateur 1 qui la posé.
Je ne comprend pas pourquoi le code d'injection des donnée dans la table est nécessaire.

Pourrai tu m'aiguiller sil te plait
$sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,time,departement,region) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d")."','time:auto NOW()','$departement','$region')";

Eléphanteau du PHP | 31 Messages

10 mars 2010, 20:53

Tu ne renseignes pas le champ NUMUTILISATEURS dans ta requête, c'est donc normal que MySql y mette la valeur par défaut (à savoir 0).

Si tu veux qu'une valeur soit dans ce champ tu dois la donner. Comment MySql pourrait-il savoir quoi mettre dedans ? Même si les clés étrangères sont gérées dans le moteur que tu utilise, comment MySql déciderait de mettre 1,2 ou 3 ?

Eléphant du PHP | 388 Messages

10 mars 2010, 20:58

je viens de rajouter NUMUTILISATEURS j'ai fait comme cela
$sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,time,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d")."','time:auto NOW()','$departement','$region','$NUMUTILISATEURS')";
cela ne fonctionne toujours pas

Eléphanteau du PHP | 31 Messages

10 mars 2010, 21:18

Que contient la variable $NUMUTILISATEUR ?

Si elle n'est pas renseignée ou mal renseignée il se peux que ça ne fonctionne pas. Essaye d'afficher la requête avant de l'exécuter et montre nous ce que ça donne.

Eléphant du PHP | 388 Messages

10 mars 2010, 21:39

Que contient la variable $NUMUTILISATEUR ?

Si elle n'est pas renseignée ou mal renseignée il se peux que ça ne fonctionne pas. Essaye d'afficher la requête avant de l'exécuter et montre nous ce que ça donne.
NUMUTILISATEURS doit corresponde au numero de l'utilisateur de la table utilisateurs c'est pour cela que cela qu'il fallait une clé étrangère.


Voici le code complet de ma page PHP qui injecte les données.
<?php
// Fonction pour parser les variables vers FLASH 
function Parse($variable,$valeur) { 
echo "&" . $variable . "=" . utf8_encode($valeur);
}

$categorie=$_POST['categorie']; 
$typeannonce=$_POST['typeannonce'];
$souscategorie=$_POST['souscategorie'];
$titreannonce=$_POST['titreannonce'];
$descriptionannonce=$_POST['descriptionannonce'];
$prix=$_POST['prix'];

$departement=$_POST['departement'];
$region=$_POST['region'];

$NOMUTILISATEURS=$_POST['NOMUTILISATEURS'];
$MAILUTILISATEURS=$_POST['MAILUTILISATEURS'];
$TELEPHONE=$_POST['TELEPHONE'];




//Fontion "decoder" (facultative)
function decoder($texte){
	$texte = utf8_decode($texte);
      /*$texte = stripslashes($texte);
	$texte = trim($texte);
	$texte = htmlentities($texte, ENT_QUOTES);
	$texte = strip_tags($texte);
	$texte = nl2br($texte);
	$texte = str_replace(">", ">", $texte);
	$texte = str_replace("<", "<", $texte);*/
		
		 
        
        $texte = str_replace("%","%25",$texte); 
        $texte = str_replace("!","%21",$texte); 
        $texte = str_replace("\"","%22",$texte); 
        $texte = str_replace("#","%23",$texte); 
        $texte = str_replace("\$","%24",$texte); 
        $texte = str_replace("&","%26",$texte); 
        $texte = str_replace("'","%27",$texte); 
        $texte = str_replace("(","%28",$texte); 
        $texte = str_replace(")","%29",$texte); 
        $texte = str_replace("*","%2A",$texte); 
        $texte = str_replace("+","%2B",$texte);               
        $texte = str_replace("<","%3C",$texte); 
        $texte = str_replace("=","%3D",$texte); 
        $texte = str_replace(">","%3E",$texte); 
        $texte = str_replace("?","%3F",$texte);         
        $texte = str_replace("[","%5B",$texte); 
        $texte = str_replace("]","%5D",$texte); 
        $texte = str_replace("^","%5E",$texte);          
        $texte = str_replace("`","%60",$texte); 
        $texte = str_replace("{","%7B",$texte); 
        $texte = str_replace("|","%7C",$texte); 
        $texte = str_replace("}","%7D",$texte); 
        $texte = str_replace("~","%7E",$texte); 
        $texte = str_replace("¢","%A2",$texte); 
        $texte = str_replace("£","%A3",$texte); 
        $texte = str_replace("¥","%A5",$texte); 
        $texte = str_replace("|","%A6",$texte); 
        $texte = str_replace("§","%A7",$texte); 
        $texte = str_replace("«","%AB",$texte); 
        $texte = str_replace("¬","%AC",$texte); 
        $texte = str_replace("¯","%AD",$texte); 
        $texte = str_replace("º","%B0",$texte); 
        $texte = str_replace("±","%B1",$texte); 
        $texte = str_replace("ª","%B2",$texte);        
        $texte = str_replace("µ","%B5",$texte); 
        $texte = str_replace("»","%BB",$texte); 
        $texte = str_replace("¼","%BC",$texte); 
        $texte = str_replace("½","%BD",$texte); 
        $texte = str_replace("¿","%BF",$texte); 
	return $texte;
}	

$categorie = decoder($categorie);
$typeannonce = decoder($typeannonce);
$souscategorie = decoder($souscategorie);
$titreannonce = decoder($titreannonce);
$descriptionannonce = decoder($descriptionannonce);
$prix = decoder($prix);
$departement = decoder($departement);
$region = decoder($region);

$NOMUTILISATEURS = decoder($NOMUTILISATEURS);
$MAILUTILISATEURS = decoder($MAILUTILISATEURS);
$TELEPHONE = decoder($TELEPHONE);


//ici on commence avec les requêtes MySQL pour vérifier dans la table

include ('connect.php');//ici on inclut le fichier avec l'accès MySQL.

$sql = "SELECT * FROM utilisateurs WHERE MAILUTILISATEURS = '$MAILUTILISATEURS'";//On sélectionne dans la table "UTILISATEUR" le login qui a pour valeur la variable "$login" 
    $req = mysql_query($sql)or die(mysql_error());   
    $result = mysql_numrows($req);// on compte le nombre de résultats 

    if($result!=0)  // le login existe déjà
        { 
        Parse("resultat","email '$MAILUTILISATEURS' existe deja, desole"); //alors on renvoi au Flash que le login '$MAILUTILISATEURS' existe déjà
        } 
    else  //sinon le login n'existe pas  
        {    
        $sql = "INSERT INTO utilisateurs (NOMUTILISATEURS,MAILUTILISATEURS,TELEPHONE) VALUES ('$NOMUTILISATEURS','$MAILUTILISATEURS','$TELEPHONE')"; //Alors on insert dans la table le nouvel utilisateur		
		mysql_query ($sql);
			$sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d H:i:s")."','$departement','$region','$NUMUTILISATEURS')";
			$req = mysql_query($sql2)or die(mysql_error()); 			
			
  	Parse("resultat","merci $MAILUTILISATEURS, vous etes a present enregistre et votre annonce est enregistré");
        }
		
		
		
		

?>

Eléphanteau du PHP | 31 Messages

10 mars 2010, 21:42

Je ne vois nulle part l'initialisation de la variable, elle ne contient donc rien à première vue.

Si elle ne contient rien, rien n'est inséré dans la table.

Eléphant du PHP | 388 Messages

10 mars 2010, 21:50

justement NUMUTILISATEURS et ma clé primaire de la table utilisateurs ( mon ID )celle ci s'auto-incremente quand un utilisateur s'enregistre a aucun moment je les précisé dans mon code voit tu se que je veut dire

Eléphanteau du PHP | 31 Messages

10 mars 2010, 22:39

Désolé mais je ne comprends pas.

Ton autre table n'a rien à voir la dedans. Tu fais une requête pour insérer des données, tu dois renseigner des valeurs. Tu utilises une variable, tu dois y mettre quelque chose.

Si tu veux que cette variable contienne l'id d'un utilisateur, tu dois le mettre dedans. Le champ de la table s'auto-incrémente peut-être mais ça n'a rien à voir avec ta variable, tu dois mettre une valeur dans cette variable sinon ça ne fonctionnera jamais. Ton code php ne peut pas deviner de quel utilisateur il s'agit et quel id récupérer.