2014-07-18 3 views
1

J'essaie d'ajouter la possibilité pour les utilisateurs de récupérer leur nom d'utilisateur et/ou leur mot de passe pour les didacticiels de login/inscription de phpacademy. J'ai commencé mais je ne sais pas comment continuer. Le code que j'ai est basé sur les anciens didacticiels de connexion/enregistrement de phpacademy.Récupérer un nom d'utilisateur/mot de passe

Voici le code: recover.php:

<?php 
require_once 'core/init.php'; 
$user = new User(); 
if ($user->isLoggedIn()) { 
    Redirect::to('index.php'); 
} 

if (isset($_GET['success']) === true && empty($_GET['success']) === true) { 
?> 
    <p>We've emailed you</p> 
<?php 
} else { 

    $mode_allowed = array('username', 'password'); 

    if (isset($_GET['mode']) === true && in_array($_GET['mode'], $mode_allowed) === true) { 
     if (isset($_POST['email']) === true && empty($_POST['email']) === false) { 
      $email = Input::get('email'); 
      if ($user->emailExists($email) === true) { 
       $user->recover($_GET['mode'], $email); 
       Redirect::to('recover.php?success'); 
      } else { 
       //Your custom error saying that that email does not exist 
       echo 'That email does not exist'; 
      } 
     } 
    ?> 
     <form action="" method="post"> 
      <ul> 
       <li> 
        Please enter your email address:<br> 
        <input type="text" name="email" placeholder="Enter Email"> 
       </li> 
       <li><input type="submit" class="sub-btn tx-shadow" value="Recover"></li> 
      </ul> 
     </form> 

    <?php 
    } else { 
     Redirect::to('index.php'); 
    } 
} 

Les classes que j'ai dans User.php:

public function emailExists($email){ 
    $sql = "SELECT * 
      FROM `users` 
      WHERE `email` = ? 
    "; 
    $result = $this->_db->query($sql, array($email)); 
    //return $result->count() === 1; 

    // Above is the same as this: 
    //return ($result->count() === 1) ? true : false; 

    // Or this: 
    if($result->count() === 0){ 
     return false; 
    } else { 
     return true; 
    } 
} 
public function recover($mode, $email) { 

    //Get data of user 
    $user_data = $this->getUserByEmail($email); 
    // Email User 

    if ($mode == 'username') { 
     $this->sendActivation($email, 'Your Username', 'Hello'.$user_data['first_name']. '\n\nYour username is: '.$user_data['username'].'\n\nThank you\nBusarna'); 
    } else if ($mode == 'password') { 
     $generated_password = substr(sha1(rand(999, 999999)), 0, 10); 
     //update password 
    } 
} 

public function getUserByEmail($email) { 
    $sql = "SELECT * 
      FROM `users` 
      WHERE `email` = ? 
      " 

    $result = $this->_db->query($sql, array($email)); 
    //return $result; 
} 

Le travail de fonction emailExists. Les problèmes que j'ai est que je ne sais pas comment obtenir toutes les informations d'un utilisateur à l'aide de leur e-mail et stocker les informations pour les utiliser comme ceci:

$this->sendActivation($email, 'Your Username', 'Hello'.$user_data['first_name']. '\n\nYour username is: '.$user_data['username'].'\n\nThank you\nBusarna'); 

J'ai une classe au-dessus pour elle mais je ne Je ne sais pas comment le changer pour le faire fonctionner (getUserByEmail). Aussi, je ne sais pas si le moyen ci-dessus est un bon moyen de générer un mot de passe (non haché, il sera haché quand on le met dans la db), je ne sais pas comment mettre à jour le mot de passe et forcer les utilisateurs à le changer sur la prochaine connexion.

En ce moment je reçois cette erreur si je vais à recover.php: Erreur d'analyse: erreur de syntaxe, inattendu '$ result' (T_VARIABLE) dans D: \ Program \ xampp \ htdocs \ website \ classes \ User.php sur la ligne 225 Ceci est cette ligne:

$result = $this->_db->query($sql, array($email)); 

Si vous les gars ont besoin rien d'autre laissez-moi savoir.

classe DB.php:

public static function getInstance() { 
    if(!isset(self::$_instance)) { 
     self::$_instance = new DB(); 
    } 
    return self::$_instance; 
} 

public function query($sql, $params = array()) { 
    $this->_error = false; 
    if($this->_query = $this->_pdo->prepare($sql)) { 
     $x = 1; 
     if(count($params)) { 
      foreach ($params as $param) { 
       $this->_query->bindValue($x, $param); 
       $x++; 
      } 
     } 

     if ($this->_query->execute()) { 
      $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
      $this->_count = $this->_query->rowCount(); 
     } else { 
      $this->_error = true; 
     } 
    } 

    return $this; 
} 

var_dump (user_data de $);

objet (DB) # 3 (5) {["_pdo": "DB": privé] => objet (PDO) # 4 (0) {} ["_query": "DB": private] = > object (PDOStatement) # 7 (1) {["queryString"] => chaîne (55) "SELECT * FROM users O WH email =?"} ["_error": "DB": private] => bool (false) ["_results": "DB": privé] => objet (stdClass) # 5 (18) {["id"] => string (2) "28" ["username"] => string (8) "Busarna4 "[" mot de passe "] => string (128) "3759d763d01ee1259d8f4a74914335be4e3e06622d8ffc455789cbd8c46b5800d1892794cde2de1b0f6a1cf8e1effc642877b7937b7c0deaf9036e558474eb5c"[" sel "] => string (100)" Àw¶10 $ ê! º L-kò « Ö §òŸÔK * {áëRÌÕÆé³X ï« aA * Ú ™ ü²ÅK§þ3 hõHï¬Å + c|kºá`³Trë_ßÙáû, ð¡_Ë <Žz0 "[" email "] => chaîne (20)" [email protected] "[" email_code "] => chaîne (32)" ae3e9ad790297c627a656157d5306d1e "[" k1 "] => chaîne (64)" 42a86fe29289c83a8d91a990e49b62c3866192c983e510 70df0c63697020b5ce »[ "k2"] => string (64) "d7827e522bbbdadfd14afd2edbae18d5a6f3c39a490154c178b2eec240d7b576"[ "k3"] => string (64) "8051c951f1ec043d5297765adddd760e1f8506d1785dfdb55dabe564b6326b86"[ "first_name"] => string (0) ""[ "last_name"] => string (0) "" ["gender"] => string (4) "Homme" ["profile"] => string (0) "" ["avatar"] => string (30) "images/default-Male -Avatar.png "[" lastlogin "] => chaîne (19)" 0000-00-00 00:00:00 "[" joined "] => chaîne (19)" 2014-06-22 21:22:36 "[" group "] => string (1)" 1 "[" activated "] => chaîne (1)" 1 "} [" _count ":" DB ": private] => int (1)}

Est-ce que quelqu'un sait comment faire cela? Toute aide appréciée.

Merci à l'avance,

Busarna

+0

Uncomment '// retour de result' $ dans votre getUserByEmail() fonction. – Gudgip

+0

J'ai remarqué que j'ai une erreur à cause de cette classe. J'ai ajouté l'erreur à la question. Et décommenter cela ne fait rien en raison de cette erreur @Gudgip – Busarna4

+0

mettre un ';' sur la fin de la ligne 224. – Gudgip

Répondre

2

Problème:

Dans votre fonction query() vous utilisé fetchAll qui retourne un tableau à deux dimensions, même si vous obtenez un seul enregistrement.

Solution:

  1. Utilisez fetch() plutôt pour seul enregistrement.

changer la fonction:

public function query_single($sql, $params = array()) { 
    $this->_error = false; 
    if($this->_query = $this->_pdo->prepare($sql)) { 
     $x = 1; 
     if(count($params)) { 
      foreach ($params as $param) { 
       $this->_query->bindValue($x, $param); 
       $x++; 
      } 
     } 

     if ($this->_query->execute()) { 
      $this->_results = $this->_query->fetch(PDO::FETCH_ASSOC:); 
      $this->_count = $this->_query->rowCount(); 
     } else { 
      $this->_error = true; 
     } 
    } 

    return $this->_results; 
} 

puis changer l'autre fonction à

public function getUserByEmail($email) { 
    $sql = "SELECT * 
      FROM `users` 
      WHERE `email` = ? 
      "; 

    $result = $this->_db->query_single($sql, array($email)); 

    return $result; 
} 

enfin

$this->sendActivation($email, 
         'Your Username', 
         'Hello'.$user_data['username'] 
         .'\n\nYour username is: '.$user_data['username'] 
         .'\n\nThank you\nBusarna'); 
+0

Je l'ai fait mais je reçois ceci: Erreur fatale: Impossible d'utiliser l'objet de type DB en tant que tableau dans D: \ Program \ xampp \ htdocs \ website \ classes \ User.php à la ligne 212. Voici la ligne: $ this-> sendActivation ($ email, 'Votre nom d'utilisateur', 'Bonjour'. $ user_data [0] ['first_name']. '\ n \ nVotre nom d'utilisateur est:'. $ user_data [0] ['nom d'utilisateur'].'\ n \ nMerci \ nBusarna'); @meda – Busarna4

+0

Veuillez montrer var_dump ($ user_data); Nous l'aurons trié – meda

+0

Je l'ai ajouté à la question car il était trop long pour un commentaire @meda – Busarna4

3
public function getUserByEmail($email) { 
    $sql = "SELECT * 
      FROM `users` 
      WHERE `email` = ? 
      "; 
    //  ^------------------------- missing semicolon 

    $result = $this->_db->query($sql, array($email)); 

    // Don't forget to return the result: 
    return $result; 
} 

unexpected '$result' moyens, il voit $ résultat, mais il ne s'attend quelque chose dans la ligne avant $ result. La commande avant la ligne avec $ result n'est pas terminée.

+0

J'ai ajouté cela maintenant. C'était une faute de frappe. Comment puis-je tout enregistrer pour que je puisse faire quelque chose comme $ user_data ['first_name'] pour obtenir le prénom dans un email? @DanFromGermany – Busarna4

+0

@DanFromGermany Avez-vous simplement copié ceci à partir de mon commentaire? :-) – Gudgip

+0

Vous le récupérez d'où il est stocké et le concattez avec les chaînes de la fonction mail, comme vous l'avez fait. – DanFromGermany

Questions connexes