Я сделал логин и регистрацию для своего сайта, и он работает нормально.
Теперь я просто хочу создать простую страницу профиля, где пользователь может увидеть все свои детали.
Я могу только вернуть имя пользователя, поэтому я не знаю, как получить остальную информацию.
Вот код для регистрации и входа в систему:
function selectUser($conn, $username, $password)
{
$query = "SELECT password FROM login WHERE username = :username";
$stmt = $conn->prepare($query);
$stmt->bindValue(':username', $username);
$stmt->execute();
if ($row = $stmt->fetch(PDO::FETCH_OBJ))
{
if (md5($password) == $row->password)
{
$_SESSION['username'] = $username;
//$_SESSION['password'] = $password; DO NOT DO THIS
echo "Welcome, you are now logged in as " . $username;
return true;
}
return false;
} else {
//echo "Your details were not found";
return false;
}
}
function selectNew($conn, $name, $username, $password, $contact, $occupation, $role, $picture)
{
$query = "INSERT INTO login VALUES (NULL, :name, :username, :password, :contactNumber, :occupation, :role, :pic)";
$stmt = $conn->prepare($query);
$stmt->bindValue(':name', $name);
$stmt->bindValue(':username', $username);
$stmt->bindValue(':password', $password);
$stmt->bindValue(':contactNumber', $contact);
$stmt->bindValue(':occupation', $occupation);
$stmt->bindValue(':role', $role);
$stmt->bindValue(':pic', $picture);
$affected_rows = $stmt->execute();
if ($affected_rows == 1)
{
return true;
} else {
return false;
}
}
Не волнуйтесь, пароль был хэширован.
вот что я пробовал:
function selectUser($conn, $username, $password)
{
$query = "SELECT * FROM login WHERE username = :username";
$stmt = $conn->prepare($query);
$stmt->bindValue(':username', $username);
$stmt->execute();
$row = $stmt->fetch();
echo $row['occupation'];
echo $row['role'];
}
Вторая попытка:
if(isset($_SESSION["username"]))
{
echo "Welcome, you are now logged in as <b>".$_SESSION['username']."</b> <img class='clientView' src='images/loginIcon.png' alt='client'>"; }
else {
echo "You are currently not logged in";
}
$user = $_SESSION["username"];
$query = "SELECT * FROM login WHERE username = :username";
$term = $conn->prepare($query);
$term->bindValue(':username', $user);
$term->execute();
if ($username = $term->fetch(PDO::FETCH_OBJ))
{
echo "<li><h3>" . $user->username ." ". $user->user_ID . "</h3></li>";
}
Простой ответ заключается в замене вашего запроса в selectUser(...)
с помощью SELECT * FROM login WHERE username = :username
. Обратите внимание на *
после команды SELECT
, которая функционирует как дикая карта и, следовательно, запрашивает каждый столбец каждой найденной строки (а не только столбец password
о котором вы сейчас просите.
Затем вы могли бы, когда вы перебираете возвращаемые строки, обращаться к другим столбцам пользователя через переменную $row
. Так же, как вы $row->password
доступ к пользовательскому хэшированию пароля с паролем $row->password
, вы можете получить доступ к $row->contactNumber
.
Заметка о хорошей практике:
В зависимости от случая я бы не рекомендовал делать команду подстановки (*
) SELECT
при входе в систему. Фактически, я бы рекомендовал просто хэшировать пароль перед запросом и попытаться затем квалифицировать ваш запрос с помощью WHERE username = :username AND password = :password
(очевидно, привязать хешированный пароль к :password
). Вместо запроса столбца паролей или подстановочных столбцов вы можете SELECT
уникальный идентификатор строки.
Таким образом, вам даже не нужно перебирать возвращаемые строки вообще... вам нужно только убедиться, что какая-либо строка вернулась (см. Num_rows), чтобы узнать, может ли пользователь успешно войти в систему. Затем вы можете кэшировать уникальный идентификатор возвращаемой строки в свой сеанс, а затем выполнять последующие запросы по мере необходимости для других частей информации... например, роли пользователя или номера контакта. Это эффективно усложняет всю обработку ваших запросов от линейного времени до постоянного времени... незначительное, но все же нетривиальное, улучшение для приложения.
Кроме того, как слово предупреждения, эта система входа очень проста и легко подделана. Сессии PHP предоставляют некоторую безопасность, но они не являются полноправными. Сниффер, зацепляющий cookie сеанса, позволит им войти в систему как пользователь, с которого они его нюхали. Я бы порекомендовал вам заглядывать в свой собственный уровень сеанса, как только вы воспользуетесь остальной частью своей системы входа. И абсолютно использовать SSL.
Заметка об оптимизации:
Использование подстановочного знака (*
) в команде SELECT
самом деле является основным местом для узкого места скорости. Если вы точно знаете, какие столбцы вы хотите получить из базы данных, лучше всего их просить. Например, вместо *
вы можете делать password,occupation,role
.
Вы можете изменить SELECT
чтобы вернуть другие значения, которые вы хотите сохранить, в переменные $_SESSION
а затем получить к ним доступ с помощью $row->{variable}
Просто убедитесь, что вы заполняете $_SESSION
после проверки пароля
Не отличается от вашего существующего кода - используйте переменную сеанса, заданную при входе пользователя в систему
$username=!empty( $_SESSION['username'] ) ? $_SESSION['username'] : false;
$sql='select * from 'login' where 'username'=:username;';
$stmt=$conn->prepare( $sql );
if( $stmt && $username ){
$stmt->bindValue(':username',$username);
$result=$stmt->execute();
if( $result ){
$rs=$stmt->fetchAll( PDO::FETCH_OBJ );
/* display results from $rs */
/*
There should most likely only be one record!!
*/
$row=$rs[0];
foreach( $row as $column => $value )echo $column.' '.$value;
}
}
username
затем выберите его / ее данные из базы данных ... какой бит вы не понимаете?
$ _SESSION ['username'] = $ username; У вас есть имя пользователя в правом сеансе. Просто передайте это значение, где условие mysql. И получите всю запись из таблицы входа. Просто покажите, где бы вы ни хотели показывать.