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
Auteur

Merci pour votre aide. Bonne journée

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
Auteur

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...

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
Auteur

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.