Bonjour messieurs,
J'ai mis du temps à revenir, mais c'était le temps de me familiariser un peu plus à PDO / Singleton / ...
Déjà, merci de m'avoir mit sur cette voie, je pense effectivement que c'est exactement ce qu'il me fallait !!!
Ensuite, effectivement, j'avais inversé "mot de passe" / "utilisateur" ... ca ne pouvait forcément pas fonctionner !
Et enfin, je reviens forcément avec au moins une question
Je vous copie d'abord mon code actuel, puis je la pose :
Ma nouvelle classe Connexion()
class Connexion {
private static $instance = null;
public static function getInstance()
{
if (is_null (self::$instance))
{
self::$instance = new Connexion();
}
return self::$instance;
}
private $connexion = null;
const DB_HOST = "*******";
const DB_USER = "*******";
const DB_PASS = "*******";
const DB_NAME = "******";
function __construct ()
{
try {
$this->connexion = new PDO ('mysql:host='.self::DB_HOST.';dbname='.self::DB_NAME, self::DB_USER, self::DB_PASS);
} catch (PDOException $e) {
echo 'Connexion échouée : ' . $e->getMessage();
}
}
public function __get($property)
{
if (array_key_exists ($property, get_class_vars(__CLASS__)))
return $this->$property;
else
die($property." est introuvable. Affichage impossible.");
}
public function __set($property, $value)
{
if (array_key_exists ($property, get_class_vars(__CLASS__)))
$this->$property = $value;
else
die($property." est introuvable. Mise à jour impossible.");
}
public function prepare ($query)
{
return $this->connexion->prepare ($query);
}
public function query ($query)
{
return $this->connexion->query ($query);
}
public function exec($query)
{
return $this->connexion->exec ($query);
}
public function num_rows()
{
$count = 0;
while ($row = $this->fetch())
$count++;
return $count;
}
public function fetch()
{
return $this->connexion->fetch (PDO::FETCH_BOTH);
}
public function show ()
{
echo "Connexion : <PRE>";
print_r ($this->connexion);
echo "</PRE><br/>";
echo "BDD : ".self::DB_NAME."<br/>";
echo "Host : ".self::DB_HOST."<br/>";
echo "User : ".self::DB_USER."<br/>";
echo "Mdp : ".self::DB_PASS."<br/>";
}
}
Ma classe CategorieDAO()
require_once ("./class/connexion.class");
$sname = session_name ("toto");
if (!isset ($_COOKIE[ini_get('toto')]))
session_start();
require_once ("./class/categories.class");
require_once ("./class/collection.class");
class CategorieDAO
{
function __construct()
{
}
public function GetMenu($menus = NULL, $categories = NULL)
{
$query_menu = "";
if (is_null($menu))
$query_menu = " WHERE id_menu != 0";
if (is_array($menu))
{
$query_menu = " WHERE id_menu IN (";
$tab_menus = "";
for ($i = 0; $i < count($menu); $i++)
{
if ($tab_menus != "")
$tab_menus .= ", ";
$tab_menus .= $menu[$i];
}
$query_menu = ")";
}
if (!is_null($menu) && !is_array($menu))
$query_menu = " WHERE id_menu = ".$menu;
$query = "SELECT * FROM `Categories`".$query_menu.";";
echo $query;
Connexion::getInstance()->prepare($query);
$collec = ($categories == NULL) ? new Collection () : $categories;
foreach ($row = Connexion::getInstance()->fetch())
{
$cat = new Categorie ($row[0], $row[1], $row[2], $row[3]);
$collec->addorUpdate($cat);
}
return $collec;
}
public function isMenu($menu)
{
$query = "SELECT * FROM `Categories` WHERE id_menu = ".$menu.";";
echo $query;
Connexion::getInstance()->prepare($query);
return Connexion::getInstance()->num_rows();
// return (Connexion::getInstance()->exec($query) == 1) ? true : false;
}
public function __get($property)
{
if (array_key_exists($property,get_class_vars(__CLASS__)))
return $this->$property;
else
die("<p>Método Getter inexistente da classe ".__CLASS__."<br>");
}
public function __set($property, $value)
{
if (array_key_exists($property, get_class_vars(__CLASS__)))
$this->$property = $value;
else
die("Método Setter inexistente da classe ".__CLASS__."<br>");
}
public function __isset ($name) {
return isset ($this->data[$name]);
}
public function __unset ($name) {
unset ($this->data[$name]);
}
public function show ()
{
echo $this->id." / ".$this->libelle." / ".$this->menu." / ".$this->id_parent;
}
public function search ($property, $value)
{
if (array_key_exists ($property, get_class_vars(__CLASS__)))
if ($this->$property == $value)
return 1;
return 0;
}
}
Je ne remet pas en copie Collection() et Categorie(), elles sont en haut et n'ont pas ou peu évoluées ...
Et enfin ma page qui me sert à tester le maniement de l'objet :
require_once ("./class/categories.class");
require_once ("./class/collection.class");
require_once ("./class/connexion.class");
require_once ("./class/categoriesDAO.class");
$sname = session_name ("toto");
if (!isset ($_COOKIE[ini_get('toto')]))
session_start();
$menu = isset ($_GET['menu']) ? $_GET['menu'] : NULL;
$categories = isset ($_SESSION['categories']) ? $_SESSION['categories'] : new Collection ();
if ($menu == NULL)
{
echo "menu is null";
// header ("Location: http://*********.com/");
// exit;
}
$cats = new CategorieDAO();
$is_menu = $cats->isMenu($menu);
echo $is_menu;
if (!$is_menu)
{
echo "is_menu is null";
// header ("Location: http://********.com/");
// exit;
}
$cats->GetMenu($menu, &$categories);
$categories->rewind();
do
{
echo $categories->current()->show()."<br/>";
} while ($categories->next());
Et voici donc la dite question :
Lorsque j'exécute mon fetch(), j'ai l'erreur suivante :
Code : Tout sélectionner
Fatal error: Call to undefined method PDO::fetch() in /homez.420/latiendan/www/recette/class/connexion.class on line 72
Je suis évidemment sur que c'est une erreur de ma part, car la fonction existe bien ...
J'espère juste qu'elle n'est pas aussi bête que mes 2 précédentes !
Et perso, je ne sais plus quoi regarder car :
- La fonction est valable depuis PHP 5.1.0 => le serveur est en 5.2.x
- Il faut avoir un PDOStatement => j'ai bien un Connexion::getInstance()->prepare($query); juste avant ... de plus l'erreur aurait été différente (...on a non-object...)
- J'ai essayé avec ou sans le paramètre facultatif PDO::FETCH_BOTH => même résultat
J'avoue que je place mes espoirs en vous là
Merci d'avance !!!
La fonction num_rows() est là uniquement pour me faire tester les différentes fonctions de PDO car sinon biensur je fais juste un count(*) dans ma requete et c'est plié.