Impossible de faire enregistrement Mysql PDO sous Mac
Résolumodemo2018 Messages postés 254 Statut Membre -
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é?
4 réponses
Une difficulté d'enregistrement en base MySQL via PHP survient lorsque le même code est copié d'une page à une autre sans adaptation, faisant échouer les insertions d’élèves ou de matières. Les échanges évoquent des causes potentielles et des correctifs, notamment l’activation des erreurs PDO, la vérification rigoureuse des variables GET/POST, et la normalisation des noms de colonnes comme id et idmat. D'autres interventions recommandent de récupérer proprement les valeurs (nomat, class, cycle, etc.), d'utiliser des requêtes préparées avec des paramètres nommés et de tester chaque page individuellement durant le débogage. Enfin, les conseils portent sur les bonnes pratiques (balises de code, affichage des erreurs, gestion d’erreurs et séparation claire des variables) pour éviter les pertes de données et faciliter le débogage.
-
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 unselect 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
-
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é
-
-
-
-
-
-
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-
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 unselect 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 = $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());
} -
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é. -
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);
}
}
?> -
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); -
-
-
<?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] => ) -
-
-
-
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()); }
-