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 et fonction postgresql avec curseur [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut PDO et fonction postgresql avec curseur
    Bonjour,

    Serait-il possible d'avoir l'équivalent du code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function test_refcursor()
    {
      pg_query("begin");
      $res1 = pg_query("SELECT fcurs()");
      if ($res1!==false) {
        list($cname) = pg_fetch_array($res1);
        $res2 = pg_query("FETCH ALL IN \"" . $cname . "\"");
        if ($res2!==false) {
          $all = pg_fetch_all($res2);
          print_r($all);
        }
      }
      pg_query("commit");
    }
    avec l'utilisation de PDO à la place des fonctions pg_*() ?

    En vous remerciant par avance pour vos idées, vos remarques,

    Cordialement,
    Thec

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    oui c'est possible

  3. #3
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Euh... D'accord, serait-il possible d'avoir un exemple fonctionnel ? Ou des pistes plus en détails.

    J'ai déjà fait des tests non concluants, notamment en utilisant les fonctionnalités de beginTransaction() et commit() ou rollback() de PDO, sans succès.

    Merci par avance pour les idées ou commentaires constructifs.

    Cordialement,
    Thec

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t’embêtes pas avec tout ca, utilise simplement query, fetch et fetchAll, comme dans ton code, après on pourra optimiser le tout, mais commence par le plus basique

  5. #5
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Ok, je vais simplifier, tester et vous tenir informés.

    Mais je pensais que pour utiliser les curseurs sous PG, il fallait forcément être dans une transaction, non ?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par thecanea Voir le message
    Ok, je vais simplifier, tester et vous tenir informés.

    Mais je pensais que pour utiliser les curseurs sous PG, il fallait forcément être dans une transaction, non ?
    pour le moment utilise juste les mêmes fonctions

  7. #7
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Effectivement, en simplifiant (c'est à dire sans les beginTransaction et commit de PDO), ça a marché.

    Il m'a suffit de remplacer les pg_query par des $pdo->query() et pg_fetch_array par $stmt->fetch();

    Merci pour la piste, c'est résolu pour moi !

  8. #8
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Enfin, résolu, sauf s'il y a mieux à faire

    Mon code actuel ressemble à ceci :
    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
    function test_refcursor()
    {
        // $pdo mon instance PDO
        $pdo->query('BEGIN;');
        $stmt = $pdo->query("SELECT fcurs()");
        if ($stmt->rowCount()) {
            list($cname) = $stmt->fetch();
            $stmt_q = $pdo->query("FETCH ALL IN \"" . $cname . "\"");
            if ($stmt_q->rowCount()) {
                $all = $stmt_q->fetchAll(PDO::FETCH_ASSOC);
                print_r($all);
            }
        }
        $pdo->query('ROLLBACK;');
    }
    J'ai lu dans de la documentation sur PDO qu'il était possible d'utiliser les curseurs pour faire de la pagination ? Est-ce un moyen toujours adapté ?

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    oui tu peux choisir dans quel ordre les résultats seront lu
    http://www.php.net/manual/fr/pdostatement.fetch.php

    mais ça dépend uniquement du pilote, j'ai pas encore tester sous PG si ça marche

  10. #10
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Oui, j'ai vu qu'on pouvait faire des recherches vers l'avant ou en arrière notamment.

    Moi ce que je souhaiterai pouvoir faire, c'est afficher les 10 résultats depuis le 50ème.

    Comment avec une requête basée sur une fonction postgresql puis-je appliquer un critère LIMIT ? Ou bien comment appliquer un système plus complexe de curseurs ?

    En vous remerciant par avance,

  11. #11
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    J'ai trouvé !

    Tout simple, il suffit de suivre la doc postgresql : https://postgresql.developpez.com/do...tion/francais/
    Si je veux afficher les troisième et quatrième lignes, il me suffit d'ajouter la commande suivante :

    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
    function test_refcursor()
    {
        // $pdo mon instance PDO
        $pdo->query('BEGIN;');
        $stmt = $pdo->query("SELECT fcurs()");
        if ($stmt->rowCount()) {
            list($cname) = $stmt->fetch();
            $pdo->query("MOVE ABSOLUTE 2 FROM \"" . $cname . "\"");
            $stmt_q = $pdo->query("FETCH 2 IN \"" . $cname . "\"");
            if ($stmt_q->rowCount()) {
                $all = $stmt_q->fetchAll(PDO::FETCH_ASSOC);
                print_r($all);
            }
        }
        $pdo->query('ROLLBACK;');
    }
    On obtiendra 2 lignes (fetch 2) depuis la position 2 (move absolute 2).

    Merci beaucoup pour les pistes et l'aide à la réflexion, c'est résolu pour moi

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

Discussions similaires

  1. Fonction Table avec Curseur dynamique
    Par Cyrille36 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/06/2013, 07h44
  2. erreur sur fonction avec curseur
    Par Tanebisse dans le forum PL/SQL
    Réponses: 3
    Dernier message: 06/05/2010, 16h20
  3. help : fonction table avec curseur dedans
    Par yolane dans le forum Développement
    Réponses: 1
    Dernier message: 18/08/2008, 13h09
  4. problème fonction php avec connexion postgreSQL
    Par roblescriso dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/06/2008, 18h02
  5. [PDO] Insertion Postgresql avec PDO
    Par juninho269 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/02/2008, 14h00

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