Problème de insert into

Eléphanteau du PHP | 25 Messages

03 juin 2019, 10:37

Bonjour,
Contexte : Récupérer des données depuis un questionnaire rempli par un ou des stagiaire(s) pour ainsi afficher la bilan général de satisfaction de ces derniers.
Problème : Je n'ai pas défini les variables dans VALUES mais je ne sais pas comment les définir de manière efficace
if (!empty($_POST['nomSta']))
 {
     foreach ( $_POST as $post => $val )  {
         $$post = $val;
     }
     $formation = addslashes($_POST['formation']);
     
     $recup = $db->query('SELECT * FROM formation_stagiaires WHERE id_Stagiaires = "'.$nomSta.'"');
     $recup->execute();
     $fol = $recup->fetch();
     $nom = $fol['nom']; 
     $prenom = $fol['prenom'];
     
     if ($_POST['autre_form'] == 0) 
     {
         $autre_form = 0;
         $formation = "";
     }

     $nom = mb_strtoupper($nom, 'UTF-8');
     $prenom = mb_strtolower($prenom, 'UTF-8');
     $prenom = ucwords($prenom);

          $sql ="INSERT INTO questionnaire (idFormation ,nom ,prenom ,souhait ,objectif ,prog ,apport ,qua_theo ,qua_pra ,equilibre ,animation ,ecoute ,ambiance ,rythme ,outils ,satisfaction ,objectif_attein ,necessite_pro ,necessite_perso ,sup_obj ,autre_form ,forma) VALUES (".$formation_id.", '".$nom."', '".$prenom."', ".$souhait.", ".$objectif.",".$prog.",".$apport.",".$qua_theo.",".$qua_pra.",".$equilibre.",".$animation.",".$ecoute.",".$ambiance.",".$rythme.",".$outils.",".$satisfaction.",".$objectif_attein.",".$necessite_pro.",".$necessite_perso.",".$sup_obj.",".$autre_form.",'".$formation."'')";
          
          $req = $db->query($sql);
     
   if (!empty($_POST['idFormation'])) 
   {
         $req->execute();
   }
Merci d'avance

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juin 2019, 11:08

Salut, si je dis pas de bêtise, PDO query exécute déjà la requête et retourne le PDOStatement où false s'il y a une erreur, tu ne devrais donc pas utiliser conjointement PDO query et PDOStatement execute.

Pour l'insert le plus propre à mon sens serait que tu utilises PDO prepare où tu mets des paramètres nommées (:nom) ou marqueurs (?) à la place des variables dans la requête.
Puis dans le PDOStatement execute tu passes tes paramètres sous la forme d'un tableau.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

03 juin 2019, 11:22

Ok j'ai abandonné le query pour un prepare. Le problème étant que j'ai besoin de ces variables dans beaucoup d'endroit de mon code... cela reviendrai à tout changer et je n'ai malheureusement pas le temps. Je viens de me rendre compte que le problème est finalement peut-être avant et n'a rien à voir avec le INSERT INTO. On change peut-être trop du sujet mais en fait
($_POST["nomSta"])
est récupéré grace à
<select name="nomSta" id="nomSta">
et je pense ne pas utiliser la bonne méthode pour le récupérer, le code n'a pas été fait par moi, j'essaie de le comprendre mais c'est un vrai bordel ^^
A savoir, ma requête fonctionne parfaitement dans mySQL directement.
Je pense trop m'écarter du sujet devrai-je en ouvrir un autre ?

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juin 2019, 11:29

Si la méthode est bonne. Le problème c'est que le contenu de $_POST est converti en variables via le foreach :
foreach ( $_POST as $post => $val )  {
  $$post = $val;
}

Les variables ont les noms des input. Et si le name de l'input pour l'id de formation est idFormation alors la variable va être $idFormation et non $formation_id.
De plus pour la boucle comme il n'y a pas de traitement particulier un extract($_POST) sera tout aussi efficace.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

03 juin 2019, 11:44

Nan pourtant la variable contient bel et bien le bon id_stagiaire, et d'ailleurs toutes mes variables dans VALUES contiennent leur bonne valeur.. lol
J'avoue être largué à ce stade ^^ Je ne comprends pas d'où peut venir le problème, tout les paramètres sont bons et remplis mais ne s'envoient pas à la bdd
J'ai changé mes variables par les paramètres que tu m'as demandé et rien ne change.

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juin 2019, 11:50

Ben c'est soit dans un bout de code qu'on voit pas dans ce que tu as collé soit que les noms des input correspondent bien aux noms des variables.
Faut pas chercher midi à quatorze heure. En fait c'est quoi qui te fait bloquer si tout est bon ?

PS : pour l'id stagiaire c'est logique le name du select c'est nomSta et la variable $nomSta.
PPS : quand tu fais $$post si $post est égal à nomSta $$post équivaut à $nomSta.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

03 juin 2019, 12:21

Ok merci du conseil je ne savais pas ^^
Et bien je suis tout bêtement coincé sur le fait que les variables sont remplis des valeurs du questionnaire mais n'arrivent pas dans la bdd ce qui fait que les résultats ne peuvent pas être lus.

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juin 2019, 14:04

Ok dans ce cas tu dois avoir un problème avec l'INSERT. Donc le conseil de base c'est affiche toi la requête et teste la dans phpmyadmin pour voir quelle est le problème.
Je ne sais pas quelles modifications tu as apporté à ton code, mais tu peux aussi tester le retour de l'appel de query ou de execute et si le retour est false faire un print_r($db->getErrorInfo());.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

03 juin 2019, 14:15

Hum ok j'ai déjà fait ce que tu me demande, la requête dans phpmyadmin fonctionne très bien, cela fait que je peux voir les réponses choisies par le stagiaire directement depuis le site.
          if($sql == true){
          	$req->execute();
          }
          else
          {
          	print_r($db->getErrorInfo());
          	exit();	
          }
Un truc du style ? Si c'est le cas, rien ne s'affiche.
Modifié en dernier par elvyn le 03 juin 2019, 14:25, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juin 2019, 14:23

$db est bien une instance de PDO ?
$sql = "INSERT INTO questionnaire (idFormation ,nom ,prenom ,souhait ,objectif ,prog ,apport ,qua_theo ,qua_pra ,equilibre ,animation ,ecoute ,ambiance ,rythme ,outils ,satisfaction ,objectif_attein ,necessite_pro ,necessite_perso ,sup_obj ,autre_form ,forma) VALUES (".$formation_id.", '".$nom."', '".$prenom."', ".$souhait.", ".$objectif.",".$prog.",".$apport.",".$qua_theo.",".$qua_pra.",".$equilibre.",".$animation.",".$ecoute.",".$ambiance.",".$rythme.",".$outils.",".$satisfaction.",".$objectif_attein.",".$necessite_pro.",".$necessite_perso.",".$sup_obj.",".$autre_form.",'".$formation."'')";
echo $sql; // tu peux copier la requête dans le navigateur et la tester dans phpmyadmin
if (!($req = $db->query($sql)))
  print_r($db->errorInfo());
Pardon c'est errorInfo() pas getErrorInfo()
Toute l'API est documentée ici https://www.php.net/manual/fr/book.pdo.php

PS : je viens de voir un problème à la fin de la requête, il y a à priori un ' en trop qui doit provoquer une erreur lors de l'exécution de la requête :
",'".$formation."'')"
",'".$formation."')"
Modifié en dernier par Saian le 03 juin 2019, 14:27, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

03 juin 2019, 14:27

Ce que tu veux dire par instance de PDO c'est que $db devrait s'appeler autrement ? Parce que j'utilise $db pour d'autre fonction et cela fonctionne. Yes je test ça tout de suite

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juin 2019, 14:29

PDO c'est une class, quand tu fais $db = new PDO(/* parameters... */);, $db est une instance de PDO. C'est le vocabulaire de la programmation orientée objet tout simplement. Tu peux nommer la variable comme tu veux, tant que ça respecte les règles de nommage d'une variable en php. Dans le cas contraire tu aurais de toute façon une erreur.

En tout cas la à priori je pense qu'il te manque pas mal d'apostrophe justement. Les chaines de caractères doivent être encapsulées entre apostrophe. C'est la base. :P
INSERT INTO matable (col1, col2) SET ('value col1', 'value col2')
INSERT INTO matable (col1, col2) SET ('value col1', 'value col2'') // erreur
INSERT INTO matable (col1, col2) SET ('value col1', value col2) // erreur
Pour les valeurs numériques tu peux te dispenser des apostrophes.
Modifié en dernier par Saian le 03 juin 2019, 14:39, modifié 4 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

03 juin 2019, 14:34

VOILA c'est cette foutue apostrophe en trop !! Je te remercie pour tout ton aide, j'ai un autre problème maintenant mais je pense pouvoir me débrouiller seul, encore merci !

Eléphanteau du PHP | 25 Messages

03 juin 2019, 14:40

Justement il n'y a que les chaines que j'ai mis entre apostrophes