이번 2주차 과제 중 Mini Mission으로
`[학생이름] 학생의 점수는 [점수]입니다.`
를 PHP와 DB를 연결하여 웹 화면에 출력하는 과제를 해볼려고 한다.
개발
먼저 PHP 코드를 활용하여 URL에서 학생 이름을 가져오고, 해당 학생의 점수를 데이터베이스에서 조회하여 결과를 배열 형태로 반환하였다.
<?php
// PHP 에러 확인
error_reporting(E_ALL); // 모든 에러 보고
ini_set('display_errors', '1'); // 에러를 화면에 표시
require_once 'db.php'; // 데이터베이스 연결 함수 파일 추가
// 점수를 가져오는 함수
function getScore($studentName) {
$conn = getConnection(); // 데이터베이스 연결
// 이름을 안전하게 처리하기 위해 prepared statement 사용
$stmt = $conn->prepare("SELECT * FROM score_test WHERE name = ? "); // 이름으로 조건 설정
$stmt->bind_param("s", $studentName); // 문자열 타입으로 바인딩
$stmt->execute(); // 쿼리 실행
$result = $stmt->get_result(); // 결과 가져오기
// 쿼리 실패 시 에러 메시지 출력
if (!$result) {
die("Query failed: " . mysqli_error($conn));
}
$row = $result->fetch_assoc(); // 결과 배열 가져오기
$stmt->close(); // prepared statement 종료
mysqli_close($conn); // 데이터베이스 연결 종료
// 결과가 있을 경우 HTML 이스케이프 후 배열로 반환, 없을 경우 null 반환
return $row ? array(
'name' => htmlspecialchars($row['name']),
'score' => htmlspecialchars($row['score'])
) : null;
}
// URL에서 학생 이름을 가져옴
$studentName = isset($_GET['name']) ? $_GET['name'] : null; // 'name' 쿼리 파라미터 확인
$filtered = $studentName ? getScore($studentName) : null; // 이름이 있을 경우 점수 데이터 가져오기
?>
그다음 해당 데이터를 출력해주기 위해 HTML 코드를 생성하였다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>학생 점수</title>
</head>
<body>
<div>
<?php if ($studentName): ?> <!-- 이름이 있을 경우 -->
<?php if ($filtered): ?> <!-- 데이터가 존재하는 경우 -->
<?=$filtered['name']?> 학생의 점수는 <?=$filtered['score']?>점 입니다.
<?php else: ?> <!-- 데이터가 존재하지 않는 경우 -->
해당 학생의 점수가 없습니다.
<?php endif; ?>
<?php else: ?> <!-- 이름이 없는 경우 (메인 화면) -->
<div>안녕하세요! 학생의 이름을 입력해 주세요.</div>
<?php endif; ?>
</div>
</body>
</html>
결과
- 메인화면
- name 값이 없을 경우
- name 값이 있을 경우
후기
이번 과제를 통해 PHP와 데이터베이스를 연결하여 데이터를 조회하고 웹 페이지에 출력하는 과정을 해보았다. 간단한 코드로 개발하였지만, 개발 과정에서 새롭게 알게된 사실을 정리해보겠다.
첫째, error_reporting(E_ALL); ini_set('display_errors', '1');를 사용하여 에러 메시지를 화면에 표시할 수 있었다. 이는 개발 과정에서 발생하는 오류를 쉽게 확인하고 수정할 수 있도록 도와준다. 그렇지만 실 배포 시에는 해당 코드를 제거하고 배포해야 할 것을 명심해야 한다.
둘째, prepared statement에 대해서 알게 되었다. 이 방법은 SQL 인젝션 공격을 방지하는 데 효과적이며, 따로 정리를 해봐야겠다.
셋째, 데이터베이스 연결을 명시적으로 종료함으로써 시스템 리소스를 효율적으로 관리하기 위해선 mysqli_close($conn);를 사용하면 좋다. 연결을 열어두면 서버 자원을 낭비할 수 있으며, 이는 성능 저하로 이어질 수 있으므로 연결이 더 이상 필요하지 않을 때는 반드시 종료하는 것이 좋다.
이번 미션을 하면서 새로운 것을 많이 알아간 것 같다. 조금 더 공부하여 다음 과제에서는 해당 부분들을 활용하여 더 실용적이고 효율적인 코드를 작성해봐야겠다.
'모의해킹 > 모의해킹 스터디' 카테고리의 다른 글
모의해킹 스터디 2주차 과제(2) - 로그인 (0) | 2024.10.28 |
---|---|
모의해킹 스터디 2주차 과제(1) - 회원가입 (0) | 2024.10.27 |
모의해킹 스터디 2주차 정리 (0) | 2024.10.24 |
모의해킹 스터디 1주차 과제 (0) | 2024.10.21 |
모의해킹 스터디 1주차 정리 (0) | 2024.10.21 |