본문 바로가기
개발/php

코드이그나이터4 - 단순 회원정보 수정 (4)

by wusdlqslek 2024. 3. 18.

이전 글에서 회원을 등록했으니 이번 글에서는 회원정보를 수정하는 기능을 구현해보자.

회원정보 수정은 로그인 성공 페이지에서 이동시키는 것으로 한다.

 

1. 먼저 로그인 성공 페이지에 회원정보 수정 화면으로 가는 링크를 만들자

<h2>Login Success!</h2>
<a href="member">멤버 페이지로 이동</a>
<a href="login/logout">Logout</a>

 

2. Member 관련된 처리를 할 컨트롤러를 만들어준다.

Controllers\Member.php

<?php
namespace App\Controllers;
use App\Models\UserModel;
class Member extends BaseController {
    public function index() {
        $session = session();
        $user_no = $session->get('user_no');
        
        // UserModel 인스턴스 생성
        $user_model = new UserModel();
        
        // user_no에 해당하는 사용자 정보 가져오기
        $user_info = $user_model->where('user_no', $user_no)->first();
        unset($user_info['user_pw']); // user_pw 필드 제거
        // 가져온 사용자 정보를 뷰에 전달
        return view('member/member', ['userInfo' => $user_info]);
    }
}

 

3. Routes.php를 수정해 Member 컨트롤러의 index 메소드를 찾도록 해준다.

$routes->get('member', 'Member::index', ['filter' => 'auth']);

 

4. Member 컨트롤러의 index 메소드가 호출하는 view를 작성한다.

연습을 위해 별다른 검증 없이 여기선 사용자 이름과 비밀번호를 수정할 수 있도록 한다.

보통 2차 인증 처리를 해준다.

<h1>인증 받은 사용자 페이지</h1>
<form method="POST" action="member_modify">
    <label for="user_name">이름:</label>
    <input type="text" id="user_name" name="user_name" value="<?= esc($userInfo['user_name']) ?>"><br>
    
    <label for="user_id">사용자 ID:</label>
    <input type="text" id="user_id" name="user_id" value="<?= esc($userInfo['user_id']) ?>" readonly><br>
    
    <label for="user_pw">비밀번호:</label>
    <input type="password" id="user_pw" name="user_pw" value=""><br>
    
    <input type="hidden" name="user_no" value="<?= esc($userInfo['user_no']) ?>">
    <button type="submit">수정하기</button>
</form>
<script>
document.addEventListener("DOMContentLoaded", function() {
    document.querySelector("form").addEventListener("submit", function(e) {
        // 필요한 모든 입력 필드 선택
        var userName = document.getElementById("user_name").value.trim();
        var userPw = document.getElementById("user_pw").value.trim();

        // 필드 검증
        if (!userName || !userPw) {
            e.preventDefault(); // 폼 제출 방지
            alert("모든 필드를 입력해주세요.");
            return false;
        }
    });
});
</script>

 

5. form으로 POST 전송의 목적지인 member_modify 메소드를 Member컨트롤러에 만들고, Routes에도 추가를 해주자.

수정이 완료되면 다시 회원정보 수정화면으로 돌려보내준다. 이때 변경된 값으로 돌려준다

Controllers\Member.php

<?php
namespace App\Controllers;
use App\Models\UserModel;
class Member extends BaseController {
    public function index() {
        $session = session();
        $user_no = $session->get('user_no');
        
        // UserModel 인스턴스 생성
        $user_model = new UserModel();
        
        // user_no에 해당하는 사용자 정보 가져오기
        $user_info = $user_model->where('user_no', $user_no)->first();
        
        // 가져온 사용자 정보를 뷰에 전달
        return view('member/member', ['userInfo' => $user_info]);
    }

    public function member_modify() {
        $session = session();
        $userNo = $session->get('user_no');
        
        // POST 데이터 검증
        $userName = $this->request->getPost('user_name');
        $userPw = $this->request->getPost('user_pw');

        if (!$userName || !$userPw) {
            return redirect()->back()->with('error', '모든 필드를 입력해주세요.');
        }

        // UserModel 인스턴스 생성
        $userModel = new UserModel();
        
        // 비밀번호 암호화
        $encryptedPassword = password_hash($userPw, PASSWORD_DEFAULT);

        // 데이터베이스 업데이트
        $userModel->update($userNo, [
            'user_name' => $userName,
            'user_pw' => $encryptedPassword
        ]);

        // 수정 성공 메시지와 함께 리다이렉트
        return redirect()->to('member')->with('success', '사용자 정보가 수정되었습니다.');
    }
}

Routes.php

//생략
$routes->post('member_modify', 'Member::member_modify', ['filter' => 'auth']);

 

6. 결과

참고로 비밀번호는 보안문제로 변경만 되고 노출되지 않게 했다

수정하기 누르기 전
수정하기 누른 후 새로고침해도 변경된 이름이 나옴

반응형

댓글