Pdo insert array dans une table

Résolu/Fermé
Sinistrus Messages postés 1008 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 2 février 2023 - 3 juin 2021 à 11:42
Sinistrus Messages postés 1008 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 2 février 2023 - 3 juin 2021 à 14:34
Bonjour à tous,

Je rencontre un soucis au niveau de ce code, je voudrais insérer dans ma table une boucle mais je n'y arrive pas.
Voici le message d'erreur ($stmt->execute($row);) :
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/.../_generer.php:68 Stack trace: #0 /home/.../_generer.php(68): PDOStatement->execute(Array) #1 {main} thrown in /home/.../_generer.php on line 68


$data = array();

while ($ligne <= $_POST["txt_nbr_a"]) {
    $code_coupon = CodeCoupon()."-".CodeCoupon()."-".CodeCoupon()."-".CodeCoupon();
    $code_coupon = !empty($code_coupon) ? $code_coupon : array();

    $txt_hash   = md5($code_coupon);
    $txt_hash   = !empty($txt_hash) ? $txt_hash : array();

    $txt_valeur = trim(strip_tags($_POST["txt_valeur_a"]));
    $txt_valeur = !empty($txt_valeur) ? "$txt_valeur" : 0;

    $txt_nature = trim(strip_tags($_POST["txt_nature_a"]));
    $txt_nature = !empty($txt_nature) ? "$txt_nature" : NULL;

    $txt_creation = date("Y-m-d");

    $txt_expire = trim(strip_tags($_POST["txt_expire_a"]));
    $txt_expire = !empty($txt_expire) ? "$txt_expire" : NULL;
    $txt_expire = strftime(DATE_SQL, strtotime("+$txt_expire days"));
    
    echo "<tr><td><pre class='p-0 m-0'>".$code_coupon."</pre></td><td class='text-right'>".$txt_valeur."</td><td>".$txt_nature."</td><td class='text-right'>".$txt_expire."</tr>";
    
    //add into array object while looping
    $data[] = array(
        "code_coupon"     => $code_coupon, 
        "valeur"          => $txt_valeur,
        "nature"          => $txt_nature,
        "date_creation"   => $txt_creation,
        "date_expiration" => $txt_expire,
        "hash"            => $txt_hash
    );
    $ligne ++ ;
}


echo '</tbody></table></div>';


if(!empty($data)) {


  $stmt = $pdo->prepare("INSERT INTO tab_shop_coupon (code_coupon,valeur,nature,date_creation,date_expiration,hash) VALUES (?,?,?,?,?,?)");


try {
    $pdo->beginTransaction();
    foreach ($data as $row)
    {
        $stmt->execute($row);
    }
    $pdo->commit();
}catch (Exception $e){
    $pdo->rollback();
    throw $e;
}
}


Pouvez-vous m'aider svp ?

Configuration: Windows / Chrome 91.0.4472.77

3 réponses

jordane45 Messages postés 36944 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 février 2023 4 489
3 juin 2021 à 12:26
Bonjour,

je suppose que ce que tu envoies en POST sont des array ?

Dans ce cas, dans ta boucle, il faut utiliser un truc du genre
 $txt_valeur = trim(strip_tags($_POST["txt_valeur_a"][$ligne])); 
 



Dans le doute, si tu n'arrives pas à voir, fais un
var_dump($_POST);

et regarde ce qu'il contient....
0
Sinistrus Messages postés 1008 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 2 février 2023 17
3 juin 2021 à 12:49
Bonjour Jordane,

Les valeurs envoyées par POST sont uniques, c'est dans le fichier _generer.php que j'ai fais un While du code_coupon et du hash selon la valeur de txt_nbr_a...

Voici ce que le var_dump($_POST) me renvois :
array(5) { ["txt_nbr_a"]=> string(1) "2" ["txt_valeur_a"]=> string(4) "3333" ["txt_nature_a"]=> string(4) "test" ["txt_expire_a"]=> string(1) "3" ["Generer_a"]=> string(0) "" }


index.php
<form name="form" action="_generer.php" method="POST" enctype="multipart/form-data">
    <input type="number" id="txt_nbr_a" name="txt_nbr_a" value="1" required>
    <input type="text" id="txt_valeur_a" name="txt_valeur_a" required value="">
    <input type="text" id="txt_nature_a" name="txt_nature_a" required value="">

    <select id="txt_expire_a" name="txt_expire_a" required>
        <option selected></option>
        <option value="1">1 jour</option>
        <option value="3">3 jours</option>
        <option value="7">7 jours</option>
        <option value="15">15 jours</option>
    </select>
    
    <button class="btn btn-primary" name="Generer_a" type="submit">Générer</button>
</form>


_generer.php
<?php
function CodeCoupon( $longueur = 4 ) {
    $caracteres1 = "012";
    $caracteres2 = "AbC";
    $caracteres3 = "301";
    $caracteres = $caracteres1.$caracteres2;
    $longueurMax = strlen( $caracteres );
    $chaineAleatoire = '';
    for ( $i = 0; $i < $longueur; $i++ ) {$chaineAleatoire .= $caracteres[ rand( 0, $longueurMax - 1 ) ];}
    return $chaineAleatoire;
}

if(isset($_POST['Generer_a'])){foreach($_POST as $var=>$val){if(!is_array($val)){$$var=strip_tags($val);}else{while(list($arvar,$arval)=each($val)){$$var[$arvar]=strip_tags($arval);}}}

$txt_nbr   = trim(strip_tags($_POST["txt_nbr_a"]));
$txt_nbr   = !empty($txt_nbr) ? "$txt_nbr" : NULL;

$ligne = 1;
$data = array();

while ($ligne <= $_POST["txt_nbr_a"]) {
    $code_coupon = CodeCoupon()."-".CodeCoupon()."-".CodeCoupon()."-".CodeCoupon();
    $code_coupon = !empty($code_coupon) ? $code_coupon : array();

    $txt_hash   = md5($code_coupon);
    $txt_hash   = !empty($txt_hash) ? $txt_hash : array();

    $txt_valeur = trim(strip_tags($_POST["txt_valeur_a"]));
    $txt_valeur = !empty($txt_valeur) ? "$txt_valeur" : 0;

    $txt_nature = trim(strip_tags($_POST["txt_nature_a"]));
    $txt_nature = !empty($txt_nature) ? "$txt_nature" : NULL;

    $txt_creation = date("Y-m-d");

    $txt_exp = trim(strip_tags($_POST["txt_expire_a"]));
    $txt_exp = !empty($txt_exp) ? "$txt_exp" : NULL;
    $txt_expire = strftime(DATE_SQL, strtotime("+$txt_exp days"));
    
    $data[] = array(
        "code_coupon"     => $code_coupon, 
        "valeur"          => $txt_valeur,
        "nature"          => $txt_nature,
        "date_creation"   => $txt_creation,
        "date_expiration" => $txt_expire,
        "hash"            => $txt_hash
    );
    $ligne ++ ;
}

if(!empty($data)) {

  $stmt = $pdo->prepare("INSERT INTO tab_shop_coupons (code_coupon,valeur,nature,date_creation,date_expiration,hash) VALUES (?,?,?,?,?,?)");

var_dump($_POST)."<br>";

try {
    $pdo->beginTransaction();
    foreach ($data as $row)
    {
        $stmt->execute($row);
    }
    $pdo->commit();
}catch (Exception $e){
    $pdo->rollback();
    throw $e;
}
}
                               
}
?>
0
jordane45 Messages postés 36944 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 février 2023 4 489
3 juin 2021 à 13:11
Ah ..

Tu as utilisé un tableau associatif pour des variables nommées
Alors que dans ta requête tu as mis des points d'interrogation...
Il faut retirer les clés dans ta variable data
0
Sinistrus Messages postés 1008 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 2 février 2023 17
3 juin 2021 à 14:34
Merci Jordane, tu m'as bien guidé.

if(!empty($data)) {

  $stmt = $pdo->prepare("INSERT INTO tab_shop_coupons (code_coupon,valeur,nature,date_creation,date_expiration,hash) VALUES (:code_coupon,:valeur,:nature,:date_creation,:date_expiration,:hash)");

   try {
      $pdo->beginTransaction();
      foreach ($data as $row)
      {
        $stmt->bindParam(':code_coupon', $row['code_coupon']);
        $stmt->bindParam(':valeur', $row['valeur']);
        $stmt->bindParam(':nature', $row['nature']);
        $stmt->bindParam(':date_creation', $row['date_creation']);
        $stmt->bindParam(':date_expiration', $row['date_expiration']);
        $stmt->bindParam(':hash', $row['hash']);
        $stmt->execute();
      }
      $pdo->commit();
   }catch (Exception $e){
      $pdo->rollback();
      throw $e;
   }
}
0