Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Membre du Club Avatar de thecanea
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    Par défaut PDO et fonction postgresql avec curseur

    Bonjour,

    Serait-il possible d'avoir l'équivalent du code suivant
    Code :
    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 498
    Points
    9 498

    Par défaut

    oui c'est possible

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

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 498
    Points
    9 498

    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 du Club Avatar de thecanea
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 498
    Points
    9 498

    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 du Club Avatar de thecanea
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    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 du Club Avatar de thecanea
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

    Enfin, résolu, sauf s'il y a mieux à faire

    Mon code actuel ressemble à ceci :
    Code :
    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 498
    Points
    9 498

    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 du Club Avatar de thecanea
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    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 du Club Avatar de thecanea
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : octobre 2008
    Messages : 131
    Points : 69
    Points
    69

    Par défaut

    J'ai trouvé !

    Tout simple, il suffit de suivre la doc postgresql : http://docs.postgresql.fr/8.3/sql-fetch.html

    Si je veux afficher les troisième et quatrième lignes, il me suffit d'ajouter la commande suivante :

    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •