Problème INSERT INTO PHP5

Résolu
Chers confrères,
Je solicite votre aide pour m'aider sur un problème dans ma requête.
Je passe bien dans la boucle, la récupe des données de passe bien, mais ensuite, la requête d'insert ne se passe pas.
Lorsque je la commente, mon echo fonctionne bien.

////////////////////////////////////////


//récup des champs
for($i=0;$i<count($_POST['libelle']);$i++)
{
$datea = $_POST['datea'][$i];
$libelle = $_POST['libelle'][$i];
$debit = $_POST['debit'][$i];
$credit = $_POST['credit'][$i];

$sql = "INSERT INTO compta (date,libelle,debit,credit)
values (".$pdo->quote($datea).",
".$pdo->quote($libelle).",
".$pdo->quote($debit).",
".$pdo->quote($credit)."
)";

echo '<br />'.$datea.' - '.$libelle.' - '.$debit.' - '.$credit.'<br />';
//exécution de l'insert
$nb = $pdo->exec($sql);
}
///////////////////////////////////////

Merci d'avance pour votre aide



--
Bien PHPment et MySQLment
Delaville

12 réponses

  1. Je devais rêver, j'avais oublié l'appel au fichier de connexion.
    Je n'y avais pas penser car dans mon teste précédent, j'exécuter mon script dans la page du formulaire
    Désolé de t'avoir faut perdre ton temps pour une erreur de ma part, mais ça m'a permis d'apprendre que le $pdo->quote est déconseillé et que le requête préparées c'est mieux.
    Merci pour ton aide précieuse
    1. Il y a bien un include "connexion.php" au début du script ?

      remplace le echo 'coucou1<br />'; par

      if (isset($pdo)) print_r ($pdo); else echo 'pdo non défini';
      1. Ça a l'air OK... Alors il y a sans doute un problème avec la requête ( table ou champ inexistant...)

        $stmt=$pdo->prepare($sql);
        if (!$stmt) {
        echo "\nPDO::errorInfo():\n";
        print_r($pdo->errorInfo());
        }
        1. Mon fichier connexion.php
          Pas la peine de cacher mes identifiants je suis sur MAMP


          <?php
          $hote = 'localhost';
          $bdd = 'asso';
          $util = 'root';
          $mdp = 'root';
          try{
          $pdo = new PDO('mysql:host ='.$hote.';dbname='.$bdd,$util,$mdp);
          $pdo->exec("SET CHARACTER SET utf8");
          //echo "ok";
          }
          catch(PDOException $e){
          echo 'Connexion échouée : '.$e->getMessage();
          exit();
          }
          ?>

          1. Peux-tu montrer le code de connexion à la base de données (en cachant tes identifiants bien sûr)
            1. Pour voir, par où tu passes, modifie le début de ta boucle :

              ...
              $sql = "INSERT INTO compta (date,libelle,debit,credit)
              values (:datea,:libelle,:debit,:credit)";
              echo 'coucou1<br />';
              $stmt=$pdo->prepare($sql);
              echo 'coucou2<br />';

              for($i=0;$i<count($_POST['libelle']);$i++)
              {
              echo 'coucou3<br />';

              $datea = $_POST['datea'][$i];
              ...
              1. Le père,
                Je n'ai aucun message d'erreur.
                Le echo ne s'affiche pas non plus.

                J'ai testé en mettant le requête et le prépare avant la boucle, c'est la même chose.

                1. As-tu des messages d'erreur ? Le echo s'affiche-t-il ?
                  1. Remarque complémentaire (mais sans lien direct avec l'erreur) : il faudrait mettre la requête et le 'prepare' AVANT la boucle for, ça éviterait à mysql de ré-interpréter la requête à chaque fois : c'est justement à ça que servent les requêtes préparées.
                2. Merci de ta réponse le père,

                  Cependant, même avec ta requête ça ne fonctionne pas.

                  Aurais tu une autre suggestion ?

                  Merci d'avance
                  1. Bonjour

                    Lorsque je la commente, mon echo fonctionne bien.
                    C'est d'autant plus étonnant que ta requête n'est exécutée qu'après le echo ...
                    Tu utilises $pdo->quote, ce qui est une très mauvaise idée, c'est déconseillé dans la doc même de PDO. Tu ferais mieux d'utiliser une requête préparée, ça t'éviterait d'oublier les quotes autour de tes values :

                    	$sql = "INSERT INTO compta (date,libelle,debit,credit)
                    values (:datea,:libelle,:debit,:credit)";
                    $stmt=$pdo->prepare($sql);

                    echo '<br />'.$datea.' - '.$libelle.' - '.$debit.' - '.$credit.'<br />';
                    //exécution de l'insert
                    $nb = $stmt->execute(array(':datea'=>$datea, ':libelle'=>$libelle, ':debit'=>$debit, ':credit'=>$credit));