Impossible de faire enregistrement Mysql PDO sous Mac
Résolu
modemo2018
Messages postés
226
Date d'inscription
Statut
Membre
Dernière intervention
-
modemo2018 Messages postés 226 Date d'inscription Statut Membre Dernière intervention -
modemo2018 Messages postés 226 Date d'inscription Statut Membre Dernière intervention -
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
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:
À 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é?
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:
- Impossible de faire enregistrement Mysql PDO sous Mac
- Adresse mac - Guide
- Comment faire @ sur mac - Guide
- Nettoyer son mac - Guide
- Temperature mac - Guide
- Mac os 15 - Accueil - MacOS
4 réponses
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
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
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
voici le code d'enregistrement qui n'a pas de problème et qui fonctionne correctement:
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é:
EDIT : Ajout des balises de code
<?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
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
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.
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 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
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....
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
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
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());
}
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());
}
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é.
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é.
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);
}
}
?>
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);
}
}
?>
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);
$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);
<?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>
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] => )
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] => )
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()); }
et dans la base fait un select count(id), max(id) from matiere