PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 12/06/2012 21:15:13

Kevfou
Membre

Utilisation de RETURNING

Bonjour,

J'essaie, en vain, de faire une double requête d'insertion avec pour la 2éme la récupération de la clé primaire créer dans la 1ere requête.

Je m'explique avec un exemple:

<?php

$dbconnect=pg_connect("host=localhost dbname=Stanhome user=postgres password=.....");

$num_cli=$_POST['num_client'];
$total=$_POST['total_ht'];

$insert_commandes="INSERT INTO commandes (num_com, total_com, num_pers) VALUES (DEFAULT,'".$total."','".$num_cli."') RETURNING num_com";

pg_query($dbconnect, $insert_commandes);

$insert_ok=true;

foreach($_POST['num_produit'] as $cle=>$numproduit){

$qteproduit    = $_POST['qte_produit'][$cle];
$insert_composer="INSERT INTO composer VALUES ('".$qteproduit."', num_com,'".$numproduit."')";

if(!$insert_composer) {$insert_ok=false;}

}
pg_query($dbconnect, $insert_composer);
if($insert_ok){
echo "Commande enregistrée";
}else{
echo "PB Commande non enregistrée";
}   
?>

Donc l'idée, dans la première requête:

$insert_commandes="INSERT INTO commandes (num_com, total_com, num_pers) VALUES (DEFAULT,'".$total."','".$num_cli."') RETURNING num_com";

Je dois insérer ceci dans ma bdd et récupérer (avec RETURNING ???) la clé primaire auto-incrémenté' (avec le DEFAULT) pour ensuite l'insérer dans la 2éme requête:

Citation:

$insert_composer="INSERT INTO composer VALUES ('".$qteproduit."',ICI,'".$numproduit."')";

Hors comment faire cela ?
Merci de votre aide smile

Hors ligne

#2 12/06/2012 22:03:28

gleu
Administrateur

Re : Utilisation de RETURNING

Voici un exemple de code qui fonctionne avec un RETURNING :

<?php

$dbconnect=pg_connect("dbname=b1");

$insert_commandes="INSERT INTO t1 (id) VALUES (DEFAULT), (DEFAULT), (DEFAULT) RETURNING id";
$rows = pg_query($dbconnect, $insert_commandes);

if (!$rows) {
      echo "An error occured.\n";
        exit;
}
while ($row = pg_fetch_array($rows)) {
    echo $row['id'];
}

pg_close($dbconnect);
?>

Guillaume.

Hors ligne

#3 12/06/2012 22:04:12

gleu
Administrateur

Re : Utilisation de RETURNING

Pour être plus explicite, il faut que vous récupériez le résultat du INSERT dans une variable et que vous l'utilisiez comme si vous aviez fait un bête SELECT. Tout simplement.


Guillaume.

Hors ligne

#4 12/06/2012 22:22:33

Kevfou
Membre

Re : Utilisation de RETURNING

Donc si je fais

<?php

$dbconnect=pg_connect("host=localhost dbname=Stanhome user=postgres password=ifesuh2m");


    $num_cli=$_POST['num_client'];
    $total=$_POST['total_ht'];
   
    $insert_commandes="INSERT INTO commandes (num_com, total_com, num_pers) VALUES (DEFAULT,'".$total."','".$num_cli."') RETURNING  num_com"; // ?????

     $result=pg_query($dbconnect, $insert_commandes);

    while ($row = pg_fetch_array($result)) {
    echo $row['num_com'];
        }


      
    $insert_ok=true;
   
foreach($_POST['num_produit'] as $cle=>$numproduit){
   
        $qteproduit    = $_POST['qte_produit'][$cle];
       
        $insert_composer="INSERT INTO composer VALUES ('".$qteproduit."', '".$row['num_com']."','".$numproduit."')";

        if(!$insert_composer) {$insert_ok=false;}



    //}
}
    pg_query($dbconnect, $insert_composer);
//message
     if($insert_ok){
        echo "Commande enregistrée";
    }else{
        echo "PB Commande non enregistrée";
    }   
?>

Cela fonctionne ? J'ai un peu de mal à comprendre l'idée là.

Hors ligne

#5 12/06/2012 23:36:49

rjuju
Administrateur

Re : Utilisation de RETURNING

Le echo $row['num_com']; mentionné par Guillaume était juste là pour vous montrer où la variable était récupérée. Dans votre code il n'est pas nécessaire de le laisser.


Vous devez juste faire un fetch et vous assurer qu'une ligne est bien récupérée, initialiser une variable avec $row['num_com'] et utiliser cette variable dans votre 2nd insert.


Dans votre exemple, cela ne devrait pas marcher car vous faîtes un while($row = pg_fetch_array()), et donc la variable $row doit être vide à la fin du while.

Dernière modification par rjuju (12/06/2012 23:39:09)

Hors ligne

#6 13/06/2012 00:12:19

Kevfou
Membre

Re : Utilisation de RETURNING

Corrigé merci smile

Hors ligne

Pied de page des forums