Inserer des données a l aide des clés etrangeres

Par ahmat, il y a 9 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je voulais inserer dans ma table "mission" des données provenant des autres tables à l'aide des "clès etrangères"

<h1 class="page-header">Nouvelle mission</h1> <?php $matricule = $bdd->query('SELECT vehicule.immatricule as matricule FROM vehicule '); $nom_chauf = $bdd->query('SELECT nim_permis,nom FROM chauffeur '); echo "<form class='form-signin' method='post' action='parc_vehicule.php?mission=mission_encours' >"; echo "<table class='table table-bordered'>"; echo "<tr>"; echo "<tr><td>Immatricule</td><td><select class='form-control' name='matricule' > <option value=''></option>"; while ($donneesAM = $matricule->fetch()){ ?> <option value="<?php $donneesAM['matricule'];?>"><?php echo $donneesAM['matricule'];?></option> <?php } echo "</td></select>"; echo "<td>Nom chauffeur</td><td><select class='form-control' name='permis' > <option value=''></option>"; while ($donneeschau = $nom_chauf->fetch()){ ?> <option value="<?php $donneeschau['nom'];?>"><?php echo $donneeschau['nom'];?></option> <?php } echo "</td></select></tr>"; echo "<tr><td>Date debut</td><td><input class='form-control' type='text' name='date_debut' /></td>"; echo "<td>Date fin</td><td><input class='form-control' type='text' name='date_fin' /></td></tr>"; echo "<tr><td>etat</td><td><input class='form-control' type='text' name='etat' /></td>"; echo "<td>Detail</td><td><input class='form-control' type='text' name='detail' /></td></tr>"; echo "</table>"; echo "<input class='form-control' type='submit' name='ajouter_mission' value='Enregistrer' />"; echo "</form>"; } }?>

Ma requete sql:

<?php if (isset ($_POST['ajouter_mission']) && $_POST['ajouter_mission']=='Enregistrer') { $matricule=htmlspecialchars($_POST["matricule"]); $permis=htmlspecialchars($_POST["permis"]); $date_debut=htmlspecialchars($_POST["date_debut"]); $date_fin=htmlspecialchars($_POST["date_fin"]); $etat=htmlspecialchars($_POST["etat"]); $detail=htmlspecialchars($_POST["detail"]); //ajouter mission $reqMi=$bdd->prepare('INSERT INTO mission (id_vehicule,id_chauffeur,date_debut,date_fin,etat,detail) VALUES(:matricule,:permis,:date_debut,:date_fin,:etat,:detail)'); $reqMi->execute(array('matricule'=>$matricule,'permis'=>$permis,'date_debut'=>$date_debut,'date_fin'=>$date_fin,'etat'=>$etat,'detail'=>$detail)); $message="<div class='alert alert-success' role='alert'><strong>La mission a été ajouté avec succès.</strong></div>"; } ?>

Ce que je veux

Décrivez ici ce que vous cherchez à obtenir

Ce que j'obtiens

Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (allandikbd.mission, CONSTRAINT mission_ibfk_1 FOREIGN KEY (id_vehicule) REFERENCES vehicule (immatricule))' in C:\wamp\www\allandik\parc_vehicule.php:147 Stack trace: #0 C:\wamp\www\allandik\parc_vehicule.php(147): PDOStatement->execute(Array) #1 {main} thrown

5 réponses

ahmat, il y a 9 ans

Merci pour votre aide. Bonne journée

cid5420, il y a 9 ans

Euhh il y a quelques problèmes dans ton code !
Comment sont construites tes tables ?

$reqMi=$bdd->prepare('INSERT INTO mission (id_vehicule,id_chauffeur,date_debut,date_fin,etat,detail) VALUES(:matricule,:permis,:date_debut,:date_fin,:etat,:detail)'); $reqMi->execute(array('matricule'=>$matricule,'permis'=>$permis,'date_debut'=>$date_debut,'date_fin'=>$date_fin,'etat'=>$etat,'detail'=>$detail)); $message="<div class='alert alert-success' role='alert'><strong>La mission a été ajouté avec succès.</strong></div>";

Dans ton insert into, tu attend id_vehicule et ton paramètre est 'matricule'=>$matricule (est ce que c'est l'id de ta table vehicule ?)

ahmat, il y a 9 ans

Non c'est pas l'id de la table vehicule.
table mission : [id_mission], id_vehicule et id_chauffeur se sont mes clès etrangeres, date_debut , date_fin, etat ,detail .
table chauffeur : [nim_permis],nom,prenom...
table vehicule : [ immatricule],marque...

cid5420, il y a 9 ans

Normalement si tu veux enregistrer dans ta table mission l'id de véhicule et chauffeur, il faut passer en paramètre ces ID ! (si les champs sont bien des INT)
exemple :

//table article id_article(int) AI cle unique id_categorie(int) cle etrangere nom_article(varchar) //table categorie id_categorie(int) AI cle unique nom_categorie(varchar) //je vais inserer la categorie dans ma table article, je le recupere en get ($_GET['id']) $cat = select * from categorie where id_categorie = $_GET['id'] //la syntaxe n'est pas exact (la fleme) mais c'est l'idée $cat = id de la table categorie $nom_article = $_post['name'] // là j'invente..... //ensuite une foi que tu as l'ID, tu l'insert $req = INSERT INTO article (id_categorie, nom_article) VALUES ($cat, $nom_article);

Là je te donne juste le raisonnement à toi de réfléchir !!!!

ahmat, il y a 9 ans

Merci j'ai ressolu l'erreur. En faite le problème c'est que mes 2 variables ne reçoivent pas les valeurs : $matricule=htmlspecialchars($_POST["matricule"]); et $permis=htmlspecialchars($_POST["permis"]);
Donc au niveau de mon boucle while, j'ai mis :
""
while ($donneesAM = $matri->fetch()){
echo '<option value="' , $donneesAM['immatricule'] , '">' , stripslashes(htmlentities(trim($donneesAM['immatricule']))) , '</option>';
}
""
Merci et bonne soirée.