Bonsoir :)
voila j'ai une class PdoManager qui gère les connections a la base de donnée, puis j'ai une class Users qui extend de PdoManager puis j'ai des function, quand je veut utiliser l'une des function j'ai une erreur PHP Fatal error: Call to a member function prepare() on a non-object

Une deuxième question, dans la fonction getID je peut la rappeler elle même si l'id est déjà utiliser ?

Pdo.Class.php

<?php
class PDOManager {

    private $driver = "mysql";
    private $host = "127.0.0.1";
    private $port = "8889";
    private $username = "root";
    private $password = "root";
    private $database = "dps";
    protected $pdo;
    function __construct() {
        $dsn = $this->driver.":host=".$this->host.";port=".$this->port.";dbname=".$this->database;
        $this->pdo = new PDO($dsn, $this->username, $this->password);
    }
}

Users.Class.php
(plus de function mais je n'en met qu'une)

<?php
require_once 'Pdo.Class.php';
/**
* Users.Class.php
*/
class Users extends PDOManager {
    public function getID() {
        $id = substr(hash("md5", uniqid(rand(),true)), 0,7);

        $query = $this->pdo->prepare("SELECT * FROM users WHERE (id = :id)");
        $query->bindValue(':id', $id);
        $query->execute();
        $result = $query->fetch();
        if (empty($result)) {
            return $id;
        } else {
            $this->getID();
        }
    }
}

Merci beaucoup :)

5 réponses


euh cela veut dire qu'il te manque la fonction prepare dans ta class pdoManager ($this renvoi à ta classe pdoManager et pas à la classe PDO)

pour répondre à ta deuxième question tu peux tout à fait,faire des fonctions récursive mais dans ton cas je ne crains que cela tourne en boucle puisque tu retourne $id si le résultat est vide et tu rejoues la fonction si le résultat est présent sans retourner celui-ci.
Donc si ta requête n'est pas vide ta fonction se joue à l'infini, je pense que le else devrait être $result->id ou quelque chose

mais la fonction prepare est pas defaut sur php non ?
Pour le else c'est si l'ID existe deja il doit en generer un nouveau

Le driver PDO est par défaut depuis php5.3 tout dépend de ta version sur ton serveur.

$this renvoi à ta classe pdoManager et pas à la classe native PDO vu qu'il n'y a pas extends PDO

Donc je rajoute extends PDO ?

<?php
require_once 'Pdo.Class.php';
/**
* Users.Class.php
*/
class Users extends PDOManager {
    public $pdo;
    function __construct($pdo) {
        parent::_construct();
        if (!isset($_SESSION'user']'id']) && !empty($_SESSION'user']'id'])) {
            $id = $_SESSION'user']'id'];
            $query = $this->pdo->prepare("SELECT * FROM users WHERE id = :id");
            $query->bindValue(':id', $id);
            $query->execute();
            $result = $query->fetch();
            if ($result) {
                $this->session($result'id']);
            } else {
                // $this->redirect("login.php");
            }

        } else {
            // $this->redirect("login.php");
        }
    }
    public function session($id = null) {
        if ($id == null) {
            echo "ERREUR";
        } else {
            $query = $this->pdo->prepare("SELECT id,nom,prenom FROM users WHERE id = :id");
            $query->bindValue(':id', $id);
            $query->execute();
            $_SESSION'user'] = $query->fetch();
        }
    }
    public function redirect($page = "http://www.monsite.org/") {
        header("Location: $page");
        exit();
    }
    public function login($email,$password,$hash = "default") {
        if (empty($email)) {
            $error'email'] = "empty";
        }
        if (empty($password)) {
            $error'password'] = "empty";
        }
        $password = $this->hash($password, $hash);
        if (!isset($error)) {
            $query = $this->pdo->prepare("SELECT id,email,password FROM users WHERE email = :email");
            $query->bindValue(':email', $email);
            $query->execute();
            $result = $query->fetch();
            if (!empty($result)) {
                if ($result'password'] == $password) {
                    $this->session($result'id']);
                    die("Ok");
                    // $this->redirect('index.php');
                } else {
                    $error'password'] = "false";
                }
            } else {
                $error'email'] = "false";
            }
        }
        return $error;
    }
    public function create($email,$password,$nom,$prenom,$hash = "default") {
        if (empty($email)) {
            $error'email'] = "empty";
        }
        if (empty($password)) {
            $error'password'] = "empty";
        }
        if (empty($nom)) {
            $error'nom'] = "empty";
        }
        if (empty($prenom)) {
            $error'prenom'] = "empty";
        }
        $id = $this->getID();
        $password = $this->hash($password, $hash);
        if (!isset($error)) {
            $query2 = $this->pdo->prepare("INSERT INTO 'users' ('id', 'email', 'password', 'nom', 'prenom') VALUES (':id', ':email', ':password', ':nom', ':prenom')");
            $query2->bindValue(':id', $id);
            $query2->bindValue(':email', $email);
            $query2->bindValue(':password', $password);
            $query2->bindValue(':nom', $nom);
            $query2->bindValue(':prenom', $prenom);
            $query2->execute();
            $error'ok'] = "ok";
        }
        return $error;
    }
    public function getID() {
        $id = substr(hash("md5", uniqid(rand(),true)), 0,7);
        $query = $this->pdo->prepare("SELECT * FROM users WHERE (id = :id)");
        $query->bindValue(':id', $id);
        $query->execute();
        $result = $query->fetch();
        if (empty($result)) {
            return $id;
        } else {
            unset($id);
            $getID();
        }
    }
}