Impossible de faire enregistrement Mysql PDO sous Mac [Résolu]

Signaler
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019
-
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019
-
Bonjour chers amis
Je suis entrain de conçevoir une base de données Mysql qui fera la gestion des élèves d'une classe, je travaille sous MAC et c'est ma première fois. en fait je suis confronté à une difficulté que je n'arrive à resoudre et à comprendre car c'est pour ma première fois que je sois confronté à ce genre de difficulté.

Voici la partie de mon code qui fait l'enregistrement d'un élève
  <?php 
 
 if(isset($_POST['nom']) && isset($_POST['prenom'])) {
  
 $_POST['nom'] = stripslashes($_POST['nom']);
  $_POST['prenom'] = stripslashes($_POST['prenom']);
  $_GET['class'] = stripslashes($_GET['class']);
  $_GET['cycle'] = stripslashes($_GET['cycle']);
  $_GET['serie'] = stripslashes($_GET['serie']);
 
$dn2 = $bdd->prepare('SELECT ideleve FROM eleve');
$dn2->execute();
$idn4 = $dn2->rowCount();
$id = $dn4+1; 

$req = $bdd->prepare('INSERT INTO eleve(nom, prenom, cycle, class, serie, id, ideleve)  VALUES(:nom, :prenom, :cycle, :class, :serie, :id, :ideleve)');
     
$valeurs = ['nom' => $_POST['nom'], 'prenom' => $_POST['prenom'], 'cycle' => $_GET['cycle'], 'class' => $_GET['class'], 'serie' => $_GET['serie'], 'id' => $_SESSION['id'], 'ideleve' => $id];      
$req->execute($valeurs);     

}
 ?>  


Ce code fonctionne parfaitement sur la page où je l'ai mis, maintenant pour gagner le temps, je copie le même code et je le met sur une autre page qui consiste cette fois-ci à enregistrer les matières de classe, et je change juste les variables tout en veillant à ce que le code reste le même

voici le code de la partie enregistrement des matières:

<?php  
     
  if(isset($_POST['nomat'])) {
 
 $_POST['nomat'] = stripslashes($_POST['nomat']);
 $_GET['class'] = stripslashes($_GET['class']);
 $_GET['cycle'] = stripslashes($_GET['cycle']);
 $_GET['serie'] = stripslashes($_GET['serie']);

 $dn2 = $bdd->prepare('SELECT idmat FROM matiere');
$idn4 = $dn2->rowCount(); $dn2->execute();
$id = $dn4+1;   
 
 //On enregistre les informations dans la base de donnee
     
$requet = $bdd->prepare('INSERT INTO matiere(nomat, class, cycle, idmat, id)  VALUES(:nomat, :class, :cycle, :idmat, :id)');
     
$valors = ['nomat' => $_POST['nomat'], 'class' => $_GET['class'], 'cycle' => $_GET['cycle'],'idmat' => $id,
     'id' => $_SESSION['id']]; 
   
$requet->execute($valors); } 
   
  ?>     


À Ma grande surprise cette fois-ci, l'enregistrement dans la base de données Mysql ne marche pas, et je rencontre ce problème avec toutes les autres pages. Un code tapé sur une page ne fonctionne que sur cette page dès que je copie ce dernier sur une autre page pour gagner le temps, cela ne marche pas

Pouvez-vous m'aidé?

47 réponses

Messages postés
27551
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 décembre 2019
5742
Bonjour,

Première chose, il faut gérer les codes erreur en retour des accès à la base. Tu aurais alors l'indication de l'anomalie rencontrée. voir : https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Je ne pratique pas php et mysql, mais la logique d'affectation de l'id des enregistrements est mauvaise. Si les programmes qui gèrent les données n'ont pas toujours parfaitement fonctionné, ou si un enregistrement est supprimé, il pourrait y avoir un soucis de clé dupliquée. Car utiliser le rowcount+1 est très mauvais. J'ai 3 enregistrements 1,2,3 je supprime le 1, rowcount+1=3 insertion de 3 ==> erreur clé dupliquée. Le plus simple reste de créer un champ auto incrémenté : https://www.sqlfacile.com/apprendre_bases_de_donnees/champ_sql_auto_incremente Ou pour avoir l'id suivant de faire un
select max(id)+1


Sur le forum, il faudrait utiliser les balises code pour faciliter la lecture de ton source. Voir : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Par ailleurs, les lignes 11 et 12 ne sont pas les mêmes dans les 2 sources.

Et quand un source ne fonctionne pas, on debug, généralement en rajoutant des print pour afficher le contenu des variables, comme tes id.

Cdlt
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

dans le code il ya id de la matière (idmat) et l'id de l'utilisateur, voilà pourquoi lorsque la matière est enregistré dans la matière, la base de données enregistre l'id de la matière(idmat) et enregistre l'id de l'utilisateur pour reconnaitre l'utilisateur qui a enregistré la matière
jee pee
Messages postés
27551
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 décembre 2019
5742 > modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

Compris. Dans ce cas tu ne devrais pas utiliser un nom de variable id dans ton source mais idmat tout simplement. Et moi dans la table j'appellerais le champ id, quelque chose comme idusermaj car id dans une table c'est ambigu que ce ne soit pas la clé primaire.
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

Dans la table des User, l'Id est la clé PRIMAIRE et dans la table matière c'est idmat qui est la clé PRIMAIRE
jee pee
Messages postés
27551
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 décembre 2019
5742 > modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

j'ai bien compris, mais le champ ne devrait pas s'appeler id dans matière, pour une meilleure lisibilté/compréhension
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

je vois; Merci je rectifie
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

voici le code d'enregistrement qui n'a pas de problème et qui fonctionne correctement:
<?php 
 
 if(isset($_POST['nom']) && isset($_POST['prenom'])) {
  
 $_POST['nom'] = stripslashes($_POST['nom']);
  $_POST['prenom'] = stripslashes($_POST['prenom']);
  $_GET['class'] = stripslashes($_GET['class']);
  $_GET['cycle'] = stripslashes($_GET['cycle']);
  $_GET['serie'] = stripslashes($_GET['serie']);
     
 
$dn2 = $bdd->prepare('SELECT max(ideleve) FROM eleve');
$dn2->execute();
$id = $dn2+1;


$req = $bdd->prepare('INSERT INTO eleve(nom, prenom, cycle, class, serie, id, ideleve)  VALUES(:nom, :prenom, :cycle, :class, :serie, :id, :ideleve)');
     
$valeurs = ['nom' => $_POST['nom'], 'prenom' => $_POST['prenom'], 'cycle' => $_GET['cycle'], 'class' => $_GET['class'], 'serie' => $_GET['serie'], 'id' => $_SESSION['id'], 'ideleve' => $id];      
$req->execute($valeurs);     

}
 ?>  



et voici le code où l'enregistrement se fait pas, le code où qui ne fait pas d'enregistrement et dont aucune erreur syntaxique n'est signalé:
 <?php  
     
  if(isset($_POST['nomat'])) {
 
 $_POST['nomat'] = stripslashes($_POST['nomat']);
 $_GET['class'] = stripslashes($_GET['class']);
 $_GET['cycle'] = stripslashes($_GET['cycle']);
 $_GET['serie'] = stripslashes($_GET['serie']);
     

 
$dn2 = $bdd->prepare('SELECT max(idmat) FROM matiere');
$dn2->execute();
$id = $dn2+1;   
 
 //On enregistre les informations dans la base de donnee
     
$requet = $bdd->prepare('INSERT INTO matiere(nomat, class, cycle, idmat, id)  VALUES(:nomat, :class, :cycle, :idmat, :id)');
     
$valors = ['nomat' => $_POST['nomat'], 'class' => $_GET['class'], 'cycle' => $_GET['cycle'],'idmat' => $id, 'id' => $_SESSION['id']]; 

try{
   
$requet->execute($valors);
 
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($valors);
 
} 
 
     
 }    
  ?>


EDIT : Ajout des balises de code
jee pee
Messages postés
27551
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 décembre 2019
5742
Je te renouvelle : Sur le forum, il faudrait utiliser les balises code pour faciliter la lecture de ton source. Voir : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Moi je ferais un
select max(id) pas idmat
. D'ailleurs quelle est l'utilité de ces 2 champs ? ils contiennent la même chose ? tu ne devrais pas mélanger les intitulés id et idxxx des variables :
'idmat' => $id, 'id' => $_SESSION['id']]; 
cela rend incompréhensible la logique.
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019
1937
Bonjour,

Déjà,
il faut mettre CHAQUE requête dans des blocs TRY/CATCH et activer l'affichage des erreurs PHP sur tes pages.
Il faut également avoir activé l'affichage des erreurs PDO dans ta connexion à la bdd... l'as tu fait ??


Ensuite, ceci ne peut pas marcher
$dn2 = $bdd->prepare('SELECT max(idmat) FROM matiere');
$dn2->execute();
$id = $dn2+1;

$dn2 vaut le resultat de l'exécution ( true ou false ) mais pas la valeur retournée par la requête.
Pour récupérer la valeur, il faut faire un FETCH
$result = $dn2->fetchColumn();
$id = $result+1;


Il serait pas mal également, d'afficher le contenu de ta variable $_POST au début de ta page... histoire de t'assurer qu'elles sont bien envoyées....
print_r( $_POST ) ;


Je t'invite également à lire et à appliquer le contenu de ce lien (surtout en ce qui concerne la récupération des variables AVANT de les utiliser )
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code
jordane45
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019
1937 > modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

Et les get et les sessions ?
De plus.. dans voir à quoi ces variables ressemblent (leur structure) impossible de t'aider d'avantage
jordane45
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019
1937 > jordane45
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019

Il serait bien également de nous remontrer ton code COMPLET
Et vu que tu utilises des variables de SESSION... j'espère que tu as bien mis un session_start au début de ton script.
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

Bonjour ,oui j'ai mis session_start, juste avant <title> </title> voici :
 
<?php
include("connexion.php");
session_start(); ?> 
 


voici le code complet:
 

<div class="site-section bg-light">
      <div class="container">
        <div class="row">
       
          <div class="col-md-12 col-lg-8 mb-5">
			 <?php  echo '<p class="mb-0 font-weight-bold"><h3 class="mb-0">'; echo ''.$_GET["class"].'' ?>
			  
<?php echo':</h3>'; echo ''.$_GET["serie"].' </p><br>'; ?>

<?php
//début de ton fichier php :
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);	  
			   
if(isset($_POST['nomat'])) {
	
	
	$nomat = !empty($_POST['nomat']) ? $_POST['nomat'] : NULL;
$coef = !empty($_POST['coefficient']) ? $_POST['coefficient'] : NULL;
$class = !empty($_GET['class']) ? $_GET['class'] : NULL;
$cycle = !empty($_GET['cycle']) ? $_GET['cycle'] : NULL;
$serie = !empty($_GET['serie']) ? $_GET['serie'] : NULL;
$iduser = !empty($_SESSION['iduser']) ? $_SESSION['iduser'] : NULL;
	
$dn2 = $bdd->prepare('SELECT idmat FROM matiere');
$result = $dn2->fetchColumn();
$id = $result+1;			

	
//-----------------------------------------------------------------------//
//préparation de la requete et des variables nommées
//-----------------------------------------------------------------------//
$sql = 'INSERT INTO matiere(nomat, coefficient, `class`, `cycle`, `serie`, idmat,iduser)  
        VALUES(:nomat, :coefficient, :class, :cycle, :serie, :idmat, :iduser)';
$valeurs = array(':nomat' => $nomat, ':coefficient' => $coef, ':class' => $class, ':cycle' => $cycle, ':serie' => $serie, ':idmat' => $id,':iduser' => $iduser);
	
					
try{					
					
$req = $bdd->prepare($sql);
  $req->execute($valeurs);
}catch(Exception $e){
  // en cas d'erreur :
  echo " Erreur ! ".$e->getMessage();
  print_r($valeurs);
}	
	
}			  

			  ?> 
	  
          
<form action="#" method="post" class="p-5 bg-white">
	
 <div class="row form-group">
                <div class="col-md-12 mb-3 mb-md-0">
                  <label class="font-weight-bold" for="fullname">Nom Matière</label>
                  <input name="nomat" type="text"  class="form-control" placeholder="" >
					
				
				  </div>
 <div class="col-md-6 col-lg-3 mb-3 mb-lg-0">
					  <label class="font-weight-bold" for="fullname">Coefficient</label>
                        <select name="coefficient" id="" class="form-control">'; ?>

                     <option value="1">1</option>
					         <option value="2">2</option>
                            <option value="3">3</option>
                            <option value="4">4</option>
                            <option value="5">5</option>
							<option value="6">6</option>
							<option value="7">7</option>
							<option value="8">8</option>
							<option value="9">9</option>
							<option value="10">10</option>
                            
                          </select>
                      
				
              </div> <div class="col-md-6 col-lg-3 mb-3 mb-lg-0">
					 
					 </div>

					
			</div>
              <div class="row form-group">
                <div class="col-md-12">
                  <input type="submit" value="Enregistrez" class="btn btn-primary  py-2 px-4">
                </div>
              </div>
           </form>
       </div>


 
jordane45
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019
1937
action="#" ??

remplace par action=""
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

J'ai remplacé comme vous me l'avez indiqué, et j'ai testé mais ça ne marche toujours pas, pas d'enregistrement à la BDD
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019
1937
<?php
session_start();
//début de ton fichier php .... ça veut dire .. DEBUT !!!:
error_reporting ( E_ALL );
ini_set ( 'display_errors', TRUE );
ini_set ( 'display_startup_errors', TRUE );

require_once "connexion.php";

$nomat = !empty ( $_POST['nomat'] ) ? $_POST['nomat'] : NULL;
$coef = !empty ( $_POST['coefficient'] ) ? $_POST['coefficient'] : NULL;
$class = !empty ( $_GET['class'] ) ? $_GET['class'] : NULL;
$cycle = !empty ( $_GET['cycle'] ) ? $_GET['cycle'] : NULL;
$serie = !empty ( $_GET['serie'] ) ? $_GET['serie'] : NULL;
$iduser = !empty ( $_SESSION['iduser'] ) ? $_SESSION['iduser'] : NULL;

if ( $nomat ) {
  $sql = 'SELECT idmat FROM matiere';
  try {
    $req = $bdd->prepare ( $sql );
    $req->execute ( $valeurs );
    $result = $req->fetchColumn ();
    $id = $result + 1;
    $sql = 'INSERT INTO matiere(nomat, coefficient, `class`, `cycle`, `serie`, idmat,iduser)
                    VALUES(:nomat, :coefficient, :class, :cycle, :serie, :idmat, :iduser)';
    $datas = array(':nomat' => $nomat, ':coefficient' => $coef, ':class' => $class, ':cycle' => $cycle, ':serie' => $serie, ':idmat' => $id, ':iduser' => $iduser);
    try {
      $req = $bdd->prepare ( $sql );
      if ( $req->execute ( $datas ) ) {
        echo "<br> Insertion réalisée avec succès ! <br>";
      } else {
        echo "<br> Erreur lors de l'enregistrement... <br>";
        print_r ( $datas );
        exit;
      }
    } catch ( Exception $e ) {
      // en cas d'erreur :
      echo "<br> Erreur lors de l'enregistrement en BDD ! " . $e->getMessage ();
      print_r ( $valeurs );
      exit;
    }
  } catch ( Exception $e ) {
    // en cas d'erreur :
    echo " Erreur ! " . $e->getMessage ();
    print_r ( $valeurs );
    exit;
  }
}
?>
<div class="site-section bg-light">
  <div class="container">
    <div class="row">

      <div class="col-md-12 col-lg-8 mb-5">
        <?php 
        echo '<p class="mb-0 font-weight-bold">
              <h3 class="mb-0">' .$class .'</h3>';
        echo $serie . ' </p><br>';
        ?>
        <form action="" method="post" class="p-5 bg-white">
          <div class="row form-group">
            <div class="col-md-12 mb-3 mb-md-0">
              <label class="font-weight-bold" for="nomat">Nom Matière</label>
              <input name="nomat" type="text"  class="form-control" placeholder="" >
            </div>
            <div class="col-md-6 col-lg-3 mb-3 mb-lg-0">
              <label class="font-weight-bold" for="coefficient">Coefficient</label>
              <select name="coefficient" id="coefficient" class="form-control">
                <?php
                 for($i=1;$i<=10;$i++){
                  echo '<option value="'.$i.'">'.$i.'</option>';
                 }
                ?>
              </select>

            </div> 
            <div class="col-md-6 col-lg-3 mb-3 mb-lg-0">
            </div>
          </div>
          <div class="row form-group">
            <div class="col-md-12">
              <input type="submit" value="Enregistrez" class="btn btn-primary  py-2 px-4">
            </div>
          </div>
        </form>
      </div>

jordane45
Messages postés
27064
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 décembre 2019
1937 > modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

Pour le message

Notice: Undefined variable: valeurs in /Applications/MAMP/htdocs/kela/matiere3.php on line 139

ça fait trois fois que je te dis de modifier la ligne de code par celle que je t'ai donné !!!!§!!!!!!!!

Pour l'autre erreur... .. c'est marqué dessus !
Il te dit que tu as déjà une ligne dans ta bdd ayant la même valeur pour la clé primaire (ton champ idmat visiblement )
Sachant que ce champ est sûrement de type auto-increment.... il ne faut pas l'indiquer dans ta requête.

Sinon.. il faut modifier le code
$sql = 'SELECT idmat FROM matiere';

par
$sql = 'SELECT max(idmat) FROM matiere';


Mais bon.. le plus propre c'est de laisser mysql gérer lui-même l'incrémentation...
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

sachant que ma clé PRIMAIRE j'ai déjà coché Auto-increment
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

c'est fait, mais comment faire pour laisser Mysql faire lui-même l'incrementation?
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

ce message d'erreur s'affiche lorsque j'enregistre pour la 2ème fois sur la page, car mon but c'est de faire plusieurs enregistrement pour une classe


Erreur lors de l'enregistrement en BDD ! SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 'PRIMARY'Array ( [:nomat] => Anglais [:coefficient] => 3 [:class] => 1ere [:cycle] => LYCÉE GÉNÉRAL [:serie] => A [:idmat] => 2 [:iduser] => 1

Peut-tu m'aidé stp?
modemo2018
Messages postés
65
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 décembre 2019

c'est fait!! j'ai tout réglé et marche à merveille, merci BEAUCOUP, ça faisait presque 1 mois que j'etais bloqué dans cette partie