Pdo insert array dans une table [Résolu]

Signaler
Messages postés
1003
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2021
-
Messages postés
1003
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2021
-
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

Messages postés
32938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juin 2021
3 555
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....
Messages postés
1003
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2021
16
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;
}
}
                               
}
?>
Messages postés
32938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juin 2021
3 555
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
Messages postés
1003
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2021
16
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;
   }
}