Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/02/2007, 01h21   #1
Invité régulier
 
Inscription : janvier 2005
Messages : 40
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Deux Sèvres (Poitou Charente)

Informations forums :
Inscription : janvier 2005
Messages : 40
Points : 9
Points : 9
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 :
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 !

Citation:
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
Mafate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 11h20   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 11h26   #3
Invité régulier
 
Inscription : janvier 2005
Messages : 40
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Deux Sèvres (Poitou Charente)

Informations forums :
Inscription : janvier 2005
Messages : 40
Points : 9
Points : 9
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 !
Mafate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 11h34   #4
Invité régulier
 
Inscription : janvier 2005
Messages : 40
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Deux Sèvres (Poitou Charente)

Informations forums :
Inscription : janvier 2005
Messages : 40
Points : 9
Points : 9
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
Mafate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 12h21   #5
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 12h32   #6
Invité régulier
 
Inscription : janvier 2005
Messages : 40
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Deux Sèvres (Poitou Charente)

Informations forums :
Inscription : janvier 2005
Messages : 40
Points : 9
Points : 9
Citation:
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 !
Mafate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 08h23   #7
Invité régulier
 
Inscription : janvier 2005
Messages : 40
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Deux Sèvres (Poitou Charente)

Informations forums :
Inscription : janvier 2005
Messages : 40
Points : 9
Points : 9
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 :
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 :

Citation:
$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 :

Citation:
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
Mafate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 14h51   #8
Membre habitué
 
Avatar de Cyberbob002
 
Inscription : mai 2003
Messages : 140
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 140
Points : 130
Points : 130
PostgreSQL est sensible à la casse !
Donc si ta table est en majuscules alors tu dois mettre des guillemets autour.


Code sql :
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.
Cyberbob002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 15h24   #9
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 12h19   #10
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
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 T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2007, 21h02   #11
Invité régulier
 
Inscription : janvier 2005
Messages : 40
Détails du profil
Informations personnelles :
Âge : 44
Localisation : France, Deux Sèvres (Poitou Charente)

Informations forums :
Inscription : janvier 2005
Messages : 40
Points : 9
Points : 9
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.
Mafate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 08h48   #12
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
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 T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2007, 21h51   #13
jnore
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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!!!!
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 08h37   #14
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
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 T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 10h07   #15
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h07.


 
 
 
 
Partenaires

Hébergement Web