IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PDO avec le format tableau de postgre ARRAY[] [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut PDO avec le format tableau de postgre ARRAY[]
    Bonjour,

    Je me bats avec PDOStatement pour exécuter un appel d'une fonction stockée qui attend deux tableaux en paramètre. Bref, rien de sorcier à première vue. Le hic, c'est que j'ai beau tout tordre dans tous les sens, je récupère toujours un message d'erreur.

    Voici, la fonction stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE OR REPLACE FUNCTION public.tempadd (
      num_att integer [],
      vals varchar []
    )
    RETURNS pg_catalog.void AS
    $body$
    BEGIN  
       FOR i IN 1..2 LOOP
          INSERT INTO t_temp ("numAttr", "valeur")
          VALUES (num_att[i]::INTEGER, vals[i]::VARCHAR);
       END LOOP;
    END;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY DEFINER
    COST 100;
    Cette fonction attend 2 paramètres tableaux : un tableau d'integer et un tableau de string.

    Voici une des syntaxes qui passe (montée manuellement) avec PDOStatement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT public.tempadd(ARRAY[50, 51], ARRAY[$$abc$$, $$def$$]);';
    Ensuite j'ai essayé de passer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT public.tempadd(ARRAY[:n1, :n2], ARRAY[:v1, :v2]);';
    On prépare la requête, on attache les valeurs aux paramètres du statement (bindValue ou bindParam, les 2 aucune erreur) et on fait un et là boum erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[42883]: Undefined function: 7 ERREUR: la fonction public.tempadd(text[], text[]) n'existe pas LINE 1: SELECT public.tempadd(ARRAY[$1, $2], ARRAY[$3, $4]);
    J'ai beau tourner dans tous les sens, il me semble impossible de faire autrement qu'en montant soit même la chaine sql.

    Si vous êtes arrivé à contourner ce problème en utilisant PDOStatement, je suis preneur de l'astuce.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Allez je vais me répondre comme ça je ne devrai pas être trop déçu de la reponse

    Ce qui suit est valable pour PHP 5.3.6 et inférieur

    Après un paquet d'essais, cela n'a jamais fonctionné.
    Donc en conclusion, quand vous utilisez les tableaux postgre pour le passage de vos arguments il faut monter manuellement toute la chaine SQL, protéger vous-même vos valeurs et l'exécuter directement sans la case prepare()
    Ne vous amusez pas à juste mettre à plat le tableau et conserver d'autre tags car il y a un très gros piège :
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT public.tempadd(:nom, ARRAY[50, 51], ARRAY[$$abc$$, $$def$$]);';
    Cette requête passe la préparation sans problème mais si maintenant vous avez dans votre tableau une valeur qui contient un texte avec deux-points :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT public.tempadd(:nom, ARRAY[50, 51], ARRAY[$$abc$$, $$ceque:vousvoulez$$]);';
    vous remarquerez que PDO::prepare() va reconnaitre un tag inattendu : A l'exécution vous vous rendrez-compte que tous vos petits n'y seront pas.

    Je vous mets ci-dessous, la fonction de protection des textes avec la notation (très pratique au passage) de postgre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function escapeStringForPostgre($p) {
       # on vérifie s'il y aurait besoin de changer de délimiteur sous postgre (sensible à la casse)
       $delim = '$$';
       while(FALSE !== mb_strpos($p, $delim)) {
          $delim = '$hkyz' . mt_rand(10000, 99999) . 'qyvx$';
       }
       return $delim . $p . $delim;   
    }
    Allez c'est résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/05/2009, 20h34
  2. Réponses: 2
    Dernier message: 03/11/2007, 11h24
  3. probleme avec une base de donnée postgres SQL
    Par Alexlesilex dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/06/2005, 22h09
  4. format date sous postgres sql
    Par ruppert62 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 27/05/2005, 12h04
  5. Réponses: 9
    Dernier message: 17/03/2005, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo