Bonjour,
J'ai regardé la vidéo du tuto pour la gestion d'un espace membre et je l'ai télécharger dar c'est ce qu'il me faut pour mettre sur mon site.
Je rencontre un problème pour mettre mes identifiants pour me connecté à ma base de donnés, si j'ai bien suivie la vidéo, il faut les metre dans le fichier "Database", mais ou!!!
J'ai fais des tests mais je n'arrive pas à me connecté.
<?php
class Database{

private $pdo;

public function __construct($login, $password, $database_name, $host = 'localhost'){
    $this->pdo = new PDO("mysql:dbname=$database_name;host=$host", $login, $password);
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
}

/**
 * @param $query
 * @param bool|array $params
 * @return PDOStatement
 */
public function query($query, $params = false){
    if($params){
        $req = $this->pdo->prepare($query);
        $req->execute($params);
    }else{
        $req = $this->pdo->query($query);
    }
    return $req;
}

public function lastInsertId(){
    return $this->pdo->lastInsertId();
}

}
Est ce que quelqu'un pourrait m'indiquer précidément ou mettre mes identifiants de DB.
Merci d'avance

27 réponses


Gofast77
Réponse acceptée

Je te conseil de prendre l'habitude de regarder sur http://php.net quand tu as une erreur avec quelque chose ;)
Ton erreur viens du fait que les fonctions password_hash et password_verify sont inclu dans php depuis sa version 5.5.0 :)

http://php.net/manual/fr/function.password-hash.php
http://php.net/manual/fr/function.password-verify.php

Salut, je déduis que le code que tu nous affiches est la classe Database, il faut donc, quand tu crées une instance de cette classe,soit un $bdd = new Database(), que tu indiques à l'intérieur des parenthèses les paramètres nécessaire. Pour savoir quel paramètre regarde le constructeur, je pense qu'ils sont assez explicite.

public function __construct($login, $password, $database_name, $host = 'localhost'){
    $this->pdo = new PDO("mysql:dbname=$database_name;host=$host", $login, $password);
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
}
Polo
Auteur

Oui, c'est la classe Database.
Donc il faut que je remlace de qui est en rouge par mes identifiants
public function __construct($login, $password, $database_name, $host = 'localhost'){

Je pense que tu ne connais pas la programmation objet ?

La classe DataBase est surement instancié dans d'autre fichiers.

Tu dois surement avoir quelque chose comme cela :

$bdd = new Database($ici_les_parametres);

Il faut que tu trouves les endroits où la classe est instancié et tu remplaces les paramètres avec les tient, ce qui donnera cela :

$bdd = new Database("mon_login", "mon_mot_de_passe", "le_nom_de_ma_base_de_donnee", "host");

D'ailleurs pour l'host, si tu regardes bien au niveau du constructeur, il est égal à "localhost". Ceci est une valeur par défaut, ce qui veut dire que si tu ne le précises pas quand tu fais le new Database, il prendra par défaut cette valeur !

Polo
Auteur

Le tuto dont je parle est celui ci.

J'ai regardé les fichiers et j'ai trouvé

<?php
$db = new Database('root', 'root', 'tuto');

dans le fichier db.php et ce code

<?php
class App{

    static $db = null;

    static function getDatabase(){
        if(!self::$db){
            self::$db = new Database('root', 'root', 'tuto');
        }
        return self::$db;
    }

    static function getAuth(){
        return new Auth(Session::getInstance(), ['restriction_msg' => 'Lol tu es bloqué !']);
    }

    static function redirect($page){
        header("Location: $page");
        exit();
    }

}

dans le fichier App.php.
Y-a-t'il un ordre précis pour mettre les identifiants

Oui, l'ordre dans lequel ils sont déclaré au niveau du constructeur !

$login, $password, $database_name, $host = 'localhost

Le login en premier, ensuite le mot de passe, le nom de la base de donnée et en dernier l'host !

Polo
Auteur

Je viens de regardé une nouvelle fois la vidéo du tuto
http://www.grafikart.fr/tutoriels/php/gestion-membre-poo-632 et je ne comprend toujours pas ou mettre mes identifiants.
Dans le fichier db.php

<?php
$db = new Database('root', 'root', 'tuto');

et dans le fichier App.php

<?php
class App{

    static $db = null;

    static function getDatabase(){
        if(!self::$db){
            self::$db = new Database('root', 'root', 'tuto');
        }
        return self::$db;
    }

    static function getAuth(){
        return new Auth(Session::getInstance(), ['restriction_msg' => 'Lol tu es bloqué !']);
    }

    static function redirect($page){
        header("Location: $page");
        exit();
    }

}

il dit de remplacer root, root, tuto comme ceci

            self::$db = new Database('login', 'mot de passe', 'nom de la base');

Mais il faut bien mettrele nom du serveur quelque part.
Je suis complètement perdu

Polo
Auteur

Je me suis inspiré de ce site pour essayer de me conncter à ma base de donés http://php.developpez.com/faq/?page=pdo#pdo-connect mais toujours sans succès
Dans le fichier db.php j'ai entré mes identifiants comme ceci

<?php
$db = new Database('login', 'mot de passe', 'nom de la base de donnés', 'serveur');

de même dans le fichier App.php

<?php
class App{

    static $db = null;

    static function getDatabase(){
        if(!self::$db){
            self::$db = new Database('login', 'mot de passe', 'nom de la base de donnés', 'serveur');
        }
        return self::$db;
    }

    static function getAuth(){
        return new Auth(Session::getInstance(), ['restriction_msg' => 'Lol tu es bloqué !']);
    }

    static function redirect($page){
        header("Location: $page");
        exit();
    }

}

Ilm me reste le fichier Database.php
Je ne sais ou lmettre mes identifiants dans la ligne "publicfunction", dans la ligne "$this-<pdo" ou dans les deux

<?php
class Database{

    private $pdo;

    public function __construct($login, $password, $database_name, $host = 'localhost'){
        $this->pdo = new PDO("mysql:dbname=$database_name;host=$host", $login, $password);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    }

    /**
     * @param $query
     * @param bool|array $params
     * @return PDOStatement
     */
    public function query($query, $params = false){
        if($params){
            $req = $this->pdo->prepare($query);
            $req->execute($params);
        }else{
            $req = $this->pdo->query($query);
        }
        return $req;
    }

    public function lastInsertId(){
        return $this->pdo->lastInsertId();
    }

}

J'ai vraiment besoin d'unj petit coup de pouce

Salut,

Mets t'es paramètres dans les parenthèses (au niveau de l'instanciation de la classe Database, celle de ton fichier db.php) et il faut impérativement que les paramètres soient dans le même ordre que celui spécifié dans le constructeur de ta classe Database, comme ça :

// Dans ton fichier db.php tu as cette ligne : 
// self::$db = new Database('root', 'root, 'tuto');
//tu remplace donc 'root', 'root', 'tuto' par tes paramètres (parce les paramètres actuellement spécifiés sont ceux de Grafikart)
// ça donne ça : 

self::$db = new Database('ton_login', 'ton_mot de passe', 'le_nom de la base de donnés');
Polo
Auteur

Ca j'ai compris, je l'ai fais, mais c'est le fichier Database.php que je n'ai pas ou et comment les mettre

<?php
class Database{

    private $pdo;

    public function __construct($login, $password, $database_name, $host = 'localhost'){
        $this->pdo = new PDO("mysql:dbname=$database_name;host=$host", $login, $password);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    }

    /**
     * @param $query
     * @param bool|array $params
     * @return PDOStatement
     */
    public function query($query, $params = false){
        if($params){
            $req = $this->pdo->prepare($query);
            $req->execute($params);
        }else{
            $req = $this->pdo->query($query);
        }
        return $req;
    }

    public function lastInsertId(){
        return $this->pdo->lastInsertId();
    }

}

Oula je pense qu'une petite mise au point est nécessaire concernant la POO en PHP... Quand tu instancies une fonction le constructeur est automatiquement appelé et ce à chaque instanciation (cf http://php.net/manual/fr/language.oop5.decon.php). Tu n'as donc rien besoin de modifier dans ta classe Database ;)

Tu n'as pas besoin de touché à la classe Database, elle est fait pour ça !

Une fois les bon identifiants rentrés tu as quelque chose comme message d'erreur ?

Polo
Auteur

Non, aucun message d'erreurs, quand je vais sur la page "register" la page pour s'inscrire, j'entre pseudo, adresse mail et mot de passe,je clic sur "M"inscrire" et je tombe sur une page blanche

Polo
Auteur

Ok, bien compris pour le fichier Database, j'ai rempli mon fichier db.php et le fichier App.php de cette manière

self::$db = new Database('ton_login', 'ton_mot de passe', 'le_nom de la base de donnés');
Polo
Auteur

J'ai une question, comment je peux me connecté à ma base de donnés si je ne rentre pas le nom du serveur de ma base. Parce que je ne travaille pas en local

Dans ce cas là après le nom de ta base de données tu rajoutes une virgule et l'adresse de ton serveur ;)

Polo
Auteur

C'est chose faite, j'ai rajouté l'adresse du serveur. Maintenant j'arrive à naviger vers le différentes pages, s'inscrire, se connecter, mot de passe oublié, mais quand je rempli le formulaire d'inscription, je tombe toujours sur cette page blanche, de même si j'essaie de me connecté, dans la page mot de passe oublié si je mets mon adresse mail, j'ai un message me disant "Aucun compte ne correspond à cette adresse, ce qui est normal vu que je n'arrive pas à m'inscrire.
Il y du mieux mais c'est pas encore ça, d'ou peut venir mon problème, de ma base de donnés?

Polo
Auteur

Comme mon site est hébetgé chez OVH, j'ai trouvé un petit script qui se met sur ma page pour affiché les erreurs. J'ai mis ce script sur la page register et voilà le résultats
Fatal error: Call to undefined function password_hash() in /home/xxxxx/www/EM/class/Auth.php on line 15

J'ai regardé le fichier, mais ça ne me dit rien du tout, la ligne 15 est celle-ci

 return password_hash($password, PASSWORD_BCRYPT);

Le fichier complet

<?php
class Auth{

    private $options = [
        'restriction_msg' => "Vous n'avez pas le droit d'accéder à cette page"
    ];
    private $session;

    public function __construct($session, $options = []){
        $this->options = array_merge($this->options, $options);
        $this->session = $session;
    }

    public function hashPassword($password){
        return password_hash($password, PASSWORD_BCRYPT);
    }

    public function register($db, $username, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?", [
            $username,
            $password,
            $email,
            $token
        ]);
        $user_id = $db->lastInsertId();
        mail($email, 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://local.dev/Lab/Comptes/confirm.php?id=$user_id&token=$token");
    }

    public function confirm($db, $user_id, $token){
        $user = $db->query('SELECT * FROM users WHERE id = ?', [$user_id])->fetch();
        if($user && $user->confirmation_token == $token ){
            $db->query('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [$user_id]);
            $this->session->write('auth', $user);
            return true;
        }
        return false;
    }

    public function restrict(){
        if(!$this->session->read('auth')){
            $this->session->setFlash('danger', $this->options['restriction_msg']);
            header('Location: login.php');
            exit();
        }
    }

    public function user(){
        if(!$this->session->read('auth')){
            return false;
        }
        return $this->session->read('auth');
    }

    public function connect($user){
        $this->session->write('auth', $user);
    }

    public function connectFromCookie($db){
        if(isset($_COOKIE['remember']) && !$this->user()){
            $remember_token = $_COOKIE['remember'];
            $parts = explode('==', $remember_token);
            $user_id = $parts[0];
            $user = $db->query('SELECT * FROM users WHERE id = ?', [$user_id])->fetch();
            if($user){
                $expected = $user_id . '==' . $user->remember_token . sha1($user_id . 'ratonlaveurs');
                if($expected == $remember_token){
                    $this->connect($user);
                    setcookie('remember', $remember_token, time() + 60 * 60 * 24 * 7);
                } else{
                    setcookie('remember', null, -1);
                }
            }else{
                setcookie('remember', null, -1);
            }
        }
    }

    public function login($db, $username, $password, $remember = false){
        $user = $db->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();
        if(password_verify($password, $user->password)){
            $this->connect($user);
            if($remember){
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }

    public function remember($db, $user_id){
        $remember_token = Str::random(250);
        $db->query('UPDATE users SET remember_token = ? WHERE id = ?', [$remember_token, $user_id]);
        setcookie('remember', $user_id . '==' . $remember_token . sha1($user_id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);

    }

    public function logout(){
        setcookie('remember', NULL, -1);
        $this->session->delete('auth');
    }

    public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM users WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $db->query('UPDATE users SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);
            mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://local.dev/Lab/Comptes/reset.php?id={$user->id}&token=$reset_token");
            return $user;
        }
        return false;
    }

    public function checkResetToken($db, $user_id, $token){
        return $db->query('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)', [$user_id, $token])->fetch();
    }

}

J'ai regardé tous les commentaires des deux vidéos et personne ne parle ce cette erreur. Avez vous un idée?

Quelle version de PHP utilises-tu ?

Polo
Auteur

PHP version 5.4.45
J'ai également une erreur quand je rentre mes identifiants dans la page se connecté
Fatal error: Call to undefined function password_verify() in /home/xxxxxx/www/EM/class/Auth.php on line 82

  if(password_verify($password, $user->password)){

dans le même fichier

Polo
Auteur

Merci pour les liens que je garde précieusement, je n'avais penser à faire une recherche
Actuellement j'ai un fichier .ovhconfig avec ceci
app.engine=php
app.engine.version=5.4
http.firewall=none
environment=production
donc d'après le site d'OVH il faut que je remplace 5.4 par 5.6 car 5.5 est bientôt obsolète?

Polo
Auteur

J'ai passé ma version de PHP en 5.6, ça fonctionne, les donnés sont bien enregistré dans ma base de donnés, mais je ne reçois pas le mail de confirmation. Il me semble qu'il y a un lien à changer dans un fichier, je ne sais pas lequel, je vais regarder.
Merci beaucoup à tous pour votre, sans vous je n'y serais pas arrivé

Pas de soucis ;) Met ton sujet en résolu pour que ça puisse aider d'autre personnes ;)

Bonsoir,

J'ai modifier les champs adéquat pour que la connexion à la BDD s'établisse correctement et j'obtient des erreurs 500 lors du lancement d'une action sur n'importe quel page php que ce soit le register, forget....
Solution?

Je ne sais pas d'où cette erreur 500 peut venir, à noter que la connexion à la BDD à l'air opérationnel vu que lorsque je vais sur le register.php et que je renseigne une e-mail déjà utilisé, le formulaire me le précise. Dans le cas contraire je n'aurais pas eu cette réaction, donc le problème ne viens pas de là..

EDIT : Le problème viendrait peut-être de mon serveur...A voir

EDIT2 : Log d'erreur d'APACHE2 :
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'confirmation_token' in 'field list''

PHP te dis qu'il y a une erreur dans l'utilisation de PDO et PDO te dit que MySQL ne connait pas la colonne "confirmation_token"... Pour que ça s'affiche en front (si tu es en developpement) va dans ton fichier php.ini et passe dislpay_errors à On ;)

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'confirmation_token' in 'field list'' in /home/sites/xx-xx/www/class/Database.php:20 Stack trace: #0 /home/sites/xx-xx/www/class/Database.php(20): PDOStatement->execute(Array) #1 /home/sites/xx-xx/www/class/Auth.php(26): Database->query('INSERT INTO use...', Array) #2 /home/sites/xx-xx/www/register.php(24): Auth->register(Object(Database), 'User', 'mdp', 'xx.xx@hotmail.fr...') #3 {main} thrown in /home/sites/xx-xx/www/class/Database.php on line 20

C'est donc bien une erreur du script?
Je vois pas pourquoi il a besoin de cette colonne dans la table ? Surtout qu'elle n'est pas présente dans le fichier sql fournis par le script.

EDIT : http://www.grafikart.fr/forum/topics/17663

EDIT2 : Résolu, il manquait bien la colonne confirmation_token dans le fichier SQL fournis