Inserer les valeurs d'un array dans une requete

Messages postés
32
Date d'inscription
lundi 10 décembre 2018
Statut
Membre
Dernière intervention
30 août 2019
- - Dernière réponse : jordane45
Messages postés
26313
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
- 31 août 2019 à 13:11
Bonjour , je veux inserer les valuers d'un array dans une requete insert into mais elle ne fonctionne pas et je ne trouve pas les valeurs insérée dans la base de données.



<?php

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true ");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header("Access-Control-Allow-Headers: X-Custom-Header, Origin, Content-Type , Authorisation , X-Requested-With");
header("Content-Type: application/json; charset=UTF-8 ");

$json = file_get_contents('php://input');
$decoded = json_decode($json);

$tab = $decoded->tab;

function conn()
{
$dbhost = "localhost";
$user = "root";
$pass = "";
$db = "smart";
$conn = new PDO('mysql:host=localhost;dbname=smart', $user, $pass);
return $conn;
}

$db = conn();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$p = $db->prepare("INSERT INTO regrouper (refCommande, refProduit, prixP, qteP) VALUES(:refCmd,:refProduit,:prix,qte)");
foreach ($tab as $item) {
$p->execute($item);
}

echo json_encode(true);

?>




La table regrouper contient les champs : (refCommande, refProduit, prixP, qteP)

le array contient les valeurs :

 <code>

Array

([0]=> stdClass Object([idprod]=>8[prix]=>2[qte]=>1[refCmd]=>35)[1]=> stdClass Object([idprod]=>9[prix]=>2.4[qte]=>5[refCmd]=>35)) </code>



le console envoi les erreur suivantes :
<br />
<b>Warning</b>: PDOStatement::execute() expects parameter 1 to be array, object given in <b>C:\xampp\htdocs\SmartLibrary\api\insert.php</b> on line <b>29</b><br />
<br />
<b>Warning</b>: PDOStatement::execute() expects parameter 1 to be array, object given in <b>C:\xampp\htdocs\SmartLibrary\api\insert.php</b> on line <b>29</b><br />
<br />
<b>Warning</b>: PDOStatement::execute() expects parameter 1 to be array, object given in <b>C:\xampp\htdocs\SmartLibrary\api\insert.php</b> on line <b>29</b><br />
<br />
<b>Warning</b>: PDOStatement::execute() expects parameter 1 to be array, object given in <b>C:\xampp\htdocs\SmartLibrary\api\insert.php</b> on line <b>29</b><br />
true
Afficher la suite 

1 réponse

Messages postés
26313
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
1786
0
Merci
Bonjour,

Déjà... pour le PDO .. il faut correctement activer ET gérer les éventuelles erreurs.
Pour ça, applique ce qui est indiqué dans ce lien
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Ensuite...
L'instruction EXECUTE attend la liste de TOUS les paramètres que tu as mis dans le PREPARE de ta requête... (et avec le MEME nom ... )
Dans ton cas;.. il attend donc les paramètres suivants :
:refCmd,:refProduit,:prix,qte

Donc un ARRAY de la forme
array(':refCmd'=>35 ,':refProduit'=>1 ,':prix' =>2.4 ,  'qte'=>1 );


Tu nous dis que ton array contient :
([0]=> stdClass Object([idprod]=>8[prix]=>2[qte]=>1[refCmd]=>35)[1]=> stdClass Object([idprod]=>9[prix]=>2.4[qte]=>5[refCmd]=>35)) 

</code>
Donc.. oui.. tu as un ARRAY ... mais ton array est constitué d' OBJET
 stdClass Object

Il te faut donc Extraire les différentes valeurs de cet objet... pour construire l'ARRAY attendu dans le execute.

ce qui donnerait un truc du genre :

try{
  $p = $db->prepare("INSERT INTO regrouper (refCommande, refProduit, prixP, qteP) VALUES(:refCmd,:refProduit,:prix,:qte)");
   foreach ($tab as $item) {
      $datas = array(':refCmd'=>$item->refcmd
                   ,':refProduit'=>$item->idprod
                   ,':prix' =>$item->prix
                  , ':qte'=>$item->qte
                   );
      $p->execute($datas);
  }
}catch(Exception $e){
   echo " Erreur :" . $e->getMessage();
}



Commenter la réponse de jordane45