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

#1 28/03/2013 10:53:34

jollt
Membre

tableau php vs pgsql

Bonjour,
ce que je recherche est certainement très simple, mais je me mélange un peu les pinceaux entre php et postgre

J'ai le tableau suivant en php :

$t = array();
$t[0] = array('cli_id' =>  0, 'cli_nom' => 'client_0', 'cli_desc' => 'desc_client_0');
$t[1] = array('cli_id' =>  1, 'cli_nom' => 'client_1', 'cli_desc' => 'desc_client_1');
$t[2] = array('cli_id' =>  2, 'cli_nom' => 'client_2', 'cli_desc' => 'desc_client_2');

Cela me permet de récupérer les valeurs des champs :

Echo 'Nom 1 : '.$t2[1]['cli_nom'] .'<br>'; // renvoye client_1
Echo 'Desc 2: '.$t2[2]['cli_desc'] .'<br>'; // renvoye desc_client_2



Y a-t-il un moyen de convertir ce tableau php en tableau pgsql utilisable de la même manière et que l'on puisse passer en paramètre de type anyarray à une fonction?

Si non, quelle serait la syntaxe pgsql pour obtenir un tel tableau?

Merci d'avance.

Hors ligne

#2 28/03/2013 14:43:22

jollt
Membre

Re : tableau php vs pgsql

N'étant jamais mieux servi que par soi-même, j'ai trouvé une solution à mon problème :-)

Ce n'est peut-être pas la plus élégante, mais elle fonctionne.
Si quelqu'un voit plus élaguant, plus efficace ou si des fonctions existent pour faire ça, je suis preneur.
En attendant, cela pourra peut-être servir à quelqu'un.


Les tableaux associatifs n'existant pas en pgsql  (à ma connaissance tout du moins), je suis passé par data type hstore (attention, il s’agit d'une extension qu'il faut installer : CREATE EXTENSION IF NOT EXISTS hstore;)


hstore permet de stocker des couples clé/valeur et de les lire comme ceci : var_hstore->clé.


Une variable hstore s'écrit comme ça :
     ('clé_1=>valeur_1, clé_2=>valeur_2, clé_3=>valeur_3')::hstore


Il faut donc transformer le tableau php en un tableau pgsql de variables hstore


Pour ce faire, j'ai écrit un petit algorithme, partant du principe que mon tableau php était le suivant  :


$t2 = array();
$t2[0] = array('cli_id' =>  0, 'cli_nom' => 'client_0', 'cli_desc' => 'desc_client_0');
$t2[1] = array('cli_id' =>  1, 'cli_nom' => 'client_1', 'cli_desc' => 'desc_client_1');
$t2[2] = array('cli_id' =>  3, 'cli_nom' => 'client_2', 'cli_desc' => 'desc_client_2');


La transformation en "pgsql" donne ça :


$i = 0;
$hstore_row = "";
$hstore_array = "array[";
for ($i=0; $i<count ($t2) ; $i++) {
    if ($hstore_array != "array[") $hstore_array = $hstore_array . ", ";
    $hstore_row = "('";
    foreach ($t2[$i] as $key => $value) {
        if ($hstore_row != "('") $hstore_row = $hstore_row. ", ";
        $hstore_row = $hstore_row.$key."=>".$value;
    };
    $hstore_row = $hstore_row."')::hstore";
    $hstore_array = $hstore_array.$hstore_row;
}
$hstore_array = $hstore_array."]";


On obtient ici
$hstore_array = array[('cli_id=>0, cli_nom=>client_0, cli_desc=>desc_client_0')::hstore, ('cli_id=>1, cli_nom=>client_1, cli_desc=>desc_client_1')::hstore, ('cli_id=>3, cli_nom=>client_2, cli_desc=>desc_client_2')::hstore]


On peut alors appeler depuis php la fonction pgsql qui va bien :


$arrRetour = pgQuery($conn, "select proc_test_array_hstore('test', ".$hstore_array.")");


Dans la procédure pgsql  proc_test_array_hstore on accèdera facilement aux donnée :
var_in_hstore[2]->cli_nom renverra la valeur de la clé cli_nom de la deuxième variable hstore du tableau, à savoir ici client_1


Voilou...

Dernière modification par jollt (28/03/2013 14:46:09)

Hors ligne

Pied de page des forums