IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Clé étrangère avec table association [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Clé étrangère avec table association
    Bonjour,
    Je viens parmis vous car je rencontre quelque petits problèmes en effet J'ai le droit à la fameuse erreur. Je dois importer un fichier csv , tout cela marche sauf depuis la création de ma table assosicative.
    Erreur SQL !INSERT INTO trans_ori_con(Idorigine,idcontact) VALUES('14','7')
    Cannot add or update a child row: a foreign key constraint fails (`contactsnews`.`trans_ori_con`, CONSTRAINT `Fk_trans_ori_con_Contacts` FOREIGN KEY (`idcontact`) REFERENCES `contacts` (`idcontact`))
    Voici mes tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    CREATE TABLE Contacts (
    idcontact INT NOT NULL AUTO_INCREMENT ,
    Email VARCHAR( 100 ) NOT NULL ,
    Tel INT NULL ,
    Sexe VARCHAR( 15 ) NULL ,
    CodePostal INT NULL ,
    Age INT NULL ,
    DateEntree DATE NULL ,
    DateFraicheur DATE NULL ,
    ClientPWap INT NULL ,
    ClientPNet INT NULL ,
    ClientPWeb INT NULL ,
    NewsletterEntreprise INT NULL ,
    NewsletterPartenaire INT NULL ,
    PRIMARY KEY ( idcontact,Email )
    )
    CREATE TABLE Origine(
    Idorigine int NOT NULL AUTO_INCREMENT,
    LibelleOrigine VARCHAR(50) NOT NULL,
    abregelib VARCHAR(10) NOT NULL,
    PRIMARY KEY (Idorigine)
    )
    CREATE TABLE trans_ori_con(
    Idorigine int NOT NULL,
    idcontact int NOT NULL,
    PRIMARY KEY (Idorigine,idcontact)
    )
    ALTER TABLE contacts ADD UNIQUE email_ind ( Email ( 100 ) ) ;
    ALTER TABLE trans_ori_con ADD CONSTRAINT Fk_trans_ori_con_Contacts foreign key (idcontact) REFERENCES Contacts(idcontact);
    ALTER TABLE trans_ori_con ADD CONSTRAINT Fk_trans_ori_con_origine  foreign key (Idorigine) REFERENCES Origine(Idorigine);
    Voici mon script


    Donc en premier j'insert dans ma table mère , je select l'id origine et l'id contact et j'insert dans ma table association .Apparement cela ne lui plait pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    <?php
        if( isset($_POST['import']) ) // si formulaire soumis
        {
        $content_dir = './dossier/'; // dossier où sera déplacé le fichier
    	$tmp_file = $_FILES['fichier']['tmp_name'];
     
    	if( !is_uploaded_file($tmp_file) )
    	    exit("Le fichier est introuvable");
     
    	// on copie le fichier dans le dossier de destination
    	$name_file = $_FILES['fichier']['name'];
     
    	if(file_exists("./dossier/" .$name_file)) 
    	{
    	echo "Fichier deja existant";
    	}
    		else 
    		{
     
    			if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )
    				exit("Nom de fichier non valide");
    			else 
    				if( !move_uploaded_file($tmp_file, "./dossier/" . $name_file) )
    					{exit("Impossible de copier le fichier");}
     
    					$host="***";
    					$user="***";
    					$pass="***";
    					$delet = $_POST['delet'];
    					// connexion à la base
    					$db = mysql_connect($host, $user, $pass)  or die('Erreur de connexion '.mysql_error());
    					// sélection de la base  
    					mysql_select_db('contactsnews',$db)  or die('Erreur de selection '.mysql_error());
     
    					$fp = fopen("./dossier/" . $name_file, "r");
     
    					$str="";
    					$cpt=0;
    					$select="select max(idcontact) as max from contacts";
    					$resultat=mysql_query($select) or die('Erreur SQL !'.$select.'<br>'.mysql_error());
    					while ($tableau=mysql_fetch_array($resultat))
    							{
    							$originerequet=$tableau['max'];
    							}
    					while (!feof($fp)) /* Et Hop on importe */
    					{ /* Tant qu'on n'atteint pas la fin du fichier */ 
    						$ligne = fgets($fp,4096); /* On lit une ligne */  
     
    						if(feof($fp))
    						{
    						echo"transfert effectué";
    						}
    						else
    						{
     
     
    							$originerequet=$originerequet+1;
     
     
    						   /* On récupère les champs séparés par ; ou autre délimiteur dans liste*/
    						   $liste = explode( $delet,$ligne);  
     
    						   /* On assigne les variables */ 
     
     
    						  If ($liste[0]<>null)
    						   {
    						   $val1=str_replace("'","",$liste[0]);
    						   }
    						   If ($liste[1]<>null)
    						   {
    						   $val2=str_replace("'","",$liste[1]);
    						   }
    						   $val3="Autres";
     
     
    						  $insert= "INSERT INTO contacts(Email,Sexe,DateEntree,DateFraicheur,ClientPWap,ClientPTel,ClientPWeb,NewsletterEntreprise,NewsletterPartenaire) 
    						   VALUES('$val1','$val2',NOW(),NOW(),0,0,0,0,0) 
    						   ON DUPLICATE KEY UPDATE  Email = '$val1', Sexe = '$val2',DateEntree = NOW()
    						   ,DateFraicheur = NOW(),ClientPWap = 0,ClientPTel = 0,ClientPWeb = 0,NewsletterEntreprise = 0,NewsletterPartenaire = 0";
    						  $result2= MYSQL_QUERY($insert);
     
    							$sql2="select idorigine from origine where LibelleOrigine='$val3'";
    							$res=mysql_query($sql2) or die('Erreur SQL !'.$sql2.'<br>'.mysql_error());
    							while ($tab2=mysql_fetch_array($res))
    							{
    							$origineidreq=$tab2['idorigine'];
    							}
     
    						}
     
    							$sql3="INSERT INTO trans_ori_con(Idorigine,idcontact) VALUES('$origineidreq','$originerequet')";
    							$resultat=mysql_query($sql3) or die('Erreur SQL !'.$sql3.'<br>'.mysql_error());
     
    							if(mysql_error())
    						{ /* Erreur dans la base de donnees, sûrement la table qu'il faut créer */
    							print "Erreur dans la base de données : ".mysql_error();
    							print "<br>Importation stoppée.";
    							exit();
    						} 
    						   //else /* Tout va bien */
    							 print "$val1 $val2  $originerequet <br>";
    					}  
    				echo "Le fichier a bien été uploadé";
    		}	
        }
        if(isset($_REQUEST['del'])){
        	unlink("./dossier/".$_REQUEST['del']);
        }
    ?>
    Merci bien .
    Cordialement


    Bon j'ai réussit à insérer , c'était juste une erreur de colonne (sans commentaire ^^).
    Mais maintenant j'ai un autre problème .Dans mes fichiers csv j'ai des doublons, pour l'insertions dans contacts il n'y a aps de problème je gère le problème mais je rencontre une difficulté dans la table association en effet dès qu'il retrouve la meme personne il ne fais pas l'insertion car ce dernier n'est aps inserrer dans contact (dasn contact les doublons sont gérer apr des mise à jours).Et cela arrete le script.
    Je vois pourquoi cela génère un problème mais je voudrais passé outre l'insertion dans la table association quand il a un doublon dans le csv.

    De plus j'ai oublié de précisé ^^ un contact peut avoir plusieurs origine.

  2. #2
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Bonjour,
    Ne peux-tu pas là aussi utiliser la clause ON DUPLICATE KEY UPDATE sur la table trans_ori_con ?
    Fred

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse rapide

    Ben j'y ai pensé mais le problème c'est que je pense par la suite que si un contact a plusieurs origine je le retouve aps dans la table assoc.
    En effet il mettra a jour le champs id origines du contact dans al table assoc , et donc je n'aurais pas plusieurs ligne avec l'id du contact dans la table assoc.
    Enfin c'est ce que ej pense mais c'est probable que je me trompe. Meme fortement probable

  4. #4
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    A priori,
    la clé primaire de ta table étant (Idorigine,Idcontact)
    l'insert ne se transformera en update que si le couple existe déjà.
    Par exemple :
    (1,1) -> insert
    (2,2) -> insert
    (2,1) -> insert
    (1,2) -> insert
    (1,1) -> update
    (1,2) -> update
    C'est à tester, mais je pense que ça doit fonctionner pour ton problème.
    Fred

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Erreur SQL !INSERT INTO trans_ori_con(Idorigine,idcontact) VALUES('14','14') on duplicate key update Idorigine='14', idcontact='14'
    Cannot add or update a child row: a foreign key constraint fails (`contactsnews`.`trans_ori_con`, CONSTRAINT `Fk_trans_ori_con_Contacts` FOREIGN KEY (`idcontact`) REFERENCES `contacts` (`idcontact`))
    voila j'ai tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql3="INSERT INTO trans_ori_con(Idorigine,idcontact) VALUES('$origineidreq','$originerequet') on duplicate key update Idorigine='$origineidreq', idcontact='$originerequet'";
    Je suis en train de voir avec une autre solution, je vous tiens au courant.



    Voila j'ai trouvé enfin , merci pour ton aide, alors pour ceux que ça aiderait (j'avais fait un compteur car le select des id fonctionnait aps surement une erreurs de ma part ^^)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     $selectid="select idcontact from contacts where Email='$val1'";
    							$resselect=mysql_query($selectid) or die('Erreur SQL !'.$selectid.'<br>'.mysql_error());
    							while ($tabselect=mysql_fetch_array($resselect))
    							{
    							$idcontactselect=$tabselect['idcontact'];
    							}
     
    $sql3="INSERT INTO trans_ori_con(Idorigine,idcontact) VALUES('$origineidreq','$idcontactselect') on duplicate key update Idorigine='$origineidreq', idcontact='$idcontactselect'";
    							$resultat=mysql_query($sql3) or die('Erreur SQL !'.$sql3.'<br>'.mysql_error());

  6. #6
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Je viens de découvrir l'option IGNORE pour la commande SELECT.
    Si j'ai bien compris son utilisation,
    elle serait plus pertinente que on duplicate key pour la table trans_ori_con.
    En effet,
    si les deux tables origine et contacts sont déjà liées
    alors je n'ai rien à mettre à jour, c'est mieux d'ignorer.

    Fred

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je vais essayer avec ignore , je pense que j'aurais un gain de temps.
    Merci bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête HQL avec tables associatives
    Par mecha31 dans le forum Hibernate
    Réponses: 1
    Dernier message: 15/05/2015, 13h32
  2. Réponses: 1
    Dernier message: 12/07/2013, 08h32
  3. sélection avec table associative
    Par Invité dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2009, 16h42
  4. [phpMyAdmin] Lier les tables (clés étrangères) avec phpMyAdmin
    Par tarik2a dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 23/05/2007, 18h28
  5. Rêquete de sélection avec des tables associative
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 20/02/2006, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo