Impossible de faire enregistrement Mysql PDO sous Mac
Résolu/Fermé
modemo2018
Messages postés
226
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 226 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022 - 25 nov. 2019 à 16:01
modemo2018 Messages postés 226 Date d'inscription vendredi 15 novembre 2019 Statut Membre Dernière intervention 13 octobre 2022 - 25 nov. 2019 à 16:01
A voir également:
- Impossible de faire enregistrement Mysql PDO sous Mac
- Adresse mac - Guide
- Nettoyer mac - Guide
- Comment faire @ sur mac - Guide
- Temperature mac - Guide
- Commande terminal mac - Guide
4 réponses
jee pee
Messages postés
40463
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
20 novembre 2024
9 421
Modifié le 21 nov. 2019 à 12:22
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
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
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
Modifié le 22 nov. 2019 à 08:50
Modifié le 22 nov. 2019 à 08:50
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
jee pee
Messages postés
40463
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
20 novembre 2024
9 421
Modifié le 21 nov. 2019 à 16:17
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
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.
jordane45
Messages postés
38299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2024
4 704
22 nov. 2019 à 08:56
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 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
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
22 nov. 2019 à 11:34
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());
}
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());
}
jordane45
Messages postés
38299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2024
4 704
>
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
22 nov. 2019 à 11:45
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é.
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é.
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
22 nov. 2019 à 11:50
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);
}
}
?>
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);
}
}
?>
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
22 nov. 2019 à 11:52
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);
$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);
jee pee
Messages postés
40463
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
20 novembre 2024
9 421
>
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
Modifié le 22 nov. 2019 à 11:54
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 ?
Pour le code, il est où le MAX ?
jordane45
Messages postés
38299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2024
4 704
25 nov. 2019 à 12:12
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>
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
25 nov. 2019 à 13:00
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] => )
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] => )
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
25 nov. 2019 à 13:03
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;
jordane45
Messages postés
38299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2024
4 704
>
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
25 nov. 2019 à 13:04
25 nov. 2019 à 13:04
Petit oubli de ma part
Remplace les
Par
Remplace les
print_r ( $valeurs ); exit;
Par
print_r ( $datas ); exit;
jordane45
Messages postés
38299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2024
4 704
25 nov. 2019 à 13:05
25 nov. 2019 à 13:05
Et au passage... Montre nous ta connexion à la bdd
modemo2018
Messages postés
226
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
13 octobre 2022
25 nov. 2019 à 13:22
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()); }
21 nov. 2019 à 15:28
21 nov. 2019 à 15:48
et dans la base fait un select count(id), max(id) from matiere
21 nov. 2019 à 16:27
21 nov. 2019 à 16:46
21 nov. 2019 à 17:05