메인페이지 html에서 로그인 폼의 액션을 login.php로 연결하기로 함.
이제 login.php를 보겠다.
<?php
session_start(); // 세션 시작
error_reporting(E_ALL);
ini_set('display_errors', '1');
// DB 연결 설정
$servername = "192.168.50.100"; // MariaDB 서버 주소
$username = "root"; // MariaDB 사용자명
$password = ""; // MariaDB 비밀번호 (비밀번호를 올바르게 설정)
$dbname = "trainer_db"; // DB 이름
// DB 연결
$conn = new mysqli('192.168.50.100', 'root', '1234', 'trainer_db');
// DB 연결 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 로그인 처리
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 사용자가 입력한 값
$email = $_POST['email'];
$password = $_POST['password'];
// SQL 쿼리 작성 (이메일 확인)
$sql = "SELECT * FROM users WHERE email = '$email'";
$result = $conn->query($sql);
// 이메일이 존재하는지 확인
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
// 비밀번호가 맞는지 확인
if (password_verify($password, $row['password'])) {
$_SESSION['user_email'] = $email;
header("Location: welcome.php");
exit;
} else {
echo "비밀번호가 틀렸습니다.";
}
} else {
echo "아이디가 존재하지 않습니다.";
}
}
?>
시작할 때 꼭 이 session_start(); 를 입력해줘야 한다.
안 그러면 어디가 시작인지 몰라서 동작을 안 할 가능성이 있다. (안 써도 될 때가 있긴 함)
에러로그를 화면에 보여주는 설정.
이건 인터넷에 검색하면 나오는 코드이다.
상황 추천 방식
단순한 MySQL 프로젝트 | mysqli 가능 |
보안이 중요한 로그인/회원 시스템 | ✅ PDO + prepared statements 추천 |
나중에 PostgreSQL 등으로 DB 바꿀 가능성 있음 | ✅ 무조건 PDO |
팀/회사에서 여러 DB를 씀 | ✅ PDO로 통일하는 게 유리 |
디비 연결하기
$conn
연결을 위한 설정-> $conn은 DB와 연결을 뜻하는 이름이다. 보통 conn을 쓴다고 함.
데이터베이스 연결을 나타내는 변수 이름으로 PHP에서 MySQL 데이터베이스에 연결하려면, conn 변수는 데이터베이스 서버와의 연결을 관리하는 역할을 하고 있다.
이건 단순히 이름이므로 다른 걸로 바꿔서 사용해도 된다.
변수명이 무엇이든 간에 중요한 것은
그 이름으로 계속 일관되게 써야 한다!
new mysqli
PHP에서 제공하는 MySQL 전용 객체 지향 클래스.
new mysqli(...) | MySQL DB에 연결하는 PHP 문법 |
왜 써요? | 데이터 조회, 삽입, 로그인 등 할 때 필요 |
$conn | 이 연결을 저장해서 나중에 쿼리할 때 씀 |
내 코드는 mysqli를 사용하고 있고, 또다른 하나는 DSN은 PDO를 사용할 때 나오는 방식도 있다.
둘은 PHP에서 데이터베이스에 연결하는 두 가지 방법. DSN이 더 좋은 듯?
✅ 핵심 차이 요약
mysqli | PDO (DSN 사용) | |
전체 이름 | MySQLi (MySQL Improved) | PHP Data Objects |
사용 방식 | new mysqli(...) | new PDO($dsn, $user, $pass) |
DSN 사용 여부 | ❌ 없음 | ✅ 필수 |
지원 DB 종류 | MySQL/MariaDB만 | MySQL, PostgreSQL, SQLite 등 다수 |
보안 처리 | prepared statement 지원 (약간 번거로움) | prepared statement, 바인딩 더 쉬움 |
코드 이식성 | 낮음 | 높음 |
성능 차이 | 거의 없음 | 거의 없음 |
추천 여부 | 단순 MySQL이면 OK | 보안, 확장성, 범용성 원하면 추천 |
🔍 내가 쓴 코드 (MySQLi 방식)
$conn = new mysqli('192.168.50.100', 'root', '1234', 'trainer_db');
- 간단하고 익숙함
- MySQL에만 사용 가능
- 에러 처리나 prepared statement는 수동 처리 필요
🔍 PDO + DSN 방식
$dsn = 'mysql:host=192.168.50.100;dbname=trainer_db;charset=utf8mb4';
$user = 'root';
$pass = '1234';
try {
$pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
echo "DB 연결 실패: " . $e->getMessage();
}
- 다양한 DB에 적용 가능
- 에러 핸들링, 보안, 바인딩 등이 더 강력
- SQL 인젝션 방어에 강함
🎯 언제 어떤 걸 써야 할까?
상황 추천 방식
단순한 MySQL 프로젝트 | mysqli 가능 |
보안이 중요한 로그인/회원 시스템 | ✅ PDO + prepared statements 추천 |
나중에 PostgreSQL 등으로 DB 바꿀 가능성 있음 | ✅ 무조건 PDO |
팀/회사에서 여러 DB를 씀 | ✅ PDO로 통일하는 게 유리 |
💡 참고: 보안 예시 (SQL Injection 방지)
// mysqli 방식
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
// PDO 방식
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->execute([$username, $password]);
✅ 체크
mysqli는 단순하고 빠르지만, MySQL 전용이고 보안이나 확장성은 약간 부족
PDO는 DSN 방식으로 다양한 DB 지원, 보안에 강하고 확장성 높음
로그인 시스템처럼 보안이 중요한 곳은 무조건 PDO 사용 추천!
아무튼 난 이미 mysqli를 썼으니까..
이어서 다시 내가 쓴 코드를 분석해보자.
연결확인으로 db와 연결이 안되면 Connection failed 라고 출력. 이유까지 같이 출력해준다
1. if ($_SERVER["REQUEST_METHOD"] == "POST")
- $_SERVER["REQUEST_METHOD"]는 사용자가 폼을 제출할 때 그 방법(HTTP 방식)을 알려주는 값
- 이 조건문은 사용자가 로그인 폼을 제출한 경우에만 안에 있는 코드가 실행되도록
2. $email = $_POST['email'];
- $_POST는 사용자가 제출한 폼 데이터들을 연관 배열 형태로 가져오는 방법
- $_POST['email']는 사용자가 폼에서 name="email"로 입력한 값을 가져옵니다.
- 이 값을 $email 변수에 저장
3. $password = $_POST['password'];
- 이 코드도 마찬가지로 사용자가 폼에서 name="password"로 입력한 값을 $_POST['password']에서 가져와서 $password라는 변수에 저장
이메일을 db에서 확인하는 코드
- $conn은 데이터베이스와의 연결을 나타내는 객체이고, query() 메서드는 SQL 쿼리를 실행하는 역할
- 즉, query($sql)는 위에서 작성한 SQL 쿼리를 실제로 실행하고, 그 결과를 $result 변수에 담는다.
먼저, num_rows > 0을 사용해서 이메일이 데이터베이스에 있는지 확인
행(row)의 개수(검색된 데이터가 몇 개인지) 결과가 1개 이상이면 true
fetch_assoc()는 첫 번째로 일치하는 사용자 정보를 배열로 가져옴. 예를 들어, email, name, password 등의 정보가 포함된 배열로 변환.
- num_rows > 0은 이메일이 데이터베이스에 존재하는지 확인하는 부분
- fetch_assoc()는 이메일에 해당하는 사용자 정보를 배열로 가져오는 과정
-> 사용자가 입력한 비밀번호가 맞으면 → 세션에 로그인 정보를 저장하고 → welcome.php 페이지로 이동시켜주는 코드.
- password_verify()는 입력한 비밀번호가 DB에 저장된 비밀번호(암호화된 값)와 같은지 확인하는 함수
- $password: 사용자가 로그인 폼에 입력한 평문(일반 텍스트) 비밀번호.
- $row['password']: 데이터베이스에 저장된, 암호화된 비밀번호.
- 이 조건이 참이면 = 비밀번호가 맞다는 뜻
-> 만약 암호화되지 않았다면?
if ($password === $row['password']) {
// 로그인 성공 처리
$_SESSION['user_email'] = $email;
header("Location: welcome.php");
exit;
$숫자 = 5; // 정수
$문자 = "5"; // 문자열
var_dump($숫자 == $문자); // true (값은 같다고 판단)
var_dump($숫자 === $문자); // false (자료형이 다름)
==와 ===의 차이.
- ==: 값만 비교 → 느슨한 비교
- ===: 값과 자료형 모두 비교 → 엄격한 비교 (✨ 보안과 정확도에 유리)
근데 암호화되어 있으면 ==이나 ===로 확인 할 수 없기 때문에 상관없다. ==,===는 값을 직접 비교하는 것이므로 암호화된 것은 알아올 수가 없으므로 true가 나올 수가 없다.
header를 위에 썼으므로 여기서 끝내라는 코드인 exit;를 입력해줘야 한다.
// 이메일이 존재하는지 확인 , // 비밀번호가 맞는지 확인
else를 해서 위에 이메일이 맞는지 확인했던 부분과 비밀번호가 맞는지 확인했던 부분의 결과를 틀렸다면 위처럼 출력한다.
'WEB' 카테고리의 다른 글
웹페이지 만들기 (5) 각 페이지 별로 만들기, 상대경로 설정, css연결 (0) | 2025.05.22 |
---|---|
웹페이지 만들기 (4) 회원가입 php, welcome php (mariadb연결) (0) | 2025.05.21 |
웹페이지 만들기 (3) 회원가입 폼 (0) | 2025.05.21 |
웹페이지 만들기(1) 메인 페이지 - html + css + 로그인 폼 (1) | 2025.05.21 |
HTTP / 웹통신 URL, Message 형식, 통신 규약, 구조 (0) | 2025.04.29 |