diff --git a/config/member.php b/config/member.php index bf2c54f..c334ea9 100644 --- a/config/member.php +++ b/config/member.php @@ -20,6 +20,11 @@ class Member { return $stmt->rowCount() ? true : false; } + // 이메일 형식 체크 + public function email_format_check($email) { + return filter_var($email, FILTER_VALIDATE_EMAIL); + } + public function email_exists($email) { $sql = "SELECT * FROM member WHERE email=:email"; $stmt = $this->conn->prepare($sql); diff --git a/js/member_input.js b/js/member_input.js index b12bb47..5c1c1d7 100644 --- a/js/member_input.js +++ b/js/member_input.js @@ -78,71 +78,91 @@ document.addEventListener("DOMContentLoaded", () => { } else if (data.result == 'empty_id') { alert('이메일이 입력되지 않았습니다.') f_email.focus() + } else if(data.result == 'email_format_wrong') { + alert('이메일 형식이 맞지 않습니다.') + f_email.focus() } } } }) +// 비밀번호 규칙 검사용 정규식 +// - 최소 8자 +// - 소문자 1개 이상 +// - 대문자 1개 이상 +// - 숫자 1개 이상 +// - 특수문자 1개 이상 +const passwordRule = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/; - // 가입 버튼 클릭 시 비밀번호 일치 체크 - const btn_submit = document.querySelector("#btn_submit") - btn_submit.addEventListener("click", () => { - const f = document.input_form - if (f.id.value == '') { - alert('아이디를 입력해 주세요.') - f.id.focus() - return false - } - // 아이디 중복 체크 여부 - if (f.id_chk.value == 0) { - alert('아이디 중복확인이 필요합니다.') - return false - } - // 비밀번호 입력 여부 - if (f.password.value == '') { - alert('비밀번호를 입력하세요.') - f.password.focus() - return false - } - if (f.password2.value == '') { - alert('비밀번호 확인이 필요합니다.') - f.password2.focus() - return false - } +// 가입 버튼 클릭 시 비밀번호 일치 체크 +const btn_submit = document.querySelector("#btn_submit"); +btn_submit.addEventListener("click", () => { + const f = document.input_form; - // 비밀번호 일치 여부 - if (f.password.value != f.password2.value) { - alert('비밀번호가 일치하지 않습니다.') - //f.password.value = '' - f.password2.value = '' - f.password2.focus() - return false - } + if (f.id.value.trim() === '') { + alert('아이디를 입력해 주세요.'); + f.id.focus(); + return false; + } - // 이름 등록 여부 - if (f.name.value == '') { - alert('이름을 입력해 주세요.') - f.name.focus() - return false - } + // 아이디 중복 체크 여부 + if (f.id_chk.value === "0") { + alert('아이디 중복확인이 필요합니다.'); + return false; + } - // 이메일 등록 여부 - if (f.email.value == '') { - alert('이메일을 입력해 주세요') - f.email.focus() - return false - } + // 비밀번호 입력 여부 + if (f.password.value === '') { + alert('비밀번호를 입력하세요.'); + f.password.focus(); + return false; + } + if (f.password2.value === '') { + alert('비밀번호 확인이 필요합니다.'); + f.password2.focus(); + return false; + } - // 이메일 중복 체크 여부 - if(f.email_chk.value == 0) { - alert('이메일 중복확인이 필요합니다.') - return false - } + // ★ 비밀번호 규칙 검사 추가 (여기) + if (!passwordRule.test(f.password.value)) { + alert('비밀번호는 8자 이상이며, 대문자/소문자/숫자/특수문자를 모두 포함해야 합니다.'); + f.password.focus(); + return false; + } - f.submit() + // 비밀번호 일치 여부 + if (f.password.value !== f.password2.value) { + alert('비밀번호가 일치하지 않습니다.'); + // f.password.value = ''; + f.password2.value = ''; + f.password2.focus(); + return false; + } + + // 이름 등록 여부 + if (f.name.value.trim() === '') { + alert('이름을 입력해 주세요.'); + f.name.focus(); + return false; + } + + // 이메일 등록 여부 + if (f.email.value.trim() === '') { + alert('이메일을 입력해 주세요'); + f.email.focus(); + return false; + } + + // 이메일 중복 체크 여부 + if (f.email_chk.value === "0") { + alert('이메일 중복확인이 필요합니다.'); + return false; + } + + f.submit(); +}); - }) // 우편번호 찾기 diff --git a/member_input.php b/member_input.php index c04810b..27c472c 100644 --- a/member_input.php +++ b/member_input.php @@ -29,7 +29,7 @@ include 'header.php';
- +
@@ -48,14 +48,14 @@ include 'header.php';
- +
- +
@@ -71,11 +71,11 @@ include 'header.php';
- +
- +
diff --git a/pg/member_process.php b/pg/member_process.php index dacff11..7ad7b4a 100644 --- a/pg/member_process.php +++ b/pg/member_process.php @@ -1,68 +1,171 @@ 'empty_id'])); } + if ($mem->id_exists($id)) { die(json_encode(['result' => 'fail'])); } else { die(json_encode(['result' => 'success'])); } - // 이메일 중복 체크 -} else if ($mode == 'email_chk') { - if ($email == '') { + +// ====================== +// 2. 이메일 중복 체크 (AJAX) +// ====================== +} else if ($mode === 'email_chk') { + + if ($email === '') { die(json_encode(['result' => 'empty_email'])); } + + // 이메일 형식 체크 + if ($mem->email_format_check($email) === false) { + die(json_encode(['result' => 'email_format_wrong'])); + } + + // 이메일 중복 체크 if ($mem->email_exists($email)) { die(json_encode(['result' => 'fail'])); } else { die(json_encode(['result' => 'success'])); } - // -} else if ($mode == 'input') { - // 비밀번호 해시 처리 + +// ====================== +// 3. 실제 회원 가입 처리 +// ====================== +} else if ($mode === 'input') { + + // 1) 필수값 서버 검증 (JS만 믿지 않기) + if ($id === '' || $password === '' || $email === '') { + redirect_with_error('아이디, 비밀번호, 이메일은 필수 입력 항목입니다.'); + } + + // 2) 비밀번호 규칙 서버 검증 + if (!password_check($password)) { + redirect_with_error('비밀번호는 8자 이상이며, 대문자/소문자/숫자/특수문자를 모두 포함해야 합니다.'); + } + + // 3) 선택 항목 기본값 처리 (미입력 시 빈 문자열) + $name = $name ?? ''; + $zipcode = $zipcode ?? ''; + $addr1 = $addr1 ?? ''; + $addr2 = $addr2 ?? ''; + + // 4) 비밀번호 해시 처리 $hash = password_hash($password, PASSWORD_DEFAULT); - // 프로필 이미지 처리 - $tmparr = explode('.', $_FILES['photo']['name']); - $ext = end($tmparr); - $photo = $id .'.'. $ext; - copy($_FILES['photo']['tmp_name'], "../data/profile/". $photo); + // 5) 프로필 이미지 처리 (선택 항목) + $photo = ''; // 기본값: 빈 문자열 또는 'default.jpg' 등으로 변경 가능 - // 배열 생성 + if ( + isset($_FILES['photo']) && + $_FILES['photo']['error'] === UPLOAD_ERR_OK && + is_uploaded_file($_FILES['photo']['tmp_name']) + ) { + $tmparr = explode('.', $_FILES['photo']['name']); + $ext = strtolower(end($tmparr)); // 확장자 소문자로 정리 + + // 허용 확장자 + $allow_ext = ['jpg', 'jpeg', 'png', 'gif']; + if (!in_array($ext, $allow_ext)) { + redirect_with_error('이미지 파일(jpg, jpeg, png, gif)만 업로드 가능합니다.'); + } + + // 저장 파일명: 아이디.확장자 + $photo = $id . '.' . $ext; + + // 저장 경로 + $target_dir = "../data/profile/"; + $target_path = $target_dir . $photo; + + // 디렉터리가 없으면 생성 + if (!is_dir($target_dir)) { + mkdir($target_dir, 0777, true); + } + + // 파일 복사 + if (!copy($_FILES['photo']['tmp_name'], $target_path)) { + // 복사 실패 시 기본값 유지 + $photo = ''; + } + } + + // 6) DB insert에 넘길 배열 생성 $arr = [ - 'id' => $id, + 'id' => $id, 'password' => $hash, - 'name' => $name, - 'email' => $email, - 'zipcode' => $zipcode, - 'addr1' => $addr1, - 'addr2' => $addr2, - 'photo' => $photo + 'name' => $name, + 'email' => $email, + 'zipcode' => $zipcode, + 'addr1' => $addr1, + 'addr2' => $addr2, + 'photo' => $photo ]; - // 입력 메서드 실행 + // 7) 회원 정보 저장 $mem->input($arr); + + // 8) 가입 성공 시, 이전 입력/에러 세션 정리 + unset($_SESSION['join_old'], $_SESSION['join_error']); + + // 9) 회원가입 완료 후 알림 + 홈(index.php) 이동 + echo ""; + exit; } + +// 기타 잘못된 접근에 대한 처리 (옵션) +// else { +// redirect_with_error('잘못된 접근입니다.'); +// } +