Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 10/11/2006, 23h33   #1
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
Par défaut [SQL] Erreur lors d'un appel de fonction

Bonjour à tous,

Je suis en train de développer une classe pour gérer les menus, tout avec PDO.

Bref quand je lance ma fonction create_menu('0') depuis mon objet.

J'ai dès la première recursivité de mon code, une erreur de ce type

Code :
Fatal error: Call to a member function fetch() on a non-object in D:\Hebergement\xampp\htdocs\cms creamotion\class menu.php on line 98
Voici mon code

SI vous avez une idée, je suis preneur !

Merci d'avance

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
 
<?php
 
/**
 * Class Menu
 *
 * @version 0.1
 * @copyright 2006 - Xavier VALENTIN
 */
class Menu {
 
public $db;						// base de données - class d'abstraction PDO
public $table;					// table contenant les informations du menu
 
 
	function __construct($z_table,$z_db){
		$this->db 		= $z_db;
		$this->table 	= $z_table;
	}
 
   	/**
   	 * Menu::get_title()
   	 *
   	 * @param mixed $id
   	 * @return - string - donne le title pour $id
   	 **/
   	function get_title($id){
   		$title	= $this->db->query("SELECT title FROM $this->table
		   							WHERE id = '$id'");
   		$result = $title->fetch(PDO::FETCH_BOTH);
      	return $result[0];
   	}
 
   	/**
   	 * Menu::get_parentID()
   	 *
   	 * @param mixed $id
   	 * @return - string - donne le parentID pour $id
   	 **/
   	function get_parentID($id){
   		$parentID	= $this->db->query("SELECT parentID FROM $this->table
		   							WHERE id = '$id'");
   		$result 	= $parentID->fetch(PDO::FETCH_BOTH);
      	return $result[0];
   	}
 
	/**
	 * Menu::create_node()
	 *
	 * @param mixed $title
	 * @param mixed $position
	 * @param mixed $parentID
	 * @return
	 **/
	function create_node($title,$position,$parentID){
		$this->db->query("INSERT INTO $this->table(title,position,parentID)
							VALUES ('$title','$position','$parentID')");
	}
 
	/**
	 * Menu::delete_node()
	 *
	 * @param mixed $id
	 * @return
	 **/
	function delete_node($id){
		$this->db->query("DELETE FROM $this->table WHERE id = '$id'");
	}
 
	/**
	 * Menu::update_node()
	 *
	 * @param mixed $id
	 * @param mixed $title
	 * @param mixed $position
	 * @param mixed $parentID
	 * @return
	 **/
	function update_node($id,$title,$position,$parentID){
		$this->db->query("UPDATE $this->table SET
							title		=	'$title',
							position	=	'$position',
							parentID	= 	'$parentID'
							WHERE id	=	'$id';");
	}
 
	function create_menu($parentID){
		global $i;
		global $req;
 
		if ($parent == 0) {$i=0;}
		$i = $i + 1 ;
 
   		$req = $this->db->query("SELECT * FROM $this->table
		   							WHERE parentID = '$parentID'");
 
		print "<ul id=\"menu\">\n";
 
		while($myrow  = $req->fetch()) {
			print '<li><a href="'.$myrow['id'].'">'.$myrow['title'].'</a>';
			$this->create_menu($myrow['id']);
			print "</li>\n";
		}
		print "</ul>\n";
 
	}
 
}
?>
Et pour excuter ce code :
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
// paramètres de connexion
$dsn = 'mysql:host=localhost;dbname=mabase';
$user = 'utilisateur';
$password = 'motsdepasse';
$db = new PDO($dsn, $user, $password);
 
$menu = new Menu('matable', $db);
 
$menu->create_menu('0');
?>
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2006, 01h18   #2
Membre éclairé
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 397
Points : 397
Envoyer un message via MSN à genova
Tu ne vérifies pas le retour d'erreur de
Code :
1
2
$this->db->query("INSERT INTO $this->table(title,position,parentID)
							VALUES ('$title','$position','$parentID')");
ta requète est fausse il manque un espace après $this->table, donc erreur SQL, donc $this->db->query() ne te renvoie pas un objet mais un boolean probablement.
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2006, 08h35   #3
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
Cette requete pose pas de problème (j'ai toutefois fait la modification que tu m'as conseillée), le problème se situe au niveau de la fonction create_menu. Le problème vient du fait qu'il s'agit d'une fonction récursive. Dès lors ou j'enlève la récursivité cela fonctionne très bien, mais l'intéret de cette class réside justement dans cette récursivité.

Mon problème est que je n'arrive pas à comprendre ou a savoir pourquoi ça me sort cette erreur...


Si vous avez une idée je suis preneur

Voici la dernière version de mon code (avec la meme erreur...):

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
 
/**
 * Class Menu
 *
 * @version 0.1
 * @copyright 2006 - Xavier VALENTIN
 */
 
class Menu {
 
public $db;						// base de données - class d'abstraction PDO
public $table;					// table contenant les informations du menu
 
	/**
	 * Menu::__construct()
	 *
	 * @param mixed $z_table
	 * @param mixed $z_db
	 **/
	function __construct($z_table,$z_db){
		$this->db 		= $z_db;
		$this->table 	= $z_table;
	}
 
	/**
	 * Menu::get_title()
	 *
	 * @param mixed $id
	 * @return  - string - donne le title pour $id
	 **/
	function get_title($id){
		$title	= $this->db->query("SELECT title FROM $this->table
									WHERE id = '$id'");
		$result = $title->fetch(PDO::FETCH_BOTH);
		return $result[0];
	}
 
	/**
	 * Menu::get_parentID()
	 *
	 * @param mixed $id
	 * @return - string - donne le parentID pour $id
	 **/
	function get_parentID($id){
		$parentID	= $this->db->query("SELECT parentID FROM $this->table
										WHERE id = '$id'");
		$result 	= $parentID->fetch(PDO::FETCH_BOTH);
		return $result[0];
	}
 
	/**
	 * Menu::create_node()
	 *
	 * @param mixed $title
	 * @param mixed $position
	 * @param mixed $parentID
	 * @return
	 **/
	function create_node($title,$position,$parentID){
		$this->db->query("INSERT INTO $this->table (title,position,parentID)
							VALUES ('$title','$position','$parentID')");
	}
 
	/**
	 * Menu::delete_node()
	 *
	 * @param mixed $id
	 * @return
	 **/
	function delete_node($id){
		$this->db->query("DELETE FROM $this->table WHERE id = '$id'");
	}
 
	/**
	 * Menu::update_node()
	 *
	 * @param mixed $id
	 * @param mixed $title
	 * @param mixed $position
	 * @param mixed $parentID
	 * @return
	 **/
	function update_node($id,$title,$position,$parentID){
		$this->db->query("UPDATE $this->table SET
							title		=	'$title',
							position	=	'$position',
							parentID	= 	'$parentID'
							WHERE id	=	'$id';");
	}
 
	/**
	 * Menu::create_menu()
	 *
	 * @param mixed $parentID
	 * @return
	 **/
	function create_menu($parentID){
		global $i;
		global $req;
 
		if ($parentID == 0) {$i=0;}
		$i = $i + 1 ;
 
		$req = $this->db->query("SELECT * FROM $this->table
		   							WHERE parentID = '$parentID'");
 
		print "<ul id=\"menu\">\n";
 
		while($myrow  = $req->fetch()) {
			print '<li><a href="'.$myrow['id'].'">'.$myrow['title'].'</a>';
			$this->create_menu($myrow['id']);
			print "</li>\n";
		}
		print "</ul>\n";
 
	}
 
}
?>
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2006, 15h05   #4
Membre éclairé
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 397
Points : 397
Envoyer un message via MSN à genova
Juste après ton $req = $this->db->query ajoute var_dump($req) et dit nous ce que ça affiche
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2006, 16h34   #5
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
Voici ce que j'obtiens :

La première boucle fonctionne, car il affiche le premier item (root avec son id 1) mais pour le deuxième item, il pine
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<html><head></head><body>object(PDOStatement)#3 (1) {
  ["queryString"]=&gt;
  string(53) "SELECT * FROM nodes
		   							WHERE parentID = '0'"
}
<ul id="menu">
<li><a href="1">root</a>bool(false)
<ul id="menu">
<br>
<b>Fatal error</b>:  Call to a member function fetch() on a non-object in <b>D:\Hebergement\xampp\htdocs\cms creamotion\class menu.php</b> on line <b>110</b><br>
 
</ul></li></ul></body></html>
Je vais devenir fou
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2006, 13h32   #6
Membre éclairé
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 397
Points : 397
Envoyer un message via MSN à genova
Et bien comme je te le disais depuis le départ, tu as bool(false) qui apparait, donc $req n'est pas un objet mais un boolean FALSE, ce qui signifie que ta requètes ne marche pas, c'est sur à 100%.

Suffit de faire
Code :
1
2
$req = $this->db->query("SELECT * FROM $this->table
		   							WHERE parentID = '$parentID'") OR die('Erreur SQL');
pour t'en rendre compte.

Vérifier les retours des fonctions c'est la base du débugage.

@+
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2006, 21h11   #7
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
Je viens de faire la modification que tu viens de m'indiquer et j'ai ceci :

Code :
1
2
3
4
5
6
7
object(PDOStatement)#3 (1) {
  ["queryString"]=>
  string(53) "SELECT * FROM nodes
		   							WHERE parentID = '0'"
}
<ul id="menu">
<li><a href="1">root</a>Erreur SQL
Mais pourquoi il veut pas effectuer cette récursivité ?
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2006, 21h23   #8
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
Voici ma table et ma BDD :

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
-- 
 
-- Structure de la table `nodes`
 
-- 
 
 
 
CREATE TABLE `nodes` (
 
  `id` int(11) NOT NULL auto_increment,
 
  `title` varchar(255) collate latin1_general_ci NOT NULL,
 
  `position` int(11) NOT NULL,
 
  `parentID` int(11) NOT NULL,
 
  PRIMARY KEY  (`id`)
 
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=8 ;
 
 
 
-- 
 
-- Contenu de la table `nodes`
 
-- 
 
 
 
INSERT INTO `nodes` VALUES (1, 'root', 1, 0);
 
INSERT INTO `nodes` VALUES (2, 'europe', 2, 1);
 
INSERT INTO `nodes` VALUES (3, 'norway', 3, 2);
 
INSERT INTO `nodes` VALUES (4, 'ste', 4, 3);
 
INSERT INTO `nodes` VALUES (5, 'oslo', 5, 3);
 
INSERT INTO `nodes` VALUES (6, 'test', 6, 0);
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2006, 12h07   #9
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
Personne a une idée ?

Pour être un peu plus précis, voici le resultat que je cherche à obtenir :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ul>
  <li>Root
    <ul>
      <li>Europe
        <ul>
          <li>Norway
            <ul>
              <li>Ste</li>
              <li>Oslo</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>test</li>
</ul>
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2006, 16h10   #10
Membre éclairé
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 397
Points : 397
Envoyer un message via MSN à genova
Lorsque tu fais
Code :
1
2
SELECT * FROM nodes
		   							WHERE parentID = '0'
via phpMyAdmin qu'obtiens tu comme résultat ?
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2006, 17h31   #11
Invité de passage
 
Inscription : janvier 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 18
Points : 1
Points : 1
J'obtiens ceci :

Code :
1
2
1  	root  	1  	0
6 	test 	6 	0
xavier.valentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2006, 22h56   #12
Membre éclairé
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 397
Points : 397
Envoyer un message via MSN à genova
Bizare, pourtant dans le script il y a Erreur SQL ..

Remplace le or die('erreur sql'); par or die(mysql_error()) histoire d'avoir l'erreur sql complète.
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova 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 15h09.


 
 
 
 
Partenaires

Hébergement Web