Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 10/11/2015 18:08:32
- Papychampi
- Membre
[PARAMETRES] - Passer un tableau en paramètres d'une fonction
Bonjour,
Je développe une application en php/postgresql et je voudrais faire passer un tableau dans une de mes procédures stockée. Seulement Php me retourne cette erreur...
Notice: Array to string conversion in [...] commandes.php on line 47
Du coup je voudrais savoir quelle est la syntaxe correcte pour passer des tableaux en paramètres de fonctions postgresql...
if (isset($_POST['submit'])){
if ($_POST['submit']){
$qua = array();
for ($i=0;$i<$_POST['nb_choix'];$i++){
$qua[$i] = $_POST['quantity' . $i];
}
$bat = array();
for ($i=0;$i<$_POST['nb_choix'];$i++){
$bat[$i] = $_POST['batch' . $i];
}
$sn = array();
for ($i=0;$i<$_POST['nb_choix'];$i++){
$sn[$i] = $_POST['sn' . $i];
}
for ($i = 0; $i < $_POST['nb_choix'];$i++){
$res = pg_query_params($conn, "SELECT * FROM product_types WHERE ptypeid = $1", array($_POST['batch' . $i]));
$data = pg_fetch_row($res);
$corps = str_ireplace("V", "", $data[4]);
$v[$i] = str_ireplace("R", "", $corps);
$save = ltrim($data[3], "FABfab");
$f[$i] = str_ireplace(" ", "", $save);
$d[$i] = $_POST['d' . $i];
$n[$i] = $_POST['n' . $i];
}
$sql = "SELECT add_cmd_gen(" . $_POST['nb_choix'] . ", " . $_POST['orderform'] . ", " . $_POST['total'] . ", " . $_POST['orderform'] . ", " . $bat . ", " . $_POST['startdate'] . ", " . $_POST['startdate'] . ", " . $_POST['supplierdeliveries'] . ", " . $sn . ", " . $_POST['supplierdeliveries'] . ", " . $qua . ", " . $ptypeid . ")";
$res = pg_query($conn, $sql);
Hors ligne
#2 10/11/2015 19:36:53
- rjuju
- Administrateur
Re : [PARAMETRES] - Passer un tableau en paramètres d'une fonction
Il s'agit d'une erreur côté php. La syntaxe d'un tableau dans postgres est la suivante : '{"elem1","elem2"}' pour un tableau de texte et '{1,2}' pour des entiers par exemple.
Avez-vous vérifié que la fonction pl/pgsql fonctionnait correctement ? Un exemple de fonction pl/pgsql qui prend un tableau en entrée :
create or replace function nb_elem(a integer[]) returns integer as
$$
declare
nb integer;
begin
select array_upper(a,1) into nb;
return nb;
end;
$$ language plpgsql;
select nb_elem('{1,1,1}');
nb_elem
═════════
3
(1 row)
Julien.
https://rjuju.github.io/
Hors ligne
#3 12/11/2015 10:02:09
- Papychampi
- Membre
Re : [PARAMETRES] - Passer un tableau en paramètres d'une fonction
Bonjour,
Voici le code de ma fonction SQL:
CREATE OR REPLACE FUNCTION add_cmd_gen(
_cadences integer,
_orderform integer,
_total integer,
_batch integer,
_stardate date,
_date date,
_supplier text,
_sn text,
_quantity integer[],
_ptypeid integer[])
RETURNS boolean AS
$BODY$DECLARE
i integer;
j integer;
BEGIN
RAISE LOG 'Création de la commande générale...';
SELECT check_sn16(_orderform);
IF (_orderform ~ '^CC[0-9]{2}(0[1-9]|1[0-2])(00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})$')
THEN
IF (_supplier ~ '^[A-Z]+$')
THEN
IF (_startdate ~ '^(199[6-9]|[2-9][0-9]{3})-(0[1-9]|1[0-2])$')
THEN
IF (_quantity ~ '^[0-9]+$')
THEN
INSERT INTO supplierorders (orderform, startdate, quantity, supplier) VALUES (_orderform, _startdate, _total, _supplier) RETURNING sorderid;
RAISE LOG 'Terminé';
ELSE
RAISE LOG 'La quantité n est pas correct!';
END IF;
ELSE
RAISE LOG 'La date n est pas correct!';
END IF;
ELSE
RAISE LOG 'Le nom du fournisseur n est pas correct!';
END IF;
ELSE
RAISE LOG 'La date n est pas correct!';
END IF;
RAISE LOG 'Création des sous-commandes...';
j = 0;
WHILE _batch[j] IS NOT NULL LOOP
IF (_sorderid ~ '^[0-9]+$')
THEN
IF (_ptypeid[j] ~ '^[0-9]+$')
THEN
IF (_batch[j] ~ '^[0-9]+$')
THEN
IF (_quantity[j] ~ '^[0-9]+$')
THEN
INSERT INTO supplierdeliveries (sorderid, ptypeid, batch, quantity) VALUES (_sorderid, _ptypeid[j], _batch[j], _quantity[j]);
i = 0;
FOR i IN REVERSE 0 .. _quantity LOOP
INSERT INTO products (sdeliveryid, ptypeid, sn, status, date) VALUES (_sdeliveryid, _ptypeid, _sn, 'Commandées', GETDATE());
END LOOP;
ELSE
RAISE LOG 'La quantité n est pas correcte';
END IF;
ELSE
RAISE LOG 'Le numéro de lot n est pas correcte';
END IF;
ELSE
RAISE LOG 'Le type de produit n est pas correcte';
END IF;
ELSE
RAISE LOG 'La date n est pas correcte';
END IF;
j = j + 1;
END LOOP;
RAISE LOG 'Terminé';
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION add_cmd_gen(integer, integer, integer, integer, date, date, text, text, integer[], integer[])
OWNER TO postgres;
Dernière modification par Papychampi (12/11/2015 10:18:28)
Hors ligne