Almon Dev

모의해킹 공부 정리 9일차(미니 미션) 본문

모의해킹/모의해킹

모의해킹 공부 정리 9일차(미니 미션)

Almon 2024. 10. 25. 16:35

미니 미션

학생 이름과 점수가 들어가는 db를 만들고 get방식으로 학생의 이름을 넣으면 점수가 출력되는 페이지 만들기

 

DB 만들기

 

create database school;
use school;
create table grades (
    name varchar(10) primary key,
    score int not null
);

 

create database school;

school이라는 데이터베이스를 생성합니다.

 

use school;

school 데이터 베이스를 선택합니다.

 

select database();
를 이용하면 현재 선택된 데이터베이스를 확인할 수 있습니다.

 

create table grades (
    name varchar(10) primary key,
    score int not null
);

grades라는 테이블을 생성합니다.

name : 최대 글자수가 10글자인 문자열, primary key(기본키)

score : 숫자(int), null이 불가능


 

DB에 값 추가하기

 

grades_admin.php

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>성적 추가</title>
</head>
<body>
    <container class="grade-container">
        <form action="" class="grade-form" method="post">
            <input type="text" name="name" class="input name-input" required>
            <input type="number" name="score" class="input score-input" required min="0" max="100">
            <input type="submit" value="추가하기" class="submit-btn">
        </form>
    </container>

    <?php 
        if (isset($_POST["name"]) && isset($_POST["score"])) {
            $name = trim($_POST["name"]);
            $score = $_POST["score"];

            $host = "localhost";
            $id = "root";
            $pass = "admin1234";
            $dbname = "school";
            $sql = "insert into grades values ('$name', $score);";
            // echo "$sql";

            $conn = mysqli_connect($host, $id, $pass, $dbname);
            // var_dump($conn);

            // echo "mysqli host info : " . mysqli_get_host_info($conn) . "<br>";
            // echo "mysqli client info : " . mysqli_get_client_info() . "<br>";
            // echo "mysqli server info : " . mysqli_get_server_info($conn) . "<br>";

            mysqli_query($conn,"$sql");

        }
    ?>
</body>
</html>

 

        <form action="" class="grade-form" method="post">
            <input type="text" name="name" class="input name-input" required>
            <input type="number" name="score" class="input score-input" required min="0" max="100">
            <input type="submit" value="추가하기" class="submit-btn">
        </form>

db에 추가하기 위해서 name과 score를 입력받습니다.

추가하기 버튼을 누르면 자기 자신에게 post로 데이터를 전송합니다.

form태그에 action=""을 비워두면 자기 자신에게 데이터를 전송합니다.

 

        if (isset($_POST["name"]) && isset($_POST["score"])) {
            $name = trim($_POST["name"]);
            $score = $_POST["score"];

name과 score가 post로 전송됐을 때 $name과 $score 변수에 각각 값을 대입합니다.

 

            $host = "localhost";
            $id = "root";
            $pass = "admin1234";
            $dbname = "school";
            $sql = "insert into grades values ('$name', $score);";

db의 접속에 필요한 변수를 설정하고, $sql에 데이터 삽입 sql문을 작성합니다.

 

            $conn = mysqli_connect($host, $id, $pass, $dbname);
            var_dump($conn);

$conn에 mysql접속에 대한 커넥션 객체를 대입합니다.

var_dump($conn);으로 $conn의 값을 살펴보면

이런 식의 mysqli객체가 들어있는 것을 볼 수 있습니다.

 

            mysqli_query($conn,"$sql");

mysqli_query 함수는 $conn을 이용해 mysql 서버에 접속해서 $sql에 담긴 sql문을 실행합니다.


 

값 조회하기

 

grades.php

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>성적 조회</title>
    <link rel="stylesheet" href="grades.css">
</head>
<body>
    <?php
        $score_txt = "";

        if(isset($_GET['name'])) {
            $name = trim($_GET['name']);

            $host = 'localhost';
            $id = 'root';
            $password = 'admin1234';
            $dbname = 'school';

            $conn = mysqli_connect($host, $id, $password, $dbname);

            $sql = "select score from grades where name='$name';";
            // echo "$sql";

            $sql_result = mysqli_query( $conn, $sql);
            // var_dump($sql_result);

            if(mysqli_num_rows($sql_result) > 0) {
                $score = $sql_result->fetch_array()['score'];
                $score_txt = "$name 님의 점수는 <strong>$score</strong>점 입니다.";
            }else {
                $score_txt = $name."은 등록되지 않는 이름입니다.";
            }
        }

    ?>
    <container class="grades-container">
        <form action="" method="get" class="grades-form">
            <input type="text" name="name" class="input name-input" required>
            <input type="submit" value="성적 조회" class="submit-btn">
        </form>
        <p class='score'><?php echo "$score_txt" ?></p>
    </container>
</body>
</html>

 

HTML 코드 설명

        <form action="" method="get" class="grades-form">
            <input type="text" name="name" class="input name-input" required>
            <input type="submit" value="성적 조회" class="submit-btn">
        </form>

자기 자신에게 get메서드로 데이터를 전송하는 form태그입니다.

 

            <input type="text" name="name" class="input name-input" required>

조회를 위한 이름을 입력하는 input태그입니다. name의 값이 name이므로

url에는 http://ip:port/path?name=입력값으로 전송됩니다.

 

<p class='score'><?php echo "$score_txt" ?></p>

$score_txt 변수에 담긴 문자열을 p태그에 담아 출력합니다.

이곳에서 점수를 출력할 생각입니다.

 

PHP 코드 설명

    <?php
        $score_txt = "";

        if(isset($_GET['name'])) {
            $name = $_GET['name'];

            $host = 'localhost';
            $id = 'root';
            $password = 'admin1234';
            $dbname = 'school';

            $conn = mysqli_connect($host, $id, $password, $dbname);

            $sql = "select score from grades where name='$name';";
            // echo "$sql";

            $sql_result = mysqli_query( $conn, $sql);
            // var_dump($sql_result);

            if(mysqli_num_rows($sql_result) > 0) {
                $score = $sql_result->fetch_array()['score'];
                $score_txt = "$name 님의 점수는 <strong>$score</strong>점 입니다.";
            }else {
                $score_txt = $name."은 등록되지 않는 이름입니다.";
            }
        }

    ?>

 

if(isset($_GET['name'])) {

name의 값이 있는 get 메서드가 요청되면 if문이 실행됩니다.

 

            $name = trim($_GET['name']);

$name에 url로 요청된 name의 값을 대입합니다. trim은 공백을 제거하는 함수입니다.

 

            $host = 'localhost';
            $id = 'root';
            $password = 'admin1234';
            $dbname = 'school';

mysql 접속에 필요한 정보들을 각각의 변수에 저장합니다.

 

            $conn = mysqli_connect($host, $id, $password, $dbname);

$conn 변수에 mysqli_connect를 이용해 mysql서버에 접속한 뒤 반환받은 mysqli객체를 저장합니다.

 

            $sql = "select score from grades where name='$name';";
            // echo "$sql";

            $sql_result = mysqli_query( $conn, $sql);

$sql에 sql문을 생성합니다.

mysqli_query를 이용해서 $conn으로 $sql에 담긴 sql문을 실행합니다.

$sql_result = mysqli_query( $conn, $sql); 말고도
$sql_result = $conn->query($sql); 도 가능합니다.

$conn에 담긴 mysqli 객체 역시 query라는 메서드를 가지고 있기 때문입니다.

 

            if(mysqli_num_rows($sql_result) > 0) {

mysqli_num_rows($sql_result)는 $sql_result에 담긴 row의 개수를 출력합니다.

즉 1개 이상의 행이 들어있을 경우 if문을 실행하는 것입니다.

 

                $score = $sql_result->fetch_array()['score'];

$score에 가져온 데이터의 점수를 대입합니다. (이름은 중복되지 않으므로 1개의 값만 존재합니다.)

 

                $score_txt = "$name 님의 점수는 <strong>$score</strong>점 입니다.";

$score_txt에 점수를 출력하는 문자열을 대입합니다.

 

            }else {
                $score_txt = $name."은 등록되지 않는 이름입니다.";
            }

else {}의 경우 select문을 통해 가져온 데이터의 행이 0개인 경우(데이터가 없는 경우)

$score_txt에 이름을 찾지 못했다는 문자열을 대입합니다.


 

css도 나중에 추가해 볼 예정입니다.