Précédent   Forum des professionnels en informatique > Applications > Projets > Projets hébergés > Archives > PhpMyObject
PhpMyObject Mapper de bases de données écrit en PHP qui transforme les résultats de requêtes SQL en objets (ORM). Le site : http://pmo.developpez.com
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 14/10/2007, 22h01   #1
Invité de passage
 
Inscription : juillet 2005
Messages : 3
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 3
Points : 1
Points : 1
Par défaut Probleme avec essai simple

Bonjour, j'ai tenté d'utiliser PhpMyOject tout à l'heure.
Je l'utilise avec une base PostgreSQL, mais meme avec un programme tout simple, je n'arrive pas a l'utiliser.
Mon code, tout simple :
Code :
1
2
3
4
5
6
7
8
9
10
			require_once("core/PMO_MyController.php");		
			$controler = new PMO_MyController();
			$map = $controler->queryController("SELECT * FROM articles ORDER BY date_crea LIMIT 10; ");
			
			while ($result = $map->fetchMap()){
				$article = $result['article'];				
				echo("<h2>".$article->titre."</h2>");
				echo($article->texte);
			}
Si j'utilise le driver pgsql, j'obtiens :
En utilisant pdo, ceci :

Code :
1
2
3
4
5
Warning: Invalid argument supplied for foreach() in /home/fabien/public_html/pmo/core/PMO_MyController.php on line 48

Warning: Invalid argument supplied for foreach() in /home/fabien/public_html/pmo/core/PMO_MyObject.php on line 40

Warning: Invalid argument supplied for foreach() in /home/fabien/public_html/pmo/core/PMO_MyController.php on line 54
J'ai essayé de voir le contenu de $table avant le foreach :
Avec pdo :
Code :
PMO_MyTable Object ( [table_name:protected] => articles [table_pk:protected] => [table_attribute:protected] => Array ( ) )
Avec pgsql :
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
PMO_MyTable Object
(
    [table_name:protected] =&gt; articles
    [table_pk:protected] =&gt; Array
        (
            [0] =&gt; id_article
        )

    [table_attribute:protected] =&gt; Array
        (
            [id_article] =&gt; Array
                (
                    [Type] =&gt; alnum
                    [Null] =&gt; 
                    [Key] =&gt; PRI
                    [Default] =&gt; 
                    [Extra] =&gt; 
                )

            [texte] =&gt; Array
                (
                    [Type] =&gt; alnum
                    [Null] =&gt; 
                    [Key] =&gt; NULL
                    [Default] =&gt; 
                    [Extra] =&gt; 
                )

            [titre] =&gt; Array
                (
                    [Type] =&gt; alnum
                    [Null] =&gt; 
                    [Key] =&gt; NULL
                    [Default] =&gt; 
                    [Extra] =&gt; 
                )

            [date_crea] =&gt; Array
                (
                    [Type] =&gt; alnum
                    [Null] =&gt; 
                    [Key] =&gt; NULL
                    [Default] =&gt; 
                    [Extra] =&gt; 
                )

        )

)
Voyant, ca, j'ai rajouté un print_r($map) entre le queryController et le while dans mon code.


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
25
26
27
28
29
30
31
32
33
34
PMO_MyMap Object
(
    [map:protected] => Array
        (
            [0] => Array
                (
                    [articles] => PMO_MyObject Object
                        (
                            [object_id:protected] => 0
                            [object_table:protected] => PMO_MyTable Object
                                (
					//Comme au dessus...
                                )

                            [object_attribute:protected] => Array
                                (
                                    [id_article] => 1
                                    [texte] => Ceci est un article de test. <b>A ignorer</b>
                                    [titre] => Article test
                                    [date_crea] => 2007-10-14 21:36:10.062253
                                )

                            [object_linked:protected] => Array
                                (
                                )

                            [object_new:protected] => 1
                        )

                )

        )

)
On voit que l'article est bien récupéré, mais il ne s'affiche pas après.
Donc voila, je cherche comment faire pour faire marcher ca.
fabien_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 12h42   #2
Membre habitué
 
Inscription : janvier 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 181
Points : 114
Points : 114
Salut

Je pense que ton problème vient de là

ancien code
Code :
1
2
3
while ($result = $map->fetchMap()){
	$article = $result['article'];
devrait être
Code :
1
2
3
while ($result = $map->fetchMap()){
	$article = $result['articles'];
car l'objet provient de la table articles

Je te conseille très fortement d'utiliser aussi la version sur le subversion car elle corrige de très nombreux bug (notamment des bugs pdo)
__________________
PhpMyObject teck leader
http://pmo.developpez.com

La justice de l'intelligence est la sagesse. Le sage n'est pas celui qui sait beaucoup de choses, mais celui qui voit leur juste mesure.
code34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 20h53   #3
Invité de passage
 
Inscription : juillet 2005
Messages : 3
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 3
Points : 1
Points : 1
J'ai honte tellement l'erreur était bete.
Pour la peine, j'ai testé la version SVN.
En utilisant pgsql, ca marche bien.
Par contre, avec pdo, bug
Code :
1
2
3
4
5
6
7
8
Fatal error</b>:  Uncaught exception 'PDOException' with message 'could not find driver' in /home/fabien/public_html/pmo/PMO_core/PMO_sgbd_pdo.php:19
Stack trace:
#0 /home/fabien/public_html/pmo/PMO_core/PMO_sgbd_pdo.php(19): PDO-&gt;__construct(':host=localhost...', 'm...', '.....')
#1 /home/fabien/public_html/pmo/PMO_core/PMO_MySgbd.php(62): PMO_Sgbd_Pdo-&gt;connectSgbd(Array)
#2 /home/fabien/public_html/pmo/PMO_core/PMO_MyController.php(29): PMO_MySGBD::factorySgbd(NULL)
#3 /home/fabien/public_html/pmo/test.php(5): PMO_MyController-&gt;__construct()
#4 {main}
  thrown in <b>/home/fabien/public_html/pmo/PMO_core/PMO_sgbd_pdo.php</b> on line <b>19</b><br>
donc j'ai rajouté
Code :
"pdodriver"=>$pdodriverz);
à la ligne 35 de PMO_MySgbd.php et la, j'obtiens
Code :
1
2
3
SQLSTATE[42601]: Syntax error: 7 ERREUR:  erreur de syntaxe sur ou près de «DESC»
LINE 1: DESC articles ;
        ^
alors que ma requete est
Code :
SELECT * FROM articles ORDER BY date_crea LIMIT 10;
Il vient d'ou le DESC?
fabien_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 22h19   #4
Membre habitué
 
Inscription : janvier 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 181
Points : 114
Points : 114
Citation:
Envoyé par fabien_m Voir le message
J'ai honte tellement l'erreur était bete.
Pour la peine, j'ai testé la version SVN.
En utilisant pgsql, ca marche bien.
Par contre, avec pdo, bug
Code :
1
2
3
4
5
6
7
8
Fatal error</b>:  Uncaught exception 'PDOException' with message 'could not find driver' in /home/fabien/public_html/pmo/PMO_core/PMO_sgbd_pdo.php:19
Stack trace:
#0 /home/fabien/public_html/pmo/PMO_core/PMO_sgbd_pdo.php(19): PDO-&gt;__construct(':host=localhost...', 'm...', '.....')
#1 /home/fabien/public_html/pmo/PMO_core/PMO_MySgbd.php(62): PMO_Sgbd_Pdo-&gt;connectSgbd(Array)
#2 /home/fabien/public_html/pmo/PMO_core/PMO_MyController.php(29): PMO_MySGBD::factorySgbd(NULL)
#3 /home/fabien/public_html/pmo/test.php(5): PMO_MyController-&gt;__construct()
#4 {main}
  thrown in <b>/home/fabien/public_html/pmo/PMO_core/PMO_sgbd_pdo.php</b> on line <b>19</b><br>
donc j'ai rajouté
Code :
"pdodriver"=>$pdodriverz);
à la ligne 35 de PMO_MySgbd.php et la, j'obtiens
Code :
1
2
3
SQLSTATE[42601]: Syntax error: 7 ERREUR:  erreur de syntaxe sur ou près de «DESC»
LINE 1: DESC articles ;
        ^
alors que ma requete est
Code :
SELECT * FROM articles ORDER BY date_crea LIMIT 10;
Il vient d'ou le DESC?
Oui, pour le moment pgsql n'est pas implémenté avec pdo. Pour répondre à ta question, PMO avant d'executer ta requête sql récupère le schéma des tables qui concerne ta requête SQL, il remplie comme ça les objets PMO_MyTable.

Pour cela il execute la commande DESC.

Il n'y a pas de drivers pgsql pdo parce que la commande DESC n'est pas implémenté nativement par pdo. Ca ne prend que quelques minutes pour créer ce driver, mais je ne l'ai pas fais pour des raisons d'archi, je ne trouve pas ça propre alors en attendant autant utiliser le driver pgsql
__________________
PhpMyObject teck leader
http://pmo.developpez.com

La justice de l'intelligence est la sagesse. Le sage n'est pas celui qui sait beaucoup de choses, mais celui qui voit leur juste mesure.
code34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 17h04   #5
Invité de passage
 
Inscription : juillet 2005
Messages : 3
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 3
Points : 1
Points : 1
Je continue mon mini moteur de blog ^^ avec PMO dernière version
Aujourd'hui, je tombe sur une erreur quand j'éxécute ce code :
Code :
1
2
3
4
5
6
7
8
try{
	$map = $controler->queryController("SELECT titre,date_crea,articles.texte,COUNT(id_com) AS num_coms FROM articles,commentaires WHERE id_article=id_art GROUP BY articles.titre,id_art,date_crea,articles.texte ORDER BY date_crea LIMIT 10; ");

} 
catch(Exception $e){
	echo 'Oups, une exception : '.$e->getMessage();
}
et j'obtiens :"Error: attribute value is undefine"
Pour commencer, c'est undefined
Ensuite, est-ce que PMO gere les count()?
Enfin, mais pas lié à PMO, je pense, php ne passe pas par le bloc catch,et je ne comprend pas trop pourquoi
fabien_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 21h06   #6
Membre habitué
 
Inscription : janvier 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 181
Points : 114
Points : 114
Citation:
Envoyé par fabien_m Voir le message
Je continue mon mini moteur de blog ^^ avec PMO dernière version
Aujourd'hui, je tombe sur une erreur quand j'éxécute ce code :
Code :
1
2
3
4
5
6
7
8
try{
	$map = $controler->queryController("SELECT titre,date_crea,articles.texte,COUNT(id_com) AS num_coms FROM articles,commentaires WHERE id_article=id_art GROUP BY articles.titre,id_art,date_crea,articles.texte ORDER BY date_crea LIMIT 10; ");

} 
catch(Exception $e){
	echo 'Oups, une exception : '.$e->getMessage();
}
et j'obtiens :"Error: attribute value is undefine"
Pour commencer, c'est undefined
Ensuite, est-ce que PMO gere les count()?
Enfin, mais pas lié à PMO, je pense, php ne passe pas par le bloc catch,et je ne comprend pas trop pourquoi
1- ok pour la correction orth
2- Oui ça doit être le count qui provoque l'erreur. PMO ne gère pas les noms de colonne ou count, max dans le select. Il faut "pour le moment" utiliser des select *. Tu as une méthode $map->numRows() qui te renvoit le nombre de ligne dans ta map .

3-t 'as rien de plus dans le message d erreur ? normalement, effectivement tu devrais pouvoir récupérer l'exception dans ton bloc. Peut être une portion de code que j'ai mal cleané. Je vais controler sur une base chez moi
__________________
PhpMyObject teck leader
http://pmo.developpez.com

La justice de l'intelligence est la sagesse. Le sage n'est pas celui qui sait beaucoup de choses, mais celui qui voit leur juste mesure.
code34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 21h48   #7
Membre habitué
 
Inscription : janvier 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 181
Points : 114
Points : 114
Je viens de regarder:

2- Ton erreur provient du fait qu'il manque une colonne primary key dans le nom des colonnes que tu donnes dans ton select. Il faut donc utiliser des select * tant que le reste n'a pas été implémenté.

3- pour le bloc catch, j'avais oublié de cleaner une partie du code. Je viens de faire la correction sur le subv. Il s'agit d'un bloc try catch qui se trouve dans la méthode querycontroller qui affichait le message en faisant un die. Cette portion du code n'a plus de raison d'exister.
__________________
PhpMyObject teck leader
http://pmo.developpez.com

La justice de l'intelligence est la sagesse. Le sage n'est pas celui qui sait beaucoup de choses, mais celui qui voit leur juste mesure.
code34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h21.


 
 
 
 
Partenaires

Hébergement Web