Impossible de faire enregistrement Mysql PDO sous Mac

Résolu/Fermé
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022 - Modifié le 21 nov. 2019 à 11:58
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022 - 25 nov. 2019 à 16:01
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é?
A voir également:

4 réponses

jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 235
Modifié le 21 nov. 2019 à 12:22
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://forums.commentcamarche.net/forum/affich-37584941-php-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-poster-un-extrait-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
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
21 nov. 2019 à 15:28
merci pour vos rémarques, j'ai réglé le probleme d'auto-incrementation, l'affichages d'erreur dans mon code de connexion au serveur et revue le probleme de balise, mais le probleme subsite toujours, l'enregistrement sur l'autre page ne se fait toujours pas, pourtant je n'ai aucune erreur qui m'est signalé
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 235 > modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
21 nov. 2019 à 15:48
mets ton nouveau code ici pour que quelqu'un puisse le regarder (pas moi). Car si l'insert ne se fait pas, c'est il deevrait y avoir une erreur, qui s'affiche. Fait comme indiqué plus haut des print des id

et dans la base fait un select count(id), max(id) from matiere
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
21 nov. 2019 à 16:27
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
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 235 > modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
21 nov. 2019 à 16:46
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.
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
21 nov. 2019 à 17:05
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
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
Modifié le 22 nov. 2019 à 08:50
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
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 235
Modifié le 21 nov. 2019 à 16:17
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.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
22 nov. 2019 à 08:56
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 )
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
22 nov. 2019 à 11:34
Oui j'ai activé l'option affichage erreurs dans la page de connexion.
voici le code:

try
{
$options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=2019;charset=utf8','root', 'root', $options );

$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
//$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);


} catch(PDOException $e) {
die('Erreur : ' . $e->getMessage());

}
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
22 nov. 2019 à 11:45
Tu as un gros souci de comprenette visiblement....
Cela fait déjà plusieurs fois qu'on te dit :

pour poster ton code sur le forum... tu dois UTILISER LES BALISES DE CODE.

Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code


Pour le reste, on attendra que tu reviennes avec le reste de ton code corrigé en ayant suivi le contenu des liens que je t'ai donné.
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
22 nov. 2019 à 11:50
Merci pour . $result = $dn2->fetchColumn(); $id = $result+1;.

J'ai modifié et ça marche, mais le veritable souci qui s'entête et que je n'arive pas à trouvé solution c'est cette partie d'enrégistrement, pourtant le même code appliqué sur une autre page marche bien, mais je sais pas dans celle-ci le fait que je modifie juste les variables cela ne s'enregistre pas dans la BDD


<?php

if(isset($_GET['class']) && isset($_GET['cycle'])) {


$_POST['nomat'] = stripslashes($_POST['nomat']);
$_POST['coefficient'] = stripslashes($_GET['coefficient']);
$_GET['class'] = stripslashes($_GET['class']);
$_GET['cycle'] = stripslashes($_GET['cycle']);
$_GET['serie'] = stripslashes($_GET['serie']);

$dn2 = $bdd->prepare('SELECT idmat FROM matiere');
$result = $dn2->fetchColumn();
$id = $result+1;

//On enregistre les informations dans la base de donnee


try{

$req = $bdd->prepare('INSERT INTO matiere(nomat, coefficient, class, cycle, serie, idmat,id) VALUES(:nom, :coefficient, :class, :cycle, :serie, :idmat, :id)');

$valeurs = ['nomat' => $_POST['nomat'], 'coefficient' => $_POST['coefficient'], 'class' => $_GET['class'], 'cycle' => $_GET['cycle'], 'serie' => $_GET['serie'], 'idmat' => $id,'id' => $_SESSION['id']];

$req->execute($valeurs);

}catch(Exception $e){
// en cas d'erreur :
echo " Erreur ! ".$e->getMessage();

print_r($valors);

}





}

?>
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
22 nov. 2019 à 11:52
principalement avec la requête d'insertion qu'il ya un problème, quelqu'un peut-il me dire où se trouve l'erreur dans ce code?

$req = $bdd->prepare('INSERT INTO matiere(nomat, coefficient, class, cycle, serie, idmat,id) VALUES(:nom, :coefficient, :class, :cycle, :serie, :idmat, :id)');

$valeurs = ['nomat' => $_POST['nomat'], 'coefficient' => $_POST['coefficient'], 'class' => $_GET['class'], 'cycle' => $_GET['cycle'], 'serie' => $_GET['serie'], 'idmat' => $id,'id' => $_SESSION['id']];

$req->execute($valeurs);
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 235 > modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
Modifié le 22 nov. 2019 à 11:54
Et encore les balises codes sur le forum, compare les messages que nous avons modifiés et ton dernier !

Pour le code, il est où le MAX ?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
25 nov. 2019 à 12:12
<?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>

0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
25 nov. 2019 à 13:00
voilà ce que ça m'écrit lorsque j'enregistre :


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

Erreur lors de l'enregistrement...
Array ( [:nomat] => Mathematique [:coefficient] => 4 [:class] => 3ème [:cycle] => Collège [:serie] => [:idmat] => 1 [:iduser] => )
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
25 nov. 2019 à 13:03
l'erreur est à ce niveau:

try {
    $req = $bdd->prepare ( $sql );
    $req->execute ( $valeurs ); // voilà la 128ème ligne où il signale l'erreur
    $result = $req->fetchColumn ();
    $id = $result + 1;

0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
25 nov. 2019 à 13:04
Petit oubli de ma part
Remplace les
      print_r ( $valeurs );
      exit;

Par

      print_r ( $datas );
      exit;
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
25 nov. 2019 à 13:05
Et au passage... Montre nous ta connexion à la bdd
0
modemo2018 Messages postés 231 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022
25 nov. 2019 à 13:22
voici la connexxion à la BDD

try
{
$options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=2019;charset=utf8','root', 'root', $options );

//$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
//$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);


} catch(PDOException $e) {
die('Erreur : ' . $e->getMessage());

}


0