Problème dans une classe avec PDO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème dans une classe avec PDO

par Ajoloca » 11 nov. 2006, 15:02

Bonjour,

Je ne comprends pas ta récursivité.

Je crois que ta mhode, comme elle est ecrite ne supporte pas la récursivité.
regarde ça
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"; 
Combien de fois écris tu cette ligne

Code : Tout sélectionner

print "<ul id=\"menu\">\n";
Comme tu le sais un 'id' est unique (même en (X)HTML) de plus elle se ferme quand ta balise '<ul>' ??? vu que tu revois (récursivité) en début de fonction avant l'écriture de la balise fermante '</ul>'
Quand tu exécutes ce code, regarde dans la page générée le code
Sur la page click droit->afficher la source

par neopheus » 11 nov. 2006, 09:42

CREATE TABLE `matable` (
`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 ;

par neopheus » 11 nov. 2006, 09:22

Tu as raison raison : (parentID c'est mieux que Parent ^^ -> p'tite erreur d'étourderie :))
		if ($parentID == 0) {$i=0;}
		$i = $i + 1 ;
POur ce qui est de la fonction create_menu($parentID)

Elle fonctionne à moitié si tu veux.

Il s'agit d'une fonction récursive, lors de sa première boucle, la requete se passe bien, j'ai les résultats : impeccable. Mais dès lors que je rentre dans la récursivité, c'est là ou j'ai l'erreur.

Et je vois vraiment pas pourquoi...

Je vais te chercher la BDD pour te montrer à quoi elle ressemble.

Si t'as des idées ou des suggestions pour réussir à faire fonctionner cette bestiole, je suis preneur :)

par Ajoloca » 11 nov. 2006, 01:49

Re,
Tu devrais toujours tester le résultat de la création de l'objet PDO et des requètes (query et exec).
Tu devrais donner des noms plus parlants à tes variables.
Utiliser des variables globales dans une class

Code : Tout sélectionner

global $i; global $req;
est une hérésie tout comme le fait qu'une classe comme celle-ci (qui accède à des données brutes) face des affichages.
Tu devrais aussi faire attention aux type et NOM des variables. À l'appel de la méthode tu passes un caractère que tu devrais récupérer sous $parentID mais tu testes avec $parent et un type entier

Code : Tout sélectionner

// Appel $menu->create_menu('0'); function create_menu($parentID){ global $i; global $req; // La réception - test if ($parent == 0) {$i=0;}
Donc la question est d'où sort la variable $parent ?

Code : Tout sélectionner

if ($parent == 0) {$i=0;}
Je suppose que les valeurs que tu mets dans tes paramètres existent
et surtout 'matable' (elle existe bien dans ta base)

par neopheus » 11 nov. 2006, 01:24

En fait j'appel ma fonction de cette manière :
<?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');
?>

par Ajoloca » 11 nov. 2006, 01:18

Bonsoir,

Je crois qu'il-y-a plusieurs soucis

1 - Je ne vois pas la création de l'objet POD, QQ chose du style
try{
	$cnx = new PDO($dsn, $user, $pass);
}catch(PDOException $ePDO){
	echo 'ERREUR DE CONNEXION : ' . $ePDO->getMessage(). '<br />';
	exit();
}
En suite, les requètes se font sur l'objet obtenu (ici $cnx) et non pas sur la base comme tu fais

Code : Tout sélectionner

$title = $this->db->query("SELECT title FROM $this->table WHERE id = '$id'");
C'est dans le DSN (ici $dsn) que sont spécifiés :
Le driver, le host, la base
La structure du DSN (Data Server Name pour certains, Data Service Name pour d'autres) dépend du driver (mysql, odbc, oci,...). Ne connaissant pas le tien je ne peux donc te donner celle qui correspond à ton cas

Problème dans une classe avec PDO

par neopheus » 11 nov. 2006, 00:48

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 : Tout sélectionner

Fatal error: Call to a member function fetch() on a non-object in class menu.php on line 98
Voici mon code

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

Merci d'avance
<?php
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';");
	}

	/**
	 * Menu::create_menu()
	 *
	 * @param mixed $parentID
	 * @return
	 **/
	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";

	}

}
?>