Создание профиля или личного кабинета пользователя на MVC, PHP и SQL


X

Создание профиля или личного кабинета пользователя на MVC, PHP и SQL

Сегодня мы будем делать профиль пользователя. Этот урок связан со статьями по созданию регистрации, авторизации и загрузке картинок на сервер, рекомендуем сначала изучить их. В профиле будет иметься возможность поменять аватар, пароль и логин пользователя.

Сначала нужно модернизировать нашу таблицу с пользователями до такого вида:

 

Добавились два новых поля – ava и role. Поле ava будет хранить название загруженной аватарки пользователя с расширением. Поле role будет содержать статус пользователя: 0 – пользователь, 1 – администратор, 2 – младший модератор, 3 – старший модератор.  Если пользователь не авторизирован, то он имеет статус гость.

 

Добавим маршруты в файл routes.php, он находится в папке config:

'user/profile' => 'user/profile',
'user/edit_password' => 'user/editPass',

 

Теперь создадим обработчик для страницы профиля, создавать его нужно в файле UserController.php, он находится в папке controllers. Сначала с помощью функции checkAdminId проверяем, авторизирован ли пользователь, если да, то в переменную id_user вернется его id. Далее с помощью функции getUserById, по id записанному в переменной id_user, получаем данные пользователя из таблицы БД и записываем их в п переменную user. Эти данные будут отображаться в полях формы.

 

Если на странице с формой нажали кнопку «Изменить», то методом POST получаем значение заполненных полей и проверяем, корректно ли введен логин пользователя и не занят ли он. Если да, то проверяем, выбрал ли пользователь аватар, если нет, то ему будет выставлен аватар по умолчанию. Затем будет выполнена функция editUserProfile, она изменит данные в таблице базы данных.

 

Если же аватар выбран в форме, то мы используем функцию editUserProfileImg. Функция выполнит загрузку нового аватара на сервер и изменит данные в таблице базы данных.

public function actionProfile() {
    $id_user = User::checkAdminId();
    $user = User::getUserById($id_user);
    $result = false;
    if (isset($_POST['submit'])) {
        $login = $_POST['login'];
        $old_img_url = $_POST['old_ava'];
        $img_url = $_FILES['ava']['name'];
        $tmp_name_img = $_FILES['ava']['tmp_name'];
        $errors = false;
        if (!User::checkName($login)) {
            $errors[] = 'Имя не должно быть короче 2-х символов'
        }
        $checkLogin = User::checkUserLogin($login);
        if ($checkLogin == true) $errors[] = 'Пользователь с таким Логином, уже зарегистрирован, введите другой Логин'
       
        if ($errors == false) {
            if ($img_url == null) {
                $img_url = 'defava.jpg';
                $result = User::editUserProfile($id_user, $login);
            }
            else $result = User::editUserProfileImg($id_user, $img_url, $tmp_name_img, $old_img_url);
            require_once(ROOT . '/views/user/profile.php');
            return true;
        }
    }
    require_once(ROOT . '/views/user/profile.php');
    return true;
}

 

Теперь опишем используемые функции, они будут находиться в папке models в файле News.php:

Функция editUserProfile.  Она соединяется с базой данных и производит обновление поля с логином пользователя.

public static function editUserProfile($id_user, $login)
{
    $db = Db::getConnection();
    $sql = "UPDATE users SET login = :login WHERE id = :id";
    $result = $db->prepare($sql);
    $result->bindParam(':id', $id_user, PDO::PARAM_STR);
    $result->bindParam(':login', $login, PDO::PARAM_STR);
    return $result->execute();
}

 

Функция editUserProfileImg. С помощью функции downloadAvatar загружает картинку на сервер и получает в переменную ava_url имя с расширением. Далее выполняет SQL запрос, который обновляет поле с аватаркой и логином пользователя:

public static function editUserProfileImg($id_user, $login, $img_url, $tmp_name_img, $old_img_url)
{
    $ava_url = self::downloadAvatar($old_img_url, $img_url, $tmp_name_img);
    $db = Db::getConnection();
    $sql = "UPDATE users ava SET ava = :ava, login = :login WHERE id = :id";
    $result = $db->prepare($sql);
    $result->bindParam(':ava', $ava_url, PDO::PARAM_STR);
    $result->bindParam(':login', $login, PDO::PARAM_STR);
    $result->bindParam(':id', $id_user, PDO::PARAM_INT);
    return $result->execute();
}

 

Функция downloadAvatar. Эта функция полностью идентична функции загрузки изображений на сервер, разница лишь в пути сохранения изображения:

public static function downloadAvatar($old_img_url, $img_url, $tmp_name_img)
{
    $img_url1 = Page::translitPhp($img_url);
    $path = 'template/avatars/'; // Путь к папке
    $file_type = substr($img_url1, strrpos($img_url1, '.')+1); // Получаем Расширение файла
    $pos = strpos($img_url1, ".");
    $fn = substr($img_url1, 0, $pos);
    $file_name = $fn;
    $img_url1=$file_name.(Page::getRandomFileName($path, $file_type)).'_avagoodnets.'.$file_type;
    if (move_uploaded_file($tmp_name_img, $path . $img_url1)) {
        $newFileName = $path . $img_url1;
        if (($file_type == 'png') || ($file_type == 'PNG')) {
            $src = imagecreatefrompng($newFileName);
            $ar = Page::changeSizeImg($newFileName, $src);
            $dest = $ar[0];
            imagepng($dest, $newFileName, 0);
            imagedestroy($dest);
        }
        if (($file_type == 'jpg') || ($file_type == 'JPG') || ($file_type == 'jpeg') || ($file_type == 'JPEG')) {
            $src = imagecreatefromjpeg($newFileName);
            $ar = Page::changeSizeImg($newFileName, $src);
            $dest = $ar[0];
            imagejpeg($dest, $newFileName, 100);
            imagedestroy($dest);
        }
    }
    return $img_url1;
}

 

Функция checkAdminId проверяет, авторизирован ли пользователь, путем проверки существования переменной сессии user. Если переменная существует, то возвращаем значение этой переменной, иначе делаем редирект на страницу авторизации:

public static function checkAdminId()
{
    if (isset($_SESSION['user'])) {
        return $_SESSION['user'];
    }
    header("Location: /user/login");
}

 

Функция getIserById получает данные пользователя из базы данных, по полученному id:

public static function getUserById($id)
{
    $db = Db::getConnection();
    $sql = 'SELECT * FROM users WHERE id = :id';
    $result = $db->prepare($sql);
    $result->bindParam(':id', $id, PDO::PARAM_INT);
    $result->setFetchMode(PDO::FETCH_ASSOC);
    $result->execute();
    return $result->fetch();
}

 

Создадим страницу с формой профиля. Если пользователь гость, то показываем ему сообщение, что он не авторизирован. Далее идет обычная страница с выводом ошибок и проставлением данных пользователя в поля.

<?php if (User::isGuest()): ?><!--Если пользователь гость то мы показываем ему кнопку входа а иначе каб.-->
<a href="/user/login/"> Вы не авторизированны Вход</a>
<?php else: ?>
<html>
<head>
    <title></title>
</head>
<body>
    <div class="page-content">
        <div class="content-block">
            <div class="page-views">
                <h1>Профиль</h1>
                <div style="color: green; font-size: 18px; display: block; width:400px;">
                <?php if ($result): ?>
                    <p>Данные отредактированы! <a href="/user/profile">Вернуться в профиль</a></p>
                <?php else: ?>
                </div>
                <div style="color: red; font-size: 18px; display: block; width:400px;">
                    <?php if (isset($errors) && is_array($errors)): ?>
                        <ul>
                            <?php foreach ($errors as $error): ?>
                                <li> - <?php echo $error; ?></li>
                            <?php endforeach; ?>
                        </ul><br>
                    <?php endif; ?>
                </div>
                <form method="post" action="#" enctype="multipart/form-data" style="width:100%; ">
                    <input type="hidden" name="old_ava" value="<?php echo $user['ava']; ?>">
                    <? if ($user['ava'] == '') { ?>
                        <img src="../../template/avatars/defava.jpg" width="200" class="img-c-tree">
                    <? } else { ?>
                        <img src="../../template/avatars/<?php echo $user['ava']; ?>" width="200" class="img-c-tree">
                    <?}?>
                    <br><br>
                    <label>Загрузить изображение профиля (аватар) <br>
                        Картинку для аватара страйтесь выберать, с одниковой высотой и шириной (128*128, 256*256, 512*512, 1024*1024)<br><br>
                        <input name="ava" type="file" multiple accept="image/*"></label><br><br>
                    <lable>Логин<input type="text" name="login" value="<? echo trim($user['login']); ?> "></lable><br><br><br><br>
                    <lable>E-mail<input type="email" value="<? echo trim($user['email']);?> " disabled></lable><br><br><br><br>
                    <lable>Пароль
                    <span style="background: #f1f1f1; #6f9ecc; padding: 7px 10px 7px 10px; width:98%; border: 1px solid #ccc; display: block;">Ваш пароль <b>зашифрован</b>, вы можете его изменить только с помощью <a href="/user/edit_password">формы смены пароля</a>. &nbsp;</span>
                    </lable><br>
                    <lable>Ваш статус &nbsp;&nbsp;&nbsp; <input type="text" name="st" size="30" value="<?
                        if ($user['role'] == '0') { echo 'Пользователь';}
                        elseif ($user['role'] == '1') { echo 'Администратор'; }
                        elseif ($user['role'] == '2') { echo 'Младший модератор'; }
                        elseif ($user['role'] == '3') { echo 'Старший модератор'; }
                        ?> " disabled></lable><br><br><br><br>
                        <?php endif; ?>
                    <input type="submit" name="submit" class="btn btn-default" value="Изменить" style="width: 17%;" /><br><br><br><br>
                </form>
            </div>
        </div>
    </div>
</body>
</html>
<?php endif; ?>

 

Полям e-mail и статус отключаем редактирование, они содержат информационный характер. После нажатия кнопки изменить, страница будет перезагружена и если данные успешно отредактированы, то показываем пользователю сообщение об этом.

В браузере эта форма будет выглядеть следующим образом:

 

Так как наши пароли зашифрованы, да и просто для удобства, создаем форму смены пароля. Создаем ее обработчик в NewsController.php:

public function actionEditPass() {
    $id_user = User::checkAdminId();
    $result = false;
    if (isset($_POST['submit'])) {
        $password = $_POST['password'];
        $password2 = $_POST['password2'];
        $errors = false;
        if (!$password == $password2) {
            $errors[] = 'Пароли не совпадают';
        }
        if (!User::checkPassword($password)) {
            $errors[] = 'Пароль не должен быть короче 6-ти символов';
        }
        if ($errors == false) {
            $hash_password = User::generateHash($password);
            $result = User::editPassword($id_user,$hash_password);
            require_once(ROOT . '/views/user/profile.php');
            return true;
        }
    }
    require_once(ROOT . '/views/user/edit_password.php');
    return true;
}

 

В обработчике мы получили введенные в форму пароли, сравнили, равны ли введенные пароли и проверили, чтобы пароль был не короче шести символов. Далее если ошибок нет, то мы используем функцию generateHash, которая шифрует пароль (эта функция была разобрана в статье по созданию регистрации). Затем с помощью функции editPassword (была рассмотрена в этой статье) меняем пароль в таблице базы данных на новый. Форма страницы редактирования пароля будет реализована так:

<?php if (User::isGuest()): ?>
<a href="/user/login/"> Вы не авторизированны Вход</a>
<?php else: ?>
<html>
<head>
<titile></titile>
</head>
<body>
<div class="page-content">
    <div class="content-block">
        <div style="color: red; font-size: 14px; padding: 20px; margin: 0 auto; display: block; width:400px;">
        <?php if (isset($errors) && is_array($errors)): ?>
            <ul>
                <?php foreach ($errors as $error): ?>
                    <li> - <?php echo $error; ?></li>
                <?php endforeach; ?>
            </ul>
        <?php endif; ?>
        </div>
        <form action="#" method="post" style="display: block; width: 400px; margin: 0 auto; background: #f2f1f0; padding: 20px; color:#555; text-align: center;">
            <center><h2>Форма смены пароля</h2></center><br>
            <input type="text" name="password" placeholder="Введите новый пароль" value=""/><br><br><br>
            <input type="text" name="password2" placeholder="Введите еще раз" value=""/><br><br><br>
            <input type="submit" name="submit" class="btn btn-default" value="Изменить пароль" /><br><br>
        </form>
    </div>
</div>
</body>
</html>
<?php endif; ?>

 

В браузере она будет отображаться следующим образом:

В итоге мы получаем профиль пользователя с возможностью смены логина и аватара. Чтобы не создавать функцию downloadAvatar, можно хранить аватарки вместе с загруженными картинками, а это не очень удобно. Лучше сделать проверку какого-то параметра в функции downloadImg и относительно него выбирать путь, по которому будем сохранять аватарку.

 

Смотрите также дополнительные статьи про MVC

 

 

 

 

Grai Просмотров сегодня +18 29 июня 2017 команда сайта
Комментарии ( 2 )
Валерий
Хорошая статья для начинающих.
05.11.2018
Serhio
А можно структуру файлов и папок? Мне непонятно куда добавлять формы. А лучше дайте исходник,посотреть что и как. Просто у меня белый экран и все.
05.11.2018
Оставить комментарий
   🔔 Отдохните не много, может Вам будет интересно прочитать статьи пользователей нашего сайта.

Тег area - это область ссылки

Как разрезать изображение на части и склеить обратно из фрагментов, используя PHP и Ajax

Как узнать ID последней вставленной записи

Тег abbr - это аббревиатура

Тег address - это обозначения контактной информации автора

Тег datalist - это список возможных вариантов

Безопасная авторизация пользователей на MVC и PHP

Создание профиля или личного кабинета пользователя на MVC, PHP и SQL

Как на MVC и PHP создать систему восстановления доступа с отправкой пароля на адрес электронной почты

Тег b - это полужирный шрифт

Тег article - это статья

Как сделать добавление новостей на сайте при помощи MVC и PHP

Создание сайтов и мобильных приложений от 5 500 руб. Любой сложности!
Реклама Собственный фреймворк. Большие и сложные проекты. ТОП 100 разработчиков РФ.
Создание сайтов от 5 500 руб.
Мобильные приложения от 50 000 руб.
irogex.ru
Наши проекты Инстаграм от 6 500 руб.
Конструкторы Ugears купить в Иркутске от 690 руб. с Доставкой!
Реклама UGEARS это путешествие в удивительную атмосферу гармонии природы и совершенства конструкторской мысли
Конструктор Навигатор дат - 690 руб.
Конструктор Комбайн - 2990 руб.
ugears-irk.ru
Оплата и Доставка Контакты
Стоматология в Улан-Удэ | ДентаВита | Шок цены от 100 руб!
Реклама От всей нашей семьи хотим выразить огромную благодарность стоматологической клинике
Осмотр, консультация от 150 руб.
Рентгеновский снимок от 100 руб.
dentavita03.ru
Наши цены Отзывы
Реклама помогает поддерживать
и развивать наш сервис.


Подробнее
(ссылка откроется в новой вкладке)
  Реклама