Problème lié à une clé étrangère

Résolu
aichatou - 14 mai 2024 à 12:55
 Aichatou - 20 mai 2024 à 11:38

Bonjour, j'ai parcouru les discutions, j'ai vu un sujet lié à ce problème, j'ai utilisé la même procédure mais je n'ai pas pu résoudre le problème. J'ai créé une table stagiaire et une table département_service(en abrégé dep_serv). j'ai ajouté une clé (id_dep_serv) dans la table stagiaire dans le but de lister les stagiaires associés aux différents services. J'ai aussi créé deux formulaires l'un pour ajouter les stagiaires et l'autre pour les afficher. Voici le message d'erreur que ça m'affiche:

Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`grh_uas`.`stagiaire`, CONSTRAINT `id_dep_serv` FOREIGN KEY (`id_dep_serv`) REFERENCES `dep_serv` (`id_dep_serv`)) in C:\Nouveau dossier\htdocs\ALI3\funda-service\admin\operation.php:105 Stack trace: #0 C:\Nouveau dossier\htdocs\ALI3\funda-service\admin\operation.php(105): PDOStatement->execute(Array) #1 {main} thrown in C:\Nouveau dossier\htdocs\ALI3\funda-service\admin\operation.php on line 105

Voici la structure de deux tables:

 CREATE TABLE `dep_serv` (
  `id_dep_serv` int(11) NOT NULL AUTO_INCREMENT,
  `nom_serv` varchar(50) NOT NULL,
  PRIMARY KEY (`id_dep_serv`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

CREATE TABLE `stagiaire` (
  `id_stag` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(50) NOT NULL,
  `prenom` varchar(50) NOT NULL,
  `datenaiss` date NOT NULL,
  `lieunaiss` varchar(50) NOT NULL,
  `niveau_etude` varchar(50) DEFAULT NULL,
  `etab_provenance` varchar(50) DEFAULT NULL,
  `date_debut_stag` date NOT NULL,
  `date_fin_stag` date NOT NULL,
  `type_stag` enum('stage academique','stage de perfectionnement') NOT NULL,
  `id_dep_serv` int(11) NOT NULL,
  `sexe` enum('masculin','feminin') NOT NULL,
  PRIMARY KEY (`id_stag`),
  KEY `id_dep_serv` (`id_dep_serv`),
  CONSTRAINT `id_dep_serv` FOREIGN KEY (`id_dep_serv`) REFERENCES `dep_serv` (`id_dep_serv`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

Voici le code pour ajouter un stagiaire:

<?php
if(!empty($_SESSION['id']) || isset($_SESSION['id'])){
		session_start();
		header('location:ajout_stagiaire.php');
	}

include('includes/header.php');
include('includes/topbar.php');
include('includes/sidebar.php');
include('config/cn.php');


//affichage du message d'erreur
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//fin d'affichage
	
	

$re=$cn->query('SELECT * FROM stagiaire');
//$tabRe=$re->fetch();

?>

<!DOCTYPE html>
<html>
<head>
	<title></title>
	 <meta charset="utf-8"> 
    <meta name="viewport" 
     content="width=device-width, initial-scale=1, shrink-to-fit=no"> 
  
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" /> 
</head>
<body>


<div class="content-wrapper">

 <div class="content-header">
      <div class="container-fluid">
        <div class="row mb-2">
          <div class="col-sm-6">
            <h1 class="m-0">Espace Stagiaire</h1>
          </div><!-- /.col -->
          <div class="col-sm-6">
            <ol class="breadcrumb float-sm-right">
              <li class="breadcrumb-item"><a href="#">Home</a></li>
              <li class="breadcrumb-item active">Enseignants</li>
            </ol>
          </div><!-- /.col -->
        </div><!-- /.row -->
      </div><!-- /.container-fluid -->
    </div><!--container-->

	<section class="content">
		<div class="container-fluid">
			<div class="row"><br><br>
				<div class="col-md-12">
					<!--ajout message d'alerte-->

					<?php if (isset($_GET['msg'])){?>
				<?php if($msg == 1) { ?>
				<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>Enregistrement effectué avec succès!
				</div>
				<?php } ?>
			<?php } ?>


					<!---->
					<div class="card">
						<div class="card-header text-white bg-info">Nouveau Stagiaire</div>
						<div class="card-header">Veuillez completez les differents champs!</div>
						<div class="card-body">
					
							<form class="form-inline" action="operation.php" method="POST">
								<input type="hidden" name= "c" value= "6">
						<!--input type="hidden" name="sexe" value="<?php echo $tabRe['sexe']; ?>"-->
						<input type="hidden" name="id_stag" value="<?php echo$tabRe['id_stag']; ?>">

<!--/////////////////////////////////////////////-->


<div class="col-md-2">
	<label for="nom">Nom</label>
	<input type="text" name="nom" class="form-control" placeholder="Entrer votre Nom" required>
</div>&emsp;&emsp;&emsp;;&emsp;<!-- &emsp; (« em space ») va nous permettre de créer une espace quadruple ;-->


<div class="col-md-2">
	<label for="prenom">Prenom</label>
	<input type="text" name="prenom" class="form-control" placeholder="Entrer votre Nom" required>
</div>&emsp;&emsp;&emsp;

<div class="col-md-2">
	<label for="sexe">Sexe</label>
	<select class="form-control" name="sexe">
	<option value="">Choisissez le sexe</option>
	<option value="masculin">Masculin</option>
	<option value="feminin">Feminin</option>
	</select>
</div>&emsp;

<div class="col-md-2">
	<label for="datenaiss">Datenaiss</label>
	<input type="date" name="datenaiss" class="form-control" placeholder="" required>
</div>

<div class="col-md-2">
	<label for="lieunaiss">Lieunaiss</label>
	<input type="text" name="lieunaiss" class="form-control" placeholder="Entrer votre lieunaiss" required>
</div>&emsp;
<div class="col-md-2">
	<label for="niveau_etude">Niveau d'etude</label>
	<input type="text" name="niveau_etude" class="form-control" placeholder="Entrer votre Email" required>
</div>&emsp;&emsp;&emsp;&emsp;
<!--div class="col-md-2">
	<label for="tel">Telephone</label>
	<input type="text" name="tel" class="form-control" placeholder="Entrer votre num tel" required>
</div-->
<div class="col-md-2">
	<label for="type_stag">Type de stage</label>
	<select class="form-control" name="type_stag">
	<option value="">Choisissez le type</option>
	<option value="stage academique">stage academique</option>
	<option value="stage de perfectionnement">stage de perfect</option>
	</select>
</div>&emsp;

<div class="col-md-2">
	<label for="date_debut_stag">Date debut stage</label>
	<input type="date" name="date_debut_stag" class="form-control">
</div>
<div class="col-md-2">
	<label for="date_fin_stag">Date de fin stage</label>
	<input type="date" name="date_fin_stag" class="form-control">
</div>&emsp;


<div class="col-md-2">
	<label for="etab_provenance">Etab provenance</label>
	<input type="text" name="etab_provenance" class="form-control" placeholder="Entrer votre num tel" required>
</div>&emsp;&emsp;&emsp;&emsp;

<div class="align-self-end ml-auto"> 
                <button type="submit" class="btn btn-info"><i class="fa fa-check"></i> 
                  Enregistrer 
                </button> 
</div>
</form>
					    
 </div>

</div><!--/.card-body-->
					

 					</div><!--card-->
					</div><!--div class col md 12-->
				</div><!--div class row-->
			</div><!-- div class container fluid-->
		</section>

</div><!--div class contyent wrapper-->

<!-- Bootstrap 4 --><!--script permettant d'ajouter des button avec leur position-->
 <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"> 
    </script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"> 
    </script>


</body>
</html>

Voici le code pour lister les stagiaires:

<?php
session_start();

include('includes/header.php');
include('includes/topbar.php');
include('includes/sidebar.php');
include('config/cn.php');
$re=$cn->query('SELECT * FROM employe');



?>
<div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <div class="content-header">
      <div class="container-fluid">
        <div class="row mb-2">
          <div class="col-sm-6">
            <h1 class="m-0">Espace Stagiaire</h1>
          </div><!-- /.col -->
          <div class="col-sm-6">
            <ol class="breadcrumb float-sm-right">
              <li class="breadcrumb-item"><a href="#">Home</a></li>
              <li class="breadcrumb-item active">Stagiaire</li>
            </ol>
          </div><!-- /.col -->
        </div><!-- /.row -->
      </div><!-- /.container-fluid -->
    </div><!--container-header-->



<section class="content">
      <div class="container-fluid">
        <div class="row">
          <div class="col-12">

            <div class="card">
              <div class="card-header">
               
                  <!--a href="" class="btn bnt-success float-end">Ajout</a-->
                  <div class="align-self-end ml-auto"> 
                    <a href="ajout_stagiaire.php">
                <button type="button" class="btn btn-info"><i class="fa fa-user-plus"></i>
                 Ajouter
                </button> 
              </a>
                    </div>
                         
                
              </div>
              <!-- /.card-header -->

               

              <div class="card-body">
                <table id="example1" class="table table-bordered table-striped">
                  <thead>
                  <tr>
                    <th width="15%">Nom</th>
                    <th width="15%">Prenom</th>
                    <th width="15%">Type de stage</th>
                    <th width="10%">date debut stage</th>
                    <th width="10%">date fin stage</th>
                    <!--th>service</th-->
                    <th width="10%">Action</th>
                  </tr>
                  </thead>
                  <tbody>
                    <?php 
                    $re=$cn->query(' SELECT nom,prenom,type_stag,date_debut_stag,date_fin_stag FROM stagiaire');
                    while ($tabRe=$re->fetch()) {?>
                    
                   
                  <tr>
                    <td><?php echo $tabRe['nom']; ?></td>
                    <td><?php echo $tabRe['prenom']; ?></td>
                    <td><?php echo $tabRe['type_stag']; ?></td>
                    <td><?php echo $tabRe['date_debut_stag']; ?></td>
                    <td><?php echo $tabRe['date_fin_stag']; ?></td>
                    <!--td><?php echo $tabRe['nom_serv'];  ?>  </td-->
                    <td>
                      <button data-toggle='modal' data-target="#modifier" class="btn btn-info btn-sm"><i class="fa fa-edit"></i></button>
                      <!--a href=""> <button class="btn btn-sm btn-primary"><i class="fa fa-pen"></i></button></a-->
                      <a href="supp_emp.php"><button class="btn btn-sm btn-danger"><i class="fa fa-trash"></i></button></a>
                     
                    </td>
                  </tr>

                  
              <?php  }?>
            </tbody>
            </table>
           




            </div><!--./card-body-->

<!--....................................................modal modification.............-->



    
      </div>
    </div>
  </div>



<!--.................................................fin modal.......................--></div>
</div><!--content-wrapper-->
</section>



<?php
include('includes/footer.php')
?>    

Voici le fichier opération qui fait le traitement d'ajout:

<?php
//affichage du message d'erreur
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//fin d'affichage
session_start();

if(!empty($_SESSION['id']) || isset($_SESSION['id'])){
header('location:accueil.php?msg=1');

}

include('config/cn.php');
extract($_POST);

if(isset($_POST['c'])){
	try{
		$num_mat = $_POST['num_mat'] ?? '';
		$nom = $_POST['nom'] ?? '';	
		$prenom = $_POST['prenom'] ?? '';
		$photo = $_POST['photo'] ?? '';
		$profession = $_POST['profession'] ?? '';
		$fonction = $_POST['fonction'] ?? '';
		$corps = $_POST['corps'] ?? '';	
		$type_cont = $_POST['type_cont'] ?? '';
		$date_debut_cont = $_POST['date_debut_cont'] ?? '';
		$date_fin_cont = $_POST['date_fin_cont'] ?? '';
		$nom_per_urg = $_POST['nom_per_urg'] ?? '';	
		$prenom_per_urg = $_POST['prenom_per_urg'] ?? '';
		$tel_per_urg = $_POST['tel_per_urg'] ?? '';
		$niveau_etude = $_POST['niveau_etude'] ?? '';
		$date_debut_stag = $_POST['date_debut_stag'] ?? '';
		$date_fin_stag = $_POST['date_fin_stag'] ?? '';

	
#----------------------------fichier pour stocker les photos---------------------------
if (($_POST['c']==3) or ($_POST['c']==4) or ($_POST['c']==1)) {
	# code...
$photo = $_POST['photo'] ?? '';
$tmp_photo=$_FILES['photo']['tmp_name'];//pour recuperer ce qui a ete envoye dans temp 
		$photo=$_FILES['photo']['name'];
		$photo_type=$_FILES['photo']['type'];// is_uploaded_file
		if(is_uploaded_file($tmp_photo))
		{
			if(!strstr($photo_type,"jpg"))
			{
				echo "ceci n'est pas une photo jpg";
			}
			if(!move_uploaded_file($tmp_photo,"./image/$photo"))//image c'est le dossier ou sera place les photos des agents
			{
				echo "Destination invalide";
			}
		}
	}
#---------------------------------------------------------------------------------


/*$content_dir = 'photo/'; // dossier où sera déplacé le fichier
$photo = $_POST['photo'] ?? '';
$tmp_file = $_FILES['photo']['tmp_name'];
if( !is_uploaded_file($tmp_file) )
{
exit("Le fichier est introuvable");
}
// on vérifie maintenant l'extension
$type_file = $_FILES['photo']['type'];
if(!strstr($type_file, 'png') && !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
{
exit("Le fichier n'est pas une image");
}
// on copie le fichier dans le dossier de destination
$photo = $_FILES['photo']['name'];
if( !move_uploaded_file($tmp_file, $content_dir .$photo) )
{
exit("Impossible de copier le fichier dans $content_dir");
}
echo "Le fichier a bien été uploadé";
*/



#------------------------------------------------------------------------------------
#------------------------------------------------fin--------------------------------

		
if($_POST['c']==1){
$photo = $_POST['photo'] ?? '';
		$ins=$cn->prepare('INSERT INTO employe(num_mat,nom,prenom,datenaiss,lieunaiss,email,tel,cin,cnss,sitmat,charge,nationalite,profession,photo,corps,type_cont,date_debut_cont,date_fin_cont,nom_per_urg,prenom_per_urg,tel_per_urg) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
		$ins->execute([$num_mat,$nom,$prenom,$datenaiss,$lieunaiss,$email,$tel,$cin,$cnss,$sitmat,$charge,$nationalite,$profession,$photo,$corps,$type_cont,$date_debut_cont,$date_fin_cont,$nom_per_urg,$prenom_per_urg,$tel_per_urg]);
	header("location:enseignant.php?msg=1");
	}elseif ($_POST['c']==2) {
		$ins=$cn->prepare('UPDATE employe SET num_mat=?, nom=?, prenom=?, corps=?,profession=? where idemp=?');
		$ins->execute([$num_mat,$nom,$prenom,$corps,$profession,$idemp]);
		header("location:enseignant.php");
		# code...
	}elseif ($_POST['c']==5) {

		# code
		$ins=$cn->prepare('DELETE employe where idemp=?');
		$ins->execute([$idemp]);
		header("location:enseignant.php");
	}elseif ($_POST['c']==6) {
		$id_dep_serv= $_POST['id_dep_serv'] ?? '';
		$ins=$cn->prepare('INSERT INTO stagiaire(nom,prenom,sexe,datenaiss,lieunaiss,niveau_etude,etab_provenance,type_stag,date_debut_stag,date_fin_stag,id_dep_serv) VALUES (?,?,?,?,?,?,?,?,?,?,?)');
		$ins->execute([$nom,$prenom,$sexe,$datenaiss,$lieunaiss,$niveau_etude,$etab_provenance,$type_stag,$date_debut_stag,$date_fin_stag,$id_dep_serv]);
		header("lacation:stagiaire.php");
		# code...
	}
}catch(Exeception $e){
echo "Erreur".$e->getMessage();
echo "num_mat,nom,prenom,photo";
print_r([$num_mat,$nom,$prenom,$photo]);
}
//var_dump($_POST['c'] == 6);

}

?>
A voir également:

2 réponses

BoBot Messages postés 3224 Date d'inscription mardi 4 juillet 2023 Statut Modérateur Dernière intervention 30 juin 2024 206
20 mai 2024 à 11:24
Bonjour !
C'est moi, Bobot, votre IA préférée !
L'erreur que vous obtenez est due à une contrainte d'intégrité. Elle apparaît lorsque vous essayez d'ajouter un enregistrement dans votre table `stagiaire` avec un `id_dep_serv` qui n'existe pas dans la table `dep_serv`.

Je remarque que dans votre formulaire pour ajouter un stagiaire, il n'y a pas de champ pour spécifier l'`id_dep_serv`. Il est donc probable que lorsque vous essayez d'insérer un nouveau stagiaire dans la base de données, le `id_dep_serv` est nul ou renvoie une valeur qui n'existe pas dans la table `dep_serv`.

La meilleure solution est de rajouter un champ dans votre formulaire pour spécifier le `id_dep_serv` du stagiaire. Vous pouvez faire cela en ajoutant un champ select qui liste tous les `id_dep_serv` existants dans la table `dep_serv`.

N'oubliez pas d'ajouter le nouveau champ dans la requête d'insertion exécutée dans le fichier opération :

```php
$id_dep_serv = $_POST['id_dep_serv'] ?? '';
$ins=$cn->prepare('INSERT INTO stagiaire(nom,prenom,sexe,datenaiss,lieunaiss,niveau_etude,etab_provenance,type_stag,date_debut_stag,date_fin_stag,id_dep_serv) VALUES (?,?,?,?,?,?,?,?,?,?,?)');
$ins->execute([$nom,$prenom,$sexe,$datenaiss,$lieunaiss,$niveau_etude,$etab_provenance,$type_stag,$date_debut_stag,$date_fin_stag,$id_dep_serv]);
```

0

Merci pour votre aide. J'ai vu mon erreur. C'était au niveau de l'affichage de nom-serv.

<td><PHP echo $tabRe['nom_serv'];></td>

Voici la correction:

<td><PHP echo $tabRe['nomservice'];></td>

C'est l'alias as nomservice.

0