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

PHP & Base de données Discussion :

[SQL] Erreur lors d'un appel de fonction


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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');
    ?>

  2. #2
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Tu ne vérifies pas le retour d'erreur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    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 : 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
    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";
     
    	}
     
    }
    ?>

  4. #4
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Juste après ton $req = $this->db->query ajoute var_dump($req) et dit nous ce que ça affiche

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    @+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Je viens de faire la modification que tu viens de m'indiquer et j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Voici ma table et ma BDD :

    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
    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);

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Personne a une idée ?

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

    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
    <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>

  10. #10
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM nodes
    		   							WHERE parentID = '0'
    via phpMyAdmin qu'obtiens tu comme résultat ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    J'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1  	root  	1  	0
    6 	test 	6 	0

  12. #12
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    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.

Discussions similaires

  1. [MySQL] PHP PDO erreur lors de l'appel de fonction
    Par devocx dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 04/07/2011, 11h57
  2. [JNA] Erreur lors de l'appel de fonction venant d'une librairie
    Par lac981 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 31/05/2011, 11h02
  3. Erreur lors de l'appel à une fonction
    Par wadja_86 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 09/12/2010, 12h18
  4. Erreur lors de l'appel d'une fonction
    Par larimoise dans le forum MATLAB
    Réponses: 6
    Dernier message: 21/04/2007, 11h02

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