простая страница профиля для сайта о работе

0

Я сделал логин и регистрацию для своего сайта, и он работает нормально.

Теперь я просто хочу создать простую страницу профиля, где пользователь может увидеть все свои детали.

Я могу только вернуть имя пользователя, поэтому я не знаю, как получить остальную информацию.

Вот код для регистрации и входа в систему:

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>";
}
Теги:

4 ответа

0
Лучший ответ

Простой ответ заключается в замене вашего запроса в 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.

  • 0
    Вы потеряли меня в «После этого вы можете, перебирая возвращенные строки, обращаться к другим столбцам пользователя через переменную $ row. Так же, как вы получаете доступ к хешированному паролю пользователя с помощью $ row-> password, вы можете получить доступ к $ row -> contactNumber ", не могли бы вы привести пример или упростить его? благодарю вас!
0

Вы можете изменить SELECT чтобы вернуть другие значения, которые вы хотите сохранить, в переменные $_SESSION а затем получить к ним доступ с помощью $row->{variable}

Просто убедитесь, что вы заполняете $_SESSION после проверки пароля

0

Не отличается от вашего существующего кода - используйте переменную сеанса, заданную при входе пользователя в систему

$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;

    }
}
  • 0
    Я не очень понимаю, что вы сделали здесь XD
  • 0
    Предполагая, что пользователь успешно вошел в систему, и вы установили переменную сеанса username затем выберите его / ее данные из базы данных ... какой бит вы не понимаете?
Показать ещё 1 комментарий
0

$ _SESSION ['username'] = $ username; У вас есть имя пользователя в правом сеансе. Просто передайте это значение, где условие mysql. И получите всю запись из таблицы входа. Просто покажите, где бы вы ни хотели показывать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню