Pdo insert array dans une table

Résolu
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -  
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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 1010 Date d'inscription   Statut Membre Dernière intervention   17
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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 1010 Date d'inscription   Statut Membre Dernière intervention   17
 
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