2015-06-17 2 views
0

Я пытаюсь изучить PHP и настроить веб-сайт, основанный на доступе пользователей. Наконец, я нашел шаблон, который в основном прост в использовании и реализации. Однако после нескольких часов попыток изменить шаблон я должен просить помощи.Помощь для начинающих: PHP MySQL (PDO) Функция

Следующий код отлично работает, и я изменил исходный шаблон, чтобы иметь возможность входа в систему, используя адрес электронной почты как имя пользователя и сохраненный пароль из базы данных. Исходный шаблон был основан на имени пользователя, а не на адресе электронной почты. То, что я пытаюсь достичь, состоит в том, чтобы каким-то образом также включить поле «имя пользователя» из той же базы данных и таблицы и сохранить его как параметр $ username для использования в другом месте на сайте, например, с помощью «echo». Я бы хотел использовать поле, но для имени зарегистрированного участника, а не для имени пользователя для входа.

Я уверен, что есть простой способ, но что бы я ни изменил, я продолжаю получать сообщения об ошибках, и я просто пока что не понимаю синтаксиса.

<?php 
include('password.php'); 
class User extends Password{ 
private $_db; 
function __construct($db){ 
    parent::__construct(); 

    $this->_db = $db; 
} 
private function get_user_hash($email){ 
    try { 
     $stmt = $this->_db->prepare('SELECT password FROM members WHERE email = :email AND active="Yes"'); 
     $stmt->execute(array('email' => $email)); 
     $row = $stmt->fetch(); 
     return $row['password']; 

    } catch(PDOException $e) { 
     echo '<p class="bg-danger">'.$e->getMessage().'</p>'; 
    } 
} 

public function login($email,$password){ 
    $hashed = $this->get_user_hash($email); 

    if($this->password_verify($password,$hashed) == 1){ 

     $_SESSION['loggedin'] = true; 
     return true; 
    } 
} 

public function logout(){ 
    session_destroy(); 
} 
public function is_logged_in(){ 
    if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){ 
     return true; 
     }  
    } 

} 
?> 
+0

Добро пожаловать в Stackoverflow! Я хотел бы попросить несколько вещей. 1. В будущем вы не могли бы поместить такие вещи, как: «Помощь для начинающих» в названии? 2. Можете ли вы уточнить ошибки, которые вы получаете, когда говорите такие вещи, как: * Я продолжаю получать сообщения об ошибках *? Спасибо. – Loko

+0

Приносим извинения за это и будем держать это в виду для будущих сообщений. – Mike

ответ

0

Вам просто нужно немного расширить код.

на момент вашего запроса выдается только поле 1, пароль.

SELECT * FROM members WHERE email = :email AND active="Yes" 

это будет возвращать всю строку, а не только одно поле.

вы можете извлечь имя пользователя и поместить его в переменной сессии, как это:

$_SESSION['username'] = $row['username']; 

, которые затем можно использовать в течение остальной части сайта. Убедитесь, что у вас есть session_start(); в начале всех файлов, которые вам нужны для доступа к сеансу. Если вы хотите использовать другие поля, просто измените этот параметр на 'firstName' или 'fullName' или на любые поля, которые вызывается.

как немного лишний, вы также можете расширить свой запрос, чтобы пользователь мог войти в систему со своей электронной почтой или своим именем пользователя, добавив это.

SELECT * FROM members WHERE (email = :email OR username = :email) AND active="Yes" 

, если вы собираетесь сделать это, Id предлагает изменения :email держателя на что-то более разумное, как :user так, что она имеет больше смысла читать код.

редактировать

your'e будет необходимо получить get_user_hash() функцию, чтобы вернуться $row в полном объеме, а затем добавить сеанс вар оттуда. Это немного назад, потому что это, вероятно, не лучший сценарий входа, который я когда-либо видел.

в get_user_hash(), изменить

return $row['password']; 

в

return $row; 

, а затем в функции входа,

public function login($email,$password){ 
    $row = $this->get_user_hash($email); 
    $hashed = $row['password']; 

    if($this->password_verify($password,$hashed) == 1){ 
     $_SESSION['username'] = $row['username']; 
     $_SESSION['loggedin'] = true; 
     return true; 
    } 
} 

действительно, $hashed не более чем пароль пользователей, которые password_verify() использует для сравните зашифрованный пароль в db.

+0

Большое спасибо за ваш ответ. Однако я не могу заставить его работать, и я думаю, что проблема в том, что я не знаю, где положить: $ _SESSION ['username'] = $ row ['username']; – Mike

+0

обновленный ответ. дайте это. Пожалуйста, примите ответ, если он вам полезен. и удачи. – DevDonkey

+0

Замечательно, большое спасибо за вашу помощь и быстрый ответ. Надеюсь, что когда-нибудь я смогу протянуть руку помощи и в этой области. – Mike

Смежные вопросы