Insérer des données dans une table intermédiaire

Fermé
Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018 - 13 sept. 2018 à 20:40
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 20 sept. 2018 à 15:34
Salut, j'ai quelques préoccupations à vous soumettre... Je cherche à développer une application de gestion d'une association. Mes entités sont : Membres, Cotisation, 


Paiement. Dans ma base, mes règles de gestion sont les suivantes:

Règle1) 1 Membre peut effectuer 1,n Paiement pour 1,1 Cotisation donnée.

Règle2) 1 Cotisation peut être l'objet de 1,n paiement par 1,1 Membre donnée.

Il apparaît donc une table intermédiaire que j'appelle" Paiement".

Mes insertions se passent bien dans les tables "Membres" et "Cotisation", mais lorsque je veux faire l'insertion dans la table intermédiaire "Paiement", il se pose un problème de

contrainte d'intégrité du genre "Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or

update a child row: a foreign key constraint fails (`assoc`.`paiement`, CONSTRAINT `fk_identifiant_du_membre` FOREIGN KEY (`id_membres`) REFERENCES `membres`

(`id_membres`)) in C:\wamp\www\association\trait_paiement.php on line 53".
Je vous donne l'aperçu de ma bd:

     -- phpMyAdmin SQL Dump
-- version 4.1.14
-- http://www.phpmyadmin.net
--
-- Client :  127.0.0.1
-- Généré le :  Mar 11 Septembre 2018 à 18:55
-- Version du serveur :  5.6.17
-- Version de PHP :  5.5.12

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données :  `assoc`
--

-- --------------------------------------------------------

--
-- Structure de la table `cotisation`
--

CREATE TABLE IF NOT EXISTS `cotisation` (
  `id_cotisation` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `objet` varchar(100) NOT NULL,
  `montant` varchar(30) NOT NULL,
  `datedebut` date DEFAULT NULL,
  `datefin` date DEFAULT NULL,
  `date_enregistrement` datetime NOT NULL,
  PRIMARY KEY (`id_cotisation`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `cotisation`
--

INSERT INTO `cotisation` (`id_cotisation`, `objet`, `montant`, `datedebut`, `datefin`, `date_enregistrement`) VALUES
(1, 'mariage', '10000', '0000-00-00', '0000-00-00', '2018-09-05 00:00:00'),
(2, 'anniversaire', '5000FCFA', '0000-00-00', '0000-00-00', '2018-09-05 00:00:00');

-- --------------------------------------------------------

--
-- Structure de la table `membres`
--

CREATE TABLE IF NOT EXISTS `membres` (
  `id_membres` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nom` varchar(40) DEFAULT NULL,
  `prenom` varchar(40) NOT NULL,
  `datenais` varchar(20) DEFAULT NULL,
  `lieunais` varchar(30) DEFAULT NULL,
  `numcni` varchar(30) DEFAULT NULL,
  `fonction` varchar(30) DEFAULT NULL,
  `type_membre` varchar(30) DEFAULT NULL,
  `date_enregistrement_membre` datetime NOT NULL,
  PRIMARY KEY (`id_membres`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

--
-- Contenu de la table `membres`
--

INSERT INTO `membres` (`id_membres`, `nom`, `prenom`, `datenais`, `lieunais`, `numcni`, `fonction`, `type_membre`, `date_enregistrement_membre`) VALUES
(1, 'Madesk', 'De Londres', '06/07/2000', 'Californie', NULL, 'Enseignant', 'membre', '2018-09-05 00:00:00'),
(2, 'Madesk', 'De Londres', '06/07/2000', 'Californie', NULL, 'Enseignant', 'membre', '2018-09-05 00:00:00'),
(3, 'Cheick', 'Boubakar', '02/09/1985', 'Daloa', 'CNI025167252GSBDQ', 'Conducteur', 'membre', '2018-09-05 12:42:18'),
(4, 'Cheikinael', 'Ben', '07/02/1972', 'Séguéla', 'CNI025167HDNDJ', 'Couturier', 'membre', '2018-09-05 13:42:18'),
(5, 'Ira', 'Allassane', '13/06/1940', 'Azaguié', NULL, 'Informaticien', 'Informaticien', '2018-09-05 00:00:00');

-- --------------------------------------------------------

--
-- Structure de la table `paiement`
--

CREATE TABLE IF NOT EXISTS `paiement` (
  `id_membres` int(10) unsigned NOT NULL,
  `id_cotisation` int(10) unsigned NOT NULL,
  `montant` varchar(20) DEFAULT NULL,
  `type_paiement` varchar(20) NOT NULL,
  `paie` varchar(30) DEFAULT NULL,
  `reste` varchar(30) DEFAULT NULL,
  `date_paiement` datetime NOT NULL,
  PRIMARY KEY (`id_membres`,`id_cotisation`),
  KEY `fk_identifiant_de_la_cotisation` (`id_cotisation`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Contenu de la table `paiement`
--

INSERT INTO `paiement` (`id_membres`, `id_cotisation`, `montant`, `type_paiement`, `paie`, `reste`, `date_paiement`) VALUES
(3, 1, '10000 FCFA', 'Une partie', '5000 FCFA', '5000 FCFA', '2018-09-05 17:37:00');

--
-- Contraintes pour les tables exportées
--

--
-- Contraintes pour la table `paiement`
--
ALTER TABLE `paiement`
  ADD CONSTRAINT `fk_identifiant_de_la_cotisation` FOREIGN KEY (`id_cotisation`) REFERENCES `cotisation` (`id_cotisation`),
  ADD CONSTRAINT `fk_identifiant_du_membre` FOREIGN KEY (`id_membres`) REFERENCES `membres` (`id_membres`);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;



Ensuite voici mes pages:

0) Page de connexion à ma BD

<?php
    try
		{
			$bdd = new PDO('mysql:host=localhost;dbname=assoc', 'root', '');
		    $bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
		}
			catch(Exception $e)
				{
					$bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
					die('Erreur:'.$e->get_Message());
				}
?>


1) page d'enregistrement d'un membre: ajout_membre.php

<! DOCTYPE html>
<html>
    <head>
	    <title>enregistrer un membre</title>
		<meta="utf8"/>
	</head>
	
	    <body>
		    <div class="row">
			    <center>
					<div class="col-md-12 col-sm-12 col-xm-12">
						<legend>
							<form method="POST" action="trait_ajout_membres.php">
								<label>Nom:</label>
								<input type="text" name="nom"/> </br></br>
								
								<label>Prénom</label>
								<input type="text" name="prenom"/> </br></br>
								
								<label>Date de naissance:</label>
								<input type="text" name="datenais"/> </br></br>
								
								<label>Lieu de naissance</label>
								<input type="text" name="lieunais"/> </br></br>
								
								<label>Numéro CNI:</label>
								<input type="text" name="numcni"/> </br></br>
								
								<label>Fonction</label>
								<input type="text" name="fonction"/> </br></br>
								
								<label>Type membre</label>
								<input type="text" name="type_membre"/> </br></br>
								
								<input type="submit" name="enregistrer" value="Enregistrer"/>
							</form>
						</legend>
					</div>
				<center>
			</div>
		</body>
</html>


2) Page de traitement de la page page "ajout_membres.php"

<?php include('config_bd.php');?>
<?php
    if(isset($_POST['enregistrer']))
		{
			$nom=htmlentities(trim($_POST['nom']));
			$prenom=htmlentities(trim($_POST['prenom']));
			$datenais=htmlentities(trim($_POST['datenais']));
			$lieunais=htmlentities(trim($_POST['lieunais']));
			$numcni=htmlentities(trim($_POST['numcni']));
			$fonction=htmlentities(trim($_POST['fonction']));
			$type_membre=htmlentities(trim($_POST['type_membre']));
			//$date_enregistrement_membre=$_POST['date_enregistrement_membre'];
			
			echo " <h2> VERIFICATION AVANT ENREGISTREMENT </h2></br>";
			echo 'Nom:'.$nom.'</br> Prénom: '.$prenom.' </br> Date de naissance :
			'.$datenais.'</br> Lieu de naissance : '.$lieunais.'</br> Numéro CNI: '.$numcni.'</br> Fonction: '.$fonction.
			'</br> Type du membre: ' .$type_membre.'</br>
			
			<form method="POST" action="trait_ajout_membres.php" >
				<input type="hidden" name="nom2" value="'.$nom.'">
				<input type="hidden" name="prenom2" value="'.$prenom.'">
				<input type="hidden" name="datenais2" value="'.$datenais.'">
				<input type="hidden" name="lieunais2" value="'.$lieunais.'">
				<input type="hidden" name="numcni2" value="'.$numcni.'">
				<input type="hidden" name="fonction2" value="'.$fonction.'">
				<input type="hidden" name="type_membre2" value="'.$type_membre.'">							

	
				'.'date d\'enregistrement du membre : '. date("y-m-d").'<br>
			   <input type="submit" name="annuler" value="Annuler">    
			   <input type="submit" name="confirmer" value="Confirmer">
			</form>';
	    }
?>

    <?php
			if(isset($_POST['confirmer']))
			{
			    //récupération des variables issues de la confirmation
				$nom2=isset($_POST['nom2']) ? $_POST['nom2'] : '' ;
				$prenom2 = isset($_POST['prenom2']) ? $_POST['prenom2'] : '' ;
				$datenais2 = isset($_POST['datenais2']) ? $_POST['datenais2'] : '' ;
				$lieunais2 = isset($_POST['lieunais2']) ? $_POST['lieunais2'] : '' ;
				$numcni2= isset($_POST['numcni2']) ? $_POST['numcni2'] : '';
				$fonction2= isset($_POST['fonction2']) ? $_POST['fonction2'] : '';
				$type_membre2= isset($_POST['type_membre2']) ? $_POST['type_membre2'] : '';
				$date_enregistrement_membre2 = date('y-m-d');

			
				$req = $bdd->prepare('INSERT INTO membres(nom, prenom, datenais, lieunais, fonction, type_membre , date_enregistrement_membre) 
				VALUES(:nom2, :prenom2, :datenais2, :lieunais2, :fonction2, :type_membre2, :date_enregistrement_membre2)');
				$req->execute(array(
				':nom2'=>$_POST['nom2'], 
				':prenom2'=>$prenom2, 
				':datenais2'=>$datenais2, 
				':lieunais2'=>$lieunais2, 
				':fonction2'=>$fonction2,
				':type_membre2'=>$type_membre2,
				':date_enregistrement_membre2' =>  date('y-m-d' ))) or die (print_r($req->errorInfo()));

				   $req->closeCursor();
					echo ' <h4>Membre enregistré!</h4></br><a href="ajout_membres.php">Ajouter un autre membre!</a>';
			}							
    ?>



3) Page d'enregistrement d'une cotisation:" ajout_cotisation.php"

<! DOCTYPE html>
<html>
    <head>
	    <title> enregistrer une cotisation </title>
		<meta="utf8"/>
	</head>
	
	    <body>
		    <div class="row">
			    <center>
					<div class="col-md-12 col-sm-12 col-xm-12">
						<legend>
							<form method="POST" action="trait_ajout_cotisation.php">
								<label>Objet: </label>
								<input type="text" name="objet" maxlength="255"/> </br></br>
								
								<label>Montant: </label>
								<input type="text" name="montant" maxlength="255"/> </br></br>
								
								<label>Date de début: </label>
								<input type="text" name="datedebut"/> </br></br>
								
								<label>Date de fin: </label>
								<input type="text" name="datefin"/> </br></br>
								
								<input type="submit" name="enregistrer" value="Enregistrer"/>
							</form>
						</legend>
					</div>
				</center>
			</div>
		</body>
</html>


4) Page de traitement de la page d'enregistrement de la cotisation: "trait_cotisation.php"

<?php include('config_bd.php');?>
<?php
    if(isset($_POST['enregistrer']))
		{
			$objet=htmlentities(trim($_POST['objet']));
			$montant=htmlentities(trim($_POST['montant']));
			$datedebut=htmlentities(trim($_POST['datedebut']));
			$datefin=htmlentities(trim($_POST['datefin']));
			//$numcni=htmlentities(trim($_POST['numcni']));
			$date_enregistrement=date('y-m-d');
		
		    echo "VERIFICATION AVANT ENREGISTREMENT </br>";
		    echo 'L\'objet de la cotisation est:'.$objet.',</br> le montant à payer est: '.$montant.', </br> la date de début des paiements est le :
		    '.$datedebut.' </br> et la date prévue pour la fin des paiements est le : '.$datefin.'</br></br></br> Cotisation enregistrée le: '.$date_enregistrement.'</br></br>
			
			<form method="POST" action="trait_ajout_cotisation.php">
			    <input type="hidden" name="objet2" value='.$objet.' />
				<input type="hidden" name="montant2" value='.$montant.' />
				<input type="hidden" name="datedebut2" value='.$datedebut.'/>
				<input type="hidden" name="datefin2" value='.$datefin.' />
				'.'date d\'enregistrement de la cotisation : '. date("y-m-d").'<br>
				<input type="submit" name="annuler" value="Annuler" />
				<input type="submit" name="confirmer" value="Confirmer" />
			</form>';
		}
?>

<?php 
    if(isset($_POST['confirmer']))
	{   
	    $objet2=isset($_POST['objet2']) ? $_POST['objet2'] : '' ;
		$montant2=isset($_POST['montant2']) ? $_POST['montant2'] : '';
		$datedebut2=isset($_POST['datedebut2']) ? $_POST['datedebut2'] : '';
		$datefin2=isset($_POST['datefin2']) ? $_POST['datefin2'] : '';
		//$numcni2=htmlentities(trim($_POST['numcni2']));
		$date_enregistrement2= date('y-m-d');
		
		$req=$bdd->prepare('INSERT INTO cotisation(objet, montant, datedebut, datefin, date_enregistrement)
		                   VALUES(:objet2, :montant2, :datedebut2, :datefin2, :date_enregistrement2)');
		$req->execute(array(':objet2'=>$_POST['objet2'],
		                    ':montant2'=>$_POST['montant2'],
							':datedebut2'=>$_POST['datedebut2'],
							':datefin2'=>$_POST['datefin2'],
							//':numcni2'=>$_POST['numcni2'],
							':date_enregistrement2'=>date('y-m-d'))) or die (print_r($req->errorInfo()));
				$req->closeCursor();
				echo'<h4> Cotisation enregistrée avec succès! </h4> </br><a href="ajout_cotisation.php">Ajouter une autre cotisation!</a>';
	}
?>


5) Page permettant de faire les paiements: "faire_paiement.php"

<?php include ('config_bd.php');?>
<! DOCTYPE html>
<html>
    <head>
	    <title>faire un paiement</title>
		<meta="utf8"/>
	</head>
	
	    <body>
		    <div class="row">
			    <center>
					<div class="col-md-12 col-sm-12 col-xm-12">
					    <h2>FAIRE UN PAIEMENT</h2>
						<legend>
							<form method="POST" action="trait_paiement.php">
								<select name="id_membres">
								
										<?php 
										    $req = $bdd->query('SELECT * FROM membres');
											//$req = execute();
											while($donnees=$req->fetch())
											{
											?>
											<option name="id_membres"/>
											<?php
												echo 'Membre numero: '.$donnees

['id_membres'].'</br>';
											}
										?> 
									</option> 
								</select>    
								
								<select name="id_cotisation">
								    
									    <?php 
										    $req = $bdd->query('SELECT * FROM cotisation');
											//$req = execute();
											while($donnees=$req->fetch())
											{
											?>
											<option name="id_cotisation"> 
											    <?php	echo 'Cotisation numero: '.$donnees

['id_cotisation'].'</br>';
											}
										?> 
									</option> 
								</select>    
								
								<select name="montant">
									    <?php 
										    $req = $bdd->query('SELECT * FROM cotisation');
											//$req = execute();
											while($donnees=$req->fetch())
											{
											?>
											<option name="montant"> 
											    <?php	echo 'Montant: '.$donnees['montant'].'</br>';
											}
										?> 
									</option> 
								</select>    
								
								<select name="type_paiement">
									<option> Une partie</option>
									<option> Totalité </option>	
								</select>    
								<label>Paie:</label>
								<input type="text" name="paie" />    
								<label>Reste:</label>
								<input type="text" name="reste" />    
								<input type="submit" name="enregistrer" value="Enregistrer"/>
							</form>
						</legend>
					</div>
				</center>
			</div>
		</body>
</html>


6) Voici maintenet la page qui pose le problème, c'est la page qui doit traiter et enregsitrer le paiement: "trait_paiement.php"

<?php include('config_bd.php');?>
<?php
    if(isset($_POST['enregistrer']))
		{
			$id_membres=htmlentities(trim($_POST['id_membres']));
			$id_cotisation=htmlentities(trim($_POST['id_cotisation']));
			$montant=htmlentities(trim($_POST['montant']));
			$type_paiement=htmlentities(trim($_POST['type_paiement']));
			$paie=htmlentities(trim($_POST['paie']));
			$reste=htmlentities(trim($_POST['reste']));
			$date_paiement=date('y-m-d');
			
			echo " <h2> VERIFICATION AVANT ENREGISTREMENT </h2></br>";
			echo ''.$id_membres.'</br> '.$id_cotisation.' </br> :
			'.$montant.'</br> '.$type_paiement.'</br>'.$paie.'</br> '.$reste.'</br> '.$date_paiement.
			'</br>
			
			<form method="POST" action="trait_paiement.php" >
				<input type="hidden" name="id_membres2" value="'.$id_membres.'">
				<input type="hidden" name="id_cotisation2" value="'.$id_cotisation.'">
				<input type="hidden" name="montant2" value="'.$montant.'">
				<input type="hidden" name="type_paiement2" value="'.$type_paiement.'">
				<input type="hidden" name="paie2" value="'.$paie.'">
				<input type="hidden" name="reste2" value="'.$reste.'">							
				'.'date du paiement : '. date("y-m-d").'<br>
			   <input type="submit" name="annuler" value="Annuler">    
			   <input type="submit" name="confirmer" value="Confirmer">
			</form>';
	    }
?>

    <?php
			if(isset($_POST['confirmer']))
			{
			    //récupération des variables issues de la confirmation
				$id_membres2=isset($_POST['id_membres2']) ? $_POST['id_membres2'] : '' ;
				$id_cotisation2 = isset($_POST['id_cotisation2']) ? $_POST['id_cotisation2'] : '' ;
				$montant2 = isset($_POST['montant2']) ? $_POST['montant2'] : '' ;
				$type_paiement2 = isset($_POST['type_paiement2']) ? $_POST['type_paiement2'] : '' ;
				$paie2= isset($_POST['paie2']) ? $_POST['paie2'] : '';
				$reste2= isset($_POST['reste2']) ? $_POST['reste2'] : '';
				//$date_paiement2 = date('y-m-d');

				$req = $bdd->prepare('INSERT INTO paiement(id_membres, id_cotisation, montant, type_paiement, paie, reste , date_paiement) 
				VALUES(:id_membres2, :id_cotisation2, :montant2, :type_paiement2, :paie2, :reste2, :date_paiement2)');
				$req->execute(array(
				':id_membres2'=>$_POST['id_membres2'], 
				':id_cotisation2'=>$id_cotisation2, 
				':montant2'=>$montant2, 
				':type_paiement2'=>$type_paiement2, 
				':paie2'=>$paie2,
				':reste2'=>$reste2,
				':date_paiement2' =>  date('y-m-d' ))) or die (print_r($req->errorInfo()));

				   $req->closeCursor();
					echo ' <h4>Paiement enregistré!</h4></br><a href="trait_paiement.php">Faire un paiement!</a>';
			}							
    ?>


1) En effet, lorsque j'essaie de faire un paiement, il y'a un message d'erreur qui s'affiche me disant qu'il ya une violation de contrainte d'intégrité à la ligne 53 de la page trait_paiement.php,

chose que je ne comprends pas...
Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`assoc`.`paiement`,

CONSTRAINT `fk_identifiant_du_membre` FOREIGN KEY (`id_membres`) REFERENCES `membres` (`id_membres`)) in C:\wamp\www\association\trait_paiement.php on line 53.

2) Ensuite lorsque je fais mes insertions dans la table "cotisation", le champ "objet" de la table "cotisation" n'arrive pas à enregistrer la totalité des textes que j'insère, il pren une partie et

laisse une partie. Par exemple lorsque j'essaie de mettre le texte suivant "Mariage du Président prévu pour bientôt" dans le champs "objet", il n'enregistre que "Mariage" et laisse le reste du

texte, sauf si je vais dans phpmyadmin pour faire l'insertion.

3) De plus le champs "numcni" de la table 'Membres" m'affiche encore des contanus NULL lorsque je fais mes insertions à travers les champs de saisie de mon application, sauf si je procède

par phpmyadmin. Je ne sais également pas d'ou vient ses erreurs. Merci pour l'éclaircissement.
A voir également:

5 réponses

yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
13 sept. 2018 à 22:00
bonjour,
que contient la ligne 53 de la page trait_paiement.php?
si tu veux comprendre la raison de la violation de la contrainte d'intégrité, tu dois commencer par déterminer les valeurs que tu essaies d'insérer dans la table. quelles sont ces valeurs?
0
Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
17 sept. 2018 à 15:22
Bonjour,
les valeurs que j’essaie d'insérer sont les identifiants des tables "Membres" et "Cotisation", car leurs clés primaires sont des clés étrangères ici dans la table "Paiement" à cause de la règle:
un Membre effectue 1,n paiements pour une Cotisation donnée,
Une Cotisation peut être l'objet d'1,n Paiement d'un même Membre.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
17 sept. 2018 à 16:31
je t'invite à regarder la réalité: quelles sont les valeurs exactes que ton programme essaie d'insérer au moment d'avoir l'erreur? pourquoi ces valeurs rentrent-elles en conflit avec les contraintes?
0
Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
17 sept. 2018 à 17:23
C'est parce que je ne sais pas pourquoi ces valeurs rentrent en conflit avec les contraintes que je demande de l'aide ici yg_be. Merci de voir si tu peux m'aider à voir cette réalité.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
17 sept. 2018 à 17:56
exemple afin de voir la réalité, en remplacement de tes lignes 46 à 53:
$param= array(
				':id_membres2'=>$_POST['id_membres2'], 
				':id_cotisation2'=>$id_cotisation2, 
				':montant2'=>$montant2, 
				':type_paiement2'=>$type_paiement2, 
				':paie2'=>$paie2,
				':reste2'=>$reste2,
				':date_paiement2' =>  date('y-m-d' ));
$req->execute($param)  
       or die (print_r($req->errorInfo()) . print_r($param) );
0
Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
17 sept. 2018 à 18:49
Merci yg_be, mais après tes modifications demandées, le problème est le même.
Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`assoc`.`paiement`, CONSTRAINT `fk_Membres_Paiement` FOREIGN KEY (`id_membres`) REFERENCES `membres` (`id_membres`)) in C:\wamp\www\association\trait_paiement.php on line 53. Je remet le code en bas pour que tu visualise très bien, si possible teste chez toi pour voir si ça passe.

<?php include('config_bd.php');?>
<?php
    if(isset($_POST['enregistrer']))
		{
			$id_membres=htmlentities(trim($_POST['id_membres']));
			$id_cotisation=htmlentities(trim($_POST['id_cotisation']));
			$montant=htmlentities(trim($_POST['montant']));
			$type_paiement=htmlentities(trim($_POST['type_paiement']));
			$paie=htmlentities(trim($_POST['paie']));
			$reste=htmlentities(trim($_POST['reste']));
			$date_paiement=date('y-m-d');
			
			echo " <h2> VERIFICATION AVANT ENREGISTREMENT </h2></br>";
			echo ''.$id_membres.'</br> '.$id_cotisation.' </br>
			'.$montant.'</br>Donne: '.$type_paiement.'</br>Paie: '.$paie.'</br> Reste: '.$reste.'</br>
			</br>
			
			<form method="POST" action="trait_paiement.php" >
				<input type="hidden" name="id_membres2" value="'.$id_membres.'">
				<input type="hidden" name="id_cotisation2" value="'.$id_cotisation.'">
				<input type="hidden" name="montant2" value="'.$montant.'">
				<input type="hidden" name="type_paiement2" value="'.$type_paiement.'">
				<input type="hidden" name="paie2" value="'.$paie.'">
				<input type="hidden" name="reste2" value="'.$reste.'">							
				'.'date du paiement : '. date("y-m-d").'<br>
			   <input type="submit" name="annuler" value="Annuler">    
			   <input type="submit" name="confirmer" value="Confirmer">
			</form>';
	    }
?>

    <?php
			if(isset($_POST['confirmer']))
			{
			    //récupération des variables issues de la confirmation
				$id_membres2=isset($_POST['id_membres2']) ? $_POST['id_membres2'] : '' ;
				$id_cotisation2 = isset($_POST['id_cotisation2']) ? $_POST['id_cotisation2'] : '' ;
				$montant2 = isset($_POST['montant2']) ? $_POST['montant2'] : '' ;
				$type_paiement2 = isset($_POST['type_paiement2']) ? $_POST['type_paiement2'] : '' ;
				$paie2= isset($_POST['paie2']) ? $_POST['paie2'] : '';
				$reste2= isset($_POST['reste2']) ? $_POST['reste2'] : '';
				//$date_paiement2 = date('y-m-d');

				$req = $bdd->prepare('INSERT INTO paiement(id_membres, id_cotisation, montant, type_paiement, paie, reste , date_paiement) 
				VALUES(:id_membres2, :id_cotisation2, :montant2, :type_paiement2, :paie2, :reste2, :date_paiement2)');
				$param = array(
				':id_membres2'=>$_POST['id_membres2'], 
				':id_cotisation2'=>$id_cotisation2, 
				':montant2'=>$montant2, 
				':type_paiement2'=>$type_paiement2, 
				':paie2'=>$paie2,
				':reste2'=>$reste2,
				':date_paiement2' =>  date('y-m-d' ));
                 $req->execute($param) or die (print_r($req->errorInfo()) . print_r($param) );

				/*$req->execute(array(
				':id_membres2'=>$_POST['id_membres2'], 
				':id_cotisation2'=>$id_cotisation2, 
				':montant2'=>$montant2, 
				':type_paiement2'=>$type_paiement2, 
				':paie2'=>$paie2,
				':reste2'=>$reste2,
				':date_paiement2' =>  date('y-m-d' ))) or die (print_r($req->errorInfo()));

				   $req->closeCursor(); */
					echo ' <h4>Paiement enregistré!</h4></br><a href="trait_paiement.php">Faire un paiement!</a>';
			}							
    ?>
0
lugdanum Messages postés 116 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 4 novembre 2024 41
13 sept. 2018 à 22:40
Hello

Après un bref coup d’œil, peut être une piste :

Sur ta page "faire_paiement.php" , ton
<select name="id_membres">
va avoir une valeur :
echo 'Membre numero: '.$donnees  soit MEMBRE NUMERO: XXXXXXXX


Ensuite sur ta page "trait_paiement.php" , tu le récupère de cette manière :
$id_membres=htmlentities(trim($_POST['id_membres']));


Du coup il est égale maintenant à Membre numero: XXXXXXXX
Dans ta table je pense que seul le numéro XXXXXXXX est stocké mais avec le Membre numero: avant il ne le retrouve plus....

Sois tu vire le Membre numero: avant la recherche en base de l'iD soit tu vire le texte du select...

Tiens moi au courant sinon pour que je regarde plus en détail.



2) Ensuite lorsque je fais mes insertions dans la table "cotisation", le champ "objet" de la table "cotisation" n'arrive pas à enregistrer la totalité des textes que j'insère, il pren une partie et

-> Essaye de donner une taille à ton input directement dans ton code et/ou dans phpmyadmin augmente sa valeur et/ou son type, par exemple au dessus de VARCHAR:
« VARCHAR » un texte cours de 0 à 65.535 caractères
« TEXT » pour du texte en grande quantité
« MEDIUMTEXT » un texte de 0 à 16.777.215 caractères
...
et pour le coup ne mets pas de "CHAR" ou "TINYTEXT"

(regarde ici : https://openclassrooms.com/fr/courses/1225826-choisir-les-bons-types-de-colonne-sql)


Pour ton numcni, sur ta page "ajout_membres.php" en fait tu ne le traite absolument pas.... Regarde tu ne l'ajoute pas dans ta base....

@+
0
Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
16 sept. 2018 à 15:19
Merci lugdanum pour l'intervention. La dernière préoccupation a été résolue, merci. Pour tes 2 premières réponses:

1)Sur ta page "faire_paiement.php" , ton <select name="id_membres"> va avoir une valeur :
echo 'Membre numero: '.$donnees soit MEMBRE NUMERO: XXXXXXXX

2)Ensuite sur ta page "trait_paiement.php" , tu le récupère de cette manière :
$id_membres=htmlentities(trim($_POST['id_membres']));

J'ai dejà fait tout ça dans le code, tu peux bien jeter un vrai bon coup d’œil pour voir ce qui ne va pas vraiment.


De plus, pour les types de données que tu me conseilles, j'ai tout essayé et tout est pareil, sauf si je colle les différents mots qui composent le texte de mon champs "objet" de la table "cotisation" sans espace.
0
Utilisateur anonyme
19 sept. 2018 à 21:12
Bonjour

Tu peux très bien afficher "Membre numéro xxxx" sans que ceci perturbe la valeur de $_POST['id_menbres'], en utilisant l'attribut value de la balise OPTION
Sans attribut "value", le SELECT prend la valeur du texte complet de l'OPTION, sinon il prend la valeur donnée par value.

<option value = '<?php echo $donnees['id_membres']; ?>'/>
  <?php   echo 'Membre numero: '.$donnees['id_membres']; ?> 
</option> 

Au passage :
- le <br /> ne sert à rien sur une option.
- le name non plus, c'est celui du SELECT qui compte
- tu as mis la balise de fermeture </option> après l'accolade de fin du while, autrement dit tu as une seule </option> pour toutes tes <option>. déplace l'accolade de fin du while

Ensuite :
n'arrive pas à enregistrer la totalité des textes que j'insère
C'est parce que tu n'as pas mis de " " autour des value des champs "hidden" que tu récupères.

Regarde ce que tu as (mal) fait dans ta table cotisation :
<input type="hidden" name="montant2" value='.$montant.' />


et compare avec ce que tu as (bien) fait pour trai_ajout_membre :
	<input type="hidden" name="nom2" value="'.$nom.'">
0
Buk01 Messages postés 8 Date d'inscription jeudi 13 septembre 2018 Statut Membre Dernière intervention 20 septembre 2018
20 sept. 2018 à 14:17
Bonjour et merci bien à toi le père.
Pour la 1ère préoccupation concernant l'attribut "value" de <option>, j'avais eu la solution, mais tu viens de m'aider avec les " " autour des value des champs hidden. ça marche, merci.

Cependant peux-tu ma'aider à gérer les accents dans ma base de données? C'est à dire que lorsque j'enregistre un texte comportant des accents dans ma base de données, cela me donne une mauvaise lisibilité des données. Par exemple lorsque j'insère le texte "Mariage du père du Président, nommé Généviève" dans le champs "objet" de la table cotisation, cela me donne des erreurs d'encodages. Merci!
0
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
19 sept. 2018 à 21:50
Bonjour,

rien à voir vraiment avec le souci actuel... mais j'en profite pour faire quelques rappels / recommandations.

- Les htmlentities, htmlspecialchar ... sont des fonctions qui ne doivent servir qu'à l'affichage et en aucun cas pour stocker les données dans la bdd.

- Voici comment faire correctement une connexion en PDO et écrire correctement ses requêtes (avec des blocs try/catch à CHAQUE REQUETE ... et non pas des DIE comme je peux le voir dans ce code ! )
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

- Et sans oublier quelques règles élémentaire de l'écriture d'un code propre et facilement maintenable :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
20 sept. 2018 à 14:45
Pour commencer, as-tu bien pris en compte les conseils de Jordane ?

En ce qui concerne les accents, puisque tu sembles travailler en utf8 d'après la description de ta base de données, il suffit de n'utiliser que de l'utf8 partout. En particulier :
- d'utiliser un éditeur de texte qui travaille en utf8 sans BOM. As-tu une idée de l'encodage que de ton éditeur de texte ?
- mettre une balise
<meta charset ="utf8"/>
et non pas
<meta="utf8"/>
dans le <head> de ta page
- de préciser dans ta connexion à la base de données que tu travailles en utf-8 :
$bdd = new PDO('mysql:host=localhost;dbname=assoc;charset=UTF8', 'root', '');


Au fait, pour déclarer un document html, c'est
<!DOCTYPE html>
sans espace entre ! et DOCTYPE
0
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
20 sept. 2018 à 15:34
0