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

PostgreSQL Discussion :

Erreur : pg_num_rows(): supplied argument is not a valid PostgreSQL result resource


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 66
    Points : 56
    Points
    56
    Par défaut Erreur : pg_num_rows(): supplied argument is not a valid PostgreSQL result resource
    Bonsoir à tous,

    débutant en PHP, je travaille sous Eclipse 3.2 avec le plug-in PHPEclipse sous Windows XP SP2. J'essaye d'accèder à la table CD (contenant 3 enregistrements) d'une base de données Postgresql (nommée elle aussi CD) comme suit :

    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
    <?php
    	$bd = pg_connect("host=localhost port=5432 dbname=CD user=postgres password=titi") or die("Sélection de la base de données impossible !<BR>");
     
    	if (!pg_connection_busy($bd)){
    	    pg_send_query($bd, "select * from CD; select count(*) from CD;");
    	}	
     
    	$res1 = pg_get_result($bd);
    	echo "Premier appel de pg_get_result() : $res1<BR>";
    	$rows1 = pg_num_rows($res1);
    	echo "$res1 a $rows1 enregistrements<BR><BR>";
     
    	$res2 = pg_get_result($bd);
    	echo "Second appel de pg_get_result() : $res2<BR>";
    	$rows2 = pg_num_rows($res2);
    	echo "$res2 a $rows2 enregistrements<BR>";
    ?>
    A l'exécution, j'obtiens le résultat suivant !

    Premier appel de pg_get_result() : Resource id #3
    Resource id #3 a 0 enregistrements

    Second appel de pg_get_result() :

    Warning: pg_num_rows(): supplied argument is not a valid PostgreSQL result resource in e:\program files\easyphp1-8\www\formation_php\test_postgresql.php on line 31
    a enregistrements
    Ma table CD contient réellement 3 enregistrements, pourtant le premier pg_num_rows en retourne 0 !

    Et apparemment le second pg_get_result ne retourne rien du tout (d'où le message d'erreur final) mais je ne comprends pas pourquoi !

    Y aurait-il une âme charitable pour m'expliquer où je me trompe ? Merci d'avance !

    Mafate

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    pg_send_query() et pg_get_result() servent pour des requêtes asynchrones, c'est à dire que le script PHP continue à s'exécuter tandis que Postgres exécute la requête.

    Le problème ici est que la deuxième requête est envoyée alors que Postgres est encore à traiter la première. Il faut que tu fasses une boucle qui teste pg_connection_busy() avant de lancer une nouvelle requête. Visiblement, tu t'es inspiré de l'exemple fourni dans la doc PHP, dans lequel ces tests ne figurent pas.

    Je te déconseille toutefois d'utiliser les fonctions asynchrones, qui ne sont utiles que dans des cas assez particuliers. Utilise plutôt pg_query(), le code sera nettement plus simple.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bonjour GrandFather,

    merci beaucoup pour ta réponse ! Je vais essayer cela ce soir, j'ai hâte d'aller boucler !

    Bonne journée,

    Mafate

    PS. : je vois que tu es modérateur. Je te signale que dans un second temps j'ai posté cette question sur un autre forum du site (ici) parce que l'endroit me semblait plus approprié. Désolé pour le doublon, je ne suis pas encore très habitué à developpez.net !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Euh, je pense à quelque chose d'un coup : je comprends bien avec ton explication que ma seconde requête ne fonctionne pas mais comment expliquer que le pg_num_rows de ma première requête me retourne 0 ligne au lieu des 3 présentes dans ma table ??

    Merci,

    Mafate

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Mafate
    Euh, je pense à quelque chose d'un coup : je comprends bien avec ton explication que ma seconde requête ne fonctionne pas mais comment expliquer que le pg_num_rows de ma première requête me retourne 0 ligne au lieu des 3 présentes dans ma table ??
    Sans doute pace que cette fonction se sert de ce que renvoie pg_get_result(), et que cette fonction est appelée alors que Postgres n'a pas terminé de traiter la requête (le script PHP s'exécute plus rapidement que la requête SQL n'est traitée). Il faut donc vérifier avant pg_connection_busy(). Tout cela pour dire qu'utiliser les fonctions asynchrones sans y être obligé est se compliquer la vie...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Tout cela pour dire qu'utiliser les fonctions asynchrones sans y être obligé est se compliquer la vie...
    Tiens, on dirait tout moi là !

    Merci pour ton aide !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bonjour tout le monde !

    Bon, GrandFather j'ai essayé de faire comme tu m'as dit en testant pg_connection_busy() avant de lancer une nouvelle requête mais je n'ai jamais réussi qu'à obtenir le message d'erreur précédemment cité...

    Par contre, avec le 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
     
    	$bd = pg_connect("host=localhost port=5432 dbname=CD user=postgres password=titi") or die("Sélection de la base de données impossible !<BR>");
    	echo "\$bd = $bd<BR><BR>";
     
    	if (!pg_connection_busy($bd)){
     
    		pg_send_query($bd, "select * from CD;");
     
    		$res1 = pg_get_result($bd);
    		echo "Premier appel de pg_get_result() : $res1<BR>";
    		$rows1 = pg_num_rows($res1);
    		echo "$res1 a $rows1 enregistrements<BR><BR>";
     
    		pg_send_query($bd, "select count(*) from CD;");
     
    		$res2 = pg_get_result($bd);
    		echo "Second appel de pg_get_result() : $res2<BR>";
    		$rows2 = pg_num_rows($res2);
    		echo "$res2 a $rows2 enregistrements<BR>";
     
    	}			
     
    ?>
    ...je n'obtiens plus de message d'erreur mais le résultat suivant :

    $bd = Resource id #2

    Premier appel de pg_get_result() : Resource id #3
    Resource id #3 a 0 enregistrements

    Second appel de pg_get_result() : Resource id #4
    Resource id #4 a 0 enregistrements
    Donc, même si les erreurs ont apparemment disparu, je n'arrive toujours pas à faire afficher 3 enregistrements (que ma table CD contient) au lieu de 0 enregistrements. Donc je me demande si la connexion avec ma base PostgreSQL est réellement correcte d'autant plus qu'en faisant un simple pg_query($bd, "select * from CD;") PHP me retourne le message :

    Warning: pg_query(): Query failed: ERROR: relation "cd" does not exist in e:\program files\easyphp1-8\www\formation_php\test_postgresql_002.php on line 20
    Qu'en pensez-vous ? Ai-je un moyen de savoir si j'ai bien configuré PostgreSQL ? Merci d'avance pour votre aide.

    Mafate

  8. #8
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    PostgreSQL est sensible à la casse !
    Donc si ta table est en majuscules alors tu dois mettre des guillemets autour.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $res1 = pg_query($bd, 'select * from "CD";');
    $nb = pg_num_rows($res1);
    echo 'Il y a ', $nb, ' lignes.';

    Comme te l'a dis GrandFather, utilise des fonctions synchrones car sinon tu sera toujours obligé d'attendre le résultat en testant dans une boucle.

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Pourquoi tu t'obstines à utiliser des fonctions asynchrones !?

    Enfin... Pour que ça marche correctement, place chaque pg_send_query() dans une boucle while qui teste pg_connection_busy().
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  10. #10
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    J'ajouterais qu'il est même dommage de s'ennuyer avec cette librairie de fonctions pg_***. L'extension PDO est bien plus rapide et plus portable d'un SGBD à un autre.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bonsoir,

    merci pour vos réponses. Je sais que mon attitude peut faire "tête de mule" , mais croyez-moi, il n'en est rien. Je vais suivre vos conseils et utiliserai les fonctions synchrones pour mes développements futurs. Je voulais juste essayer de résoudre le problème auquel j'avais été confronté par pure curiosité, pas pour m'en servir après (enfin, sauf si le besoin s'en fait sentir bien-sûr ! )

    Je vais donc essayer à mon retour de congés tes recommandations GrandFather, j'espère que je ne vais pas trop m'emmêler les pinceaux !

    Alexandre, peux-tu m'en dire un peu plus sur les librairies de fonctions pg_*** et sur l'extension PDO ? Où puis-je trouver des infos intéressantes sur cette extension PDO, les fonctions qu'elle propose et leur utilisation avec PostgreSQL ?

    Merci d'avance,

    Mafate

    PS. : si vous me répondez, je ne pourrai pas vous répondre à mon tour avant 15 jours, car je pars en congés. Je ne manquerai pas bien-sûr de le faire à mon retour.

  12. #12
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Depuis la version 5, l'extension PDO est devenu une bibliothèque interne. Donc on s'en sert exactement comme d'une autre fonction.

    Tout est là : http://fr3.php.net/manual/fr/ref.pdo.php
    A l'occasion je rédigerais un tutoriel, mais je suis débordé en ce moment. Sinon, dans mon livre j'y consacre un chapitre complet.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  13. #13
    jnore
    Invité(e)
    Par défaut
    Citation Envoyé par Alexandre T
    Depuis la version 5, l'extension PDO est devenu une bibliothèque interne. Donc on s'en sert exactement comme d'une autre fonction.

    Tout est là : http://fr3.php.net/manual/fr/ref.pdo.php
    A l'occasion je rédigerais un tutoriel, mais je suis débordé en ce moment. Sinon, dans mon livre j'y consacre un chapitre complet.

    Je trouve la discussion intéressante. Je suis toujours, dans le cadre du devéloppement de mon appli en intranet, de performance et de simplicité.
    Le monde du développement est vaste et on en apprend tous les jours!
    C'est dur d'être au top.

    Concernant ce module PDO, dis moi dans ton livre qui s'adresse aux utilisateurs PHP/MySQL, y a t-il suffisamment d'info pour s'en sortir avec PostgreSQL?
    Je suis pour le support papier quand il s'agit de lire, plus que l'écran!!!!

  14. #14
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Citation Envoyé par jnore
    Concernant ce module PDO, dis moi dans ton livre qui s'adresse aux utilisateurs PHP/MySQL, y a t-il suffisamment d'info pour s'en sortir avec PostgreSQL?
    Je suis pour le support papier quand il s'agit de lire, plus que l'écran!!!!
    Oui et non. Il y en a assez pour installer PDO et PDO MySQL. Et donc par analogie, il y en a assez pour installer PDO et PDO PostGRESQL. (Que ce soit un serveur LAMP ou WAMP, il s'agit juste d'une série de point-virgules à enlever dans le fichier de configuration php.ini) Ensuite est présenté une petite classe pour simplifier la connexion et l'interrogation. Mais si l'objet de votre recherche c'est seulement PDO, même si ce livre n'est pas cher, ce n'est pas le meilleur investissement possible. Si seulement PDO vous intéresse, il est bien plus intéressant de s'imprimer la documentation du chapitre PDO. Mon livre a plutôt pour objet de présenter des solutions complètes pour développer complètement des applications bien précises (arbre généalogique, albums photos, jeux de sudoku, etc...) Nous (3 auteurs avec des parcours totalement différent) présentons 3 méthodes d'approches différentes. Et chacun des chapitres en profitent pour présenter une technologie. Le chapitre sur l'arbre généalogique présente les vues, le chapitre sur l'envoi de mail présente les interrogations de serveurs DNS, le chapitre sur le jeu de sudoku présente la manipulation de tableaux, etc... . Et dans cet esprit, il y a un chapitre sur PDO.

    C'est aussi simple à utiliser que les fonctions mysql_* et pg_* !

    Pour synthétiser : Les avantages de PDO sont les suivants :
    * Portabilité du code pour une application compatible avec plusieurs SGBDR (Pas besoin d'utiliser un abstracteur de base)
    * Rapidité de la connexion et des échanges. Tout le code a été réécrit en C et est étonnament plus rapide qu'une connexion native
    * Comparé à des abstracteurs comme PEAR:B, les temps d'interrogation de base passent de 450ms à 45ms !

    Je devais écrire un article comparatif avec des mesures mais mon planning ne me le permet pas en ce moment.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  15. #15
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Alexandre T
    * Comparé à des abstracteurs comme PEAR::DB, les temps d'interrogation de base passent de 450ms à 45ms !
    Tout à fait, et de plus le code est largement plus lisible, et le fonctionnement sans surprises ; tous ceux qui se sont escrimés avec la gestion des transactions sous PEAR::DB ne pourront que m'approuver... ;)
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/05/2010, 09h41
  2. [MySQL] Erreur "supplied argument is not a valid MySQL result resource"
    Par lilemy dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 29/06/2007, 14h47
  3. [MySQL] Erreur mysql_num_rows: supplied argument is not a valid MySQL result resource
    Par dfournier dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/12/2006, 16h40
  4. Réponses: 10
    Dernier message: 05/05/2006, 16h35
  5. supplied argument is not a valid MySQL result resource ?!
    Par alfigor dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 19/04/2006, 14h38

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