웹페이지 만들기 (4) 회원가입 php, welcome php (mariadb연결)

2025. 5. 21. 19:04·WEB

회원가입 php

<?php
// DB 연결
$conn = new mysqli('192.168.100.10', 'web_user', 'web_pw@!', 'trainer_db');

// 연결 확인
if ($conn->connect_error) {
    die("DB 연결 실패: " . $conn->connect_error);
}

// 회원가입 처리
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 사용자 입력
    $email = $_POST['email'];
    $password = $_POST['password'];
    $name = $_POST['name'];
    $gender = $_POST['gender'];
    $region = $_POST['region'];

    // 비밀번호 해시화
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    // Prepared Statement 사용 (보안 필수)
    $stmt = $conn->prepare("INSERT INTO trainer (email, password, name, gender, region) VALUES (?, ?, ?, ?, ?)");
    $stmt->bind_param("sssss", $email, $hashed_password, $name, $gender, $region);

    // 회원가입 쿼리 실행
    if ($stmt->execute()) {
        echo "회원가입이 완료되었습니다.<br>";

        // 트래킹 정보 로그에 기록
        $trainer_id = $stmt->insert_id;  // 새로 추가된 trainer의 ID
        $referral = $_POST['referral_code'];  // referral_code는 폼에서 입력받음
        $source = "web";  // 웹에서의 가입이므로 "web"으로 고정

        // 로그 기록을 위한 Prepared Statement
        $log_stmt = $conn->prepare("INSERT INTO signup_log (trainer_id, referral_code, source) VALUES (?, ?, ?)");
        $log_stmt->bind_param("iss", $trainer_id, $referral, $source);

        // 로그 기록 실행
        if ($log_stmt->execute()) {
            // 로그 기록 성공
            echo "<br>회원가입 로그가 기록되었습니다.";
        } else {
            // 로그 기록 실패
            echo "<br>로그 기록에 오류가 발생했습니다: " . $log_stmt->error;
        }

        // 로그 Statement 닫기
        $log_stmt->close();

    
    } else {
        echo "오류: " . $stmt->error;
    }

    // 회원가입 Statement 닫기
    $stmt->close();
}

// DB 연결 종료
$conn->close();
?>

 

 

$conn = new mysqli('192.168.50.100', 'root', '1234', 'trainer_db');

연결하는 주소는 마리아디비 주소이고 내가 들어갈 회원 아이디와 비번을 잘 입력해야 한다.

 

// 비밀번호 해시화
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);
 
$password_hash = password_hash("1234", PASSWORD_DEFAULT);

이렇게 하면 PHP가 알아서 가장 안전한 방식(현재는 bcrypt) 으로 비밀번호를 암호화

 bcrypt 는 암호화 방식 중에 하나.

PASSWORD_DEFAULT를 쓰는 이유

  • PHP는 보안이 강화되면 새로운 알고리즘을 도입
  • PASSWORD_DEFAULT를 쓰면 PHP가 알아서 가장 좋은 걸 써줌
  • 나중에 PHP가 더 강력한 알고리즘을 도입해도 코드를 바꿀 필요 없이 자동으로 적용

🎯 지금은 뭘 쓰고 있나?

현재(PHP 7~8 기준) PASSWORD_DEFAULT는 bcrypt 알고리즘을 사용
결과는 $2y$로 시작하는 긴 문자열이 되고, 자동으로 salt도 추가

예시:$2y$10$QpUBBWGUqKbdfFQ6LaZxuOdjvEC.HN4SSUtM1Mx6bhyo5xF6pXwnW


 

 $stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");

PHP에서 stmt는 주로 Prepared Statement(준비된 문)를 의미하며, 데이터베이스 쿼리를 보다 안전하고 효율적으로 실행하기 위한 미리 준비된 SQL 문 객체를 지칭하는 이름으로 사용.

이 코드는 회원 가입 시, 사용자가 입력한 이메일, 비밀번호, 이름, 성별, 지역 정보를 DB에 안전하게 저장하기 위한 코드.

 

VALUES (?, ?)");

  • 여기서 ?는 빈칸(자리표시자, placeholder) -값을 직접 적지 않고 ?로 비워놓는 이유는 SQL 인젝션을 막기 위해서
  • ?는 앞의 넣을 정보들의 갯수와 맞춰야 함. ?로 해서 이 정보를 sql문이 아니라 단순한 글자로 인식하게 하고 ?에 사용자가 정보를 넣으면 sql문이 완성이 된다.
 
$stmt->bind_param("sssss", $email, $hashed_password, $name, $gender, $region);
$stmt->bind_param("sssss", $email, $hashed_password, $name, $gender, $region);

ind_param()은 “자리표시자 ?에 이 값을 넣어줘” 라고 말하는 부분.

  • "sssss": 각 자리의 데이터 형식을 뜻함.
  • 문자 의미
    s string (문자열) — 텍스트 데이터
    i integer (정수)
    d double (소수)
    b blob (바이너리 데이터)
    → 여기선 모든 값이 문자열이니까 "sssss"!

$hashed_password

비번은 암호화해서 저장

 

$conn->prepare(...) SQL 템플릿 만들기 (?로 비워둠)
bind_param(...) ? 자리에 변수들을 연결함
s 문자열(string)이라는 뜻
이 방식의 장점 보안 강화 (SQL 인젝션 방지), 깔끔한 코드

 

  • prepare()는 SQL 문 구조만 준비 -그릇 만들기
  • bind_param()는 값을 바인딩해서 그 구조를 완성 -그릇에 음식을 담는 것

 

 

 

 

 
   if ($stmt->execute()) {
        echo "회원가입이 완료되었습니다.<br>";

 

  • execute 는 앞에서 준비한 SQL 문을 실제로 실행하는 명령-> 입력한 이메일, 비밀번호, 이름 등을 DB에 저장하라! 라는 뜻.
  • if ($stmt->execute()) → 실행이 성공했다면 echo → 화면에 메시지를 보여줘! 회원가입이 완료되었습니다.
} else {
        echo "오류: " . $stmt->error;
    }

 

오류가 생기면 이렇게 뜸. 위 코드에서 로그기록을 출력하는 것을 포함하므로 맨 아래에 위치함

 

  // 트래킹 정보 로그에 기록
        $trainer_id = $stmt->insert_id;  // 새로 추가된 trainer의 ID
        $referral = $_POST['referral_code'];  // referral_code는 폼에서 입력받음
        $source = "web";  // 웹에서의 가입이므로 "web"으로 고정

        // 로그 기록을 위한 Prepared Statement
        $log_stmt = $conn->prepare("INSERT INTO signup_log (trainer_id, referral_code, source) VALUES (?, ?, ?)");
        $log_stmt->bind_param("iss", $trainer_id, $referral, $source);

        // 로그 기록 실행
        if ($log_stmt->execute()) {
            // 로그 기록 성공
            echo "<br>회원가입 로그가 기록되었습니다.";
        } else {
            // 로그 기록 실패
            echo "<br>로그 기록에 오류가 발생했습니다: " . $log_stmt->error;
        }

        // 로그 Statement 닫기
        $log_stmt->close();

 

회원가입 후 추가적인 트래킹 정보를 로그 테이블에 저장.

회원이 가입하면, 그 사람의 ID와 추천 코드(referral_code), 가입 경로(source = web)를 signup_log 테이블에 기록하는 것.

 

-> $trainer_id = $stmt->insert_id;  // 새로 추가된 trainer의 ID

여기서 trainer_id는 insert_id인데 입력을 할 때마다 정수가 자동으로 증가하므로 1번,2번,3번식으로 저장이 된다.

 $referral = $_POST['referral_code']; 

추천인 코드를 입력받는다.

 $source = "web"

source는 항상 web으로 저장되게 한다.

      // 로그 기록을 위한 Prepared Statement
        $log_stmt = $conn->prepare("INSERT INTO signup_log (trainer_id, referral_code, source) VALUES (?, ?, ?)");
        $log_stmt->bind_param("iss", $trainer_id, $referral, $source);

로그 기록은 signup_log테이블에 저장이 되며 정수값과 추천인코드, 소스는 웹으로 저장이된다.

bind_param에서 iss는 정수,문자열,문자열을 의미한다.

 

 


welcome.php

<?php
session_start();

if (!isset($_SESSION['name'])) {
    header("Location: login.php");
    exit;
}

$welcomeMessage = "환영합니다, " . $_SESSION['name'] . "님!";
?>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Welcome!</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #131312;
            color: #fff;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }

        .container {
            text-align: center;
        }

        img {
            margin-top: 20px;
        }
    </style>
</head>
<body>

    <div class="container">
        <h1><?php echo $welcomeMessage; ?></h1>
        <h2>즐거운 시간되세요</h2>
        <img src="logo.png" alt="로고 이미지" width="200">
    </div>

</body>
</html>

 

if (!isset($_SESSION['name'])) {

isset()은 PHP에서 변수가 존재하는지 그리고 값이 설정되어 있는지 확인하는 함수.

함수는 주로 변수가 정의되었는지, 그리고 NULL이 아닌지 체크할 때 사용.

즉, 변수가 정상적으로 설정되었고 값이 할당되어 있는지 여부를 확인하는 데 유용.

 

isset($변수);


$변수: 확인하려는 변수

TRUE: 변수가 설정되어 있고, 값이 NULL이 아닐 때.

FALSE: 변수가 설정되지 않았거나, 값이 NULL일 때.

 

       <h1><?php echo $welcomeMessage; ?></h1>

php에서 이걸 불러와서 깔끔하게 정리

 

저작자표시 비영리 변경금지 (새창열림)

'WEB' 카테고리의 다른 글

웹 페이지 만들기 (6) 아파치 보안 설정  (0) 2025.05.22
웹페이지 만들기 (5) 각 페이지 별로 만들기, 상대경로 설정, css연결  (0) 2025.05.22
웹페이지 만들기 (3) 회원가입 폼  (0) 2025.05.21
웹페이지 만들기(2) 로그인 php+ maria DB 연결  (0) 2025.05.21
웹페이지 만들기(1) 메인 페이지 - html + css + 로그인 폼  (1) 2025.05.21
'WEB' 카테고리의 다른 글
  • 웹 페이지 만들기 (6) 아파치 보안 설정
  • 웹페이지 만들기 (5) 각 페이지 별로 만들기, 상대경로 설정, css연결
  • 웹페이지 만들기 (3) 회원가입 폼
  • 웹페이지 만들기(2) 로그인 php+ maria DB 연결
햅삐root
햅삐root
happyroot 님의 블로그 입니다. IT 보안 정리💛
  • 햅삐root
    햅삐한 root
    햅삐root
  • 전체
    오늘
    어제
    • 전체보기 IT (123)
      • Linux (21)
      • Network (23)
      • packet tracer& GNS3 (10)
      • Cryptology (7)
      • WEB (16)
      • DB (16)
      • Hacking (28)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    sqlinjection
    injectionvector
    Hack
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
햅삐root
웹페이지 만들기 (4) 회원가입 php, welcome php (mariadb연결)
상단으로

티스토리툴바