{MySQL}//php Erreur fk insertion

Fermé
leototo75 Messages postés 14 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 17 août 2009 - 22 juil. 2009 à 09:45
leototo75 Messages postés 14 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 17 août 2009 - 22 juil. 2009 à 10:37
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
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.
<?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 (!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
{

while ($tableau=mysql_fetch_array($resultat))
{
$originerequet=$tableau['max'];
}
$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,ClientPNet,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,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']);
}
?>

Voila merci d'avance si vous trouver une solutions je retourne dessus ^^
A voir également:

1 réponse

leototo75 Messages postés 14 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 17 août 2009
22 juil. 2009 à 10:37
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.
0