# Mini mission

자! DB & SQL에 대해 살펴보았으니 mini mission을 할 차례이다.

Mini mission 내용은 다음과 같다.

* Client가 학생 이름을 입력하면 **Get method**로 파라미터를 보낼 것
* DB에서 이름을 입력한 학생의 점수를 가져와 화면에 결과를 출력할 것

바로 시작해보자.

DB는 [database](https://hh-rys-log.gitbook.io/normaltic/2-11-1/note/database "mention")에서 본&#x20;

<figure><img src="https://4088362535-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfPTzhnIGTgzKiyvrjgUu%2Fuploads%2Fi4j04JSgXpKJbwa6AU60%2Fimage.png?alt=media&#x26;token=ca8e16de-fa71-4fb2-8ad6-6bbbb9c0b49c" alt=""><figcaption></figcaption></figure>

test DB - student\_grade Table을 사용할 것이다.&#x20;

### \[score.html]

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="./miniProject.php" method="get">
        <input type="text" name="student">
        <button>Get Score</button>
    </form>
</body>
</html>
```

우선 사용자의 파라미터를 받을 \<input>이 필요하다.&#x20;

간단하게 입력란 & 버튼 정도로만 구성했다.&#x20;

Get method로 파라미터를 보낼 거라 \<form> - method 속성을 get으로!&#x20;

결과 화면을 보면

<figure><img src="https://4088362535-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfPTzhnIGTgzKiyvrjgUu%2Fuploads%2FZrQgnOj7Dbb4GKXgapwy%2Fimage.png?alt=media&#x26;token=4b21c1e0-4633-4d09-a557-8a4676ddeb6b" alt=""><figcaption></figcaption></figure>

이름을 입력할 \<input>과 버튼이 등장한다.&#x20;

다음으로 학생 이름을 가지고 이후 과정을 처리할 PHP code를 살펴보자.

### \[ miniProject.php ]

```php
<?php
    define("DB_SERVER", "localhost");
    define("DB_USER", "admin");
    define("DB_PASSWORD", "student1234");
    define("DB_TABLE", "test");

    $conn = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_TABLE);
    
    if(!$conn) {
        echo 
        '<script>
            alert("DB connection error");
            location.href = "score.html";
        </script>';
    }

    $name = $_GET['student'];

    if($name == '') {
        echo 
        '<script>
            alert("이름을 입력하세요");
            location.href = "score.html";
        </script>';
    }

    
    $query = "SELECT * from student_grade where student_name = '$name'";
    $result = mysqli_query($conn, $query);

    if(mysqli_num_rows($result) == 0) {
        echo '<script>
            alert("해당 학생 정보는 존재하지 않습니다.");
            location.href = "score.html";
        </script>';
    }
    
    $row = mysqli_fetch_array($result);
    echo $name." 학생의 점수는 ".$row['score']."점 입니다.";
?>
```

전체적인 코드는 위와 같다. 이해를 돕기 위해 조금씩 쪼개서 분석해보자.&#x20;

```php
define("DB_SERVER", "localhost");
define("DB_USER", "admin");
define("DB_PASSWORD", "student1234");
define("DB_TABLE", "test");

$conn = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_TABLE);
```

사용자가 학생 이름을 입력하면 WAS는 그 값을 가지고 DB에게 해당 학생의 점수를 물어봐야 한다.

이때 DB 관점에서는 아무한테 정보를 알려줄 수 없기 때문에&#x20;

<mark style="background-color:blue;">**데이터를 제공할 만한 권한이 되는 지 인증이 필요하다**</mark>고 할 수 있다.

여기서 말하는 **"인증"**&#xC740; 쉽게 말해 로그인과 같다.

DB의 id:password를 가지고 연결을 시도하면 WAS는 로그인에 성공해 자신이 인증된 상대라는 걸&#x20;

증명할 수 있게 된다.&#x20;

자신이 인증된 대상임을 보여주는 결과를 mysqli\_connect()가 반환하고 (= $conn)

이후 SQL을 실행할 때 사용한다.&#x20;

```php
if(!$conn) {
    echo 
    '<script>
        alert("DB connection error");
        location.href = "score.html";
    </script>';
}
```

만약 연결에 문제가 생겼다면 다시 score.html로 이동하고&#x20;

정상적으로 연결이 마무리 되면&#x20;

```
$user = $_GET['student'];
```

사용자가 보낸 학생 이름을 글로벌 변수 $\_GET에서 가져온다.

```php
if($name == '') {
    echo 
    '<script>
        alert("이름을 입력하세요");
        location.href = "score.html";
    </script>';
}
```

\<input>에서 required를 사용하지 않았기 때문에&#x20;

사용자가 아무런 값을 입력하지 않은 상태로 요청을 보낼 수 있음을 고려해&#x20;

$name이 공백이면 계속해서 진행하지 않고 다시 score.html로 이동한다.&#x20;

```php
$query = "SELECT * from student_grade where student_name = '$name'";
$result = mysqli_query($conn, $query);
```

DB와 소통도 문제없고! 사용자가 학생 이름을 입력했다면!

이젠 SQL을 실행할 시간이다.&#x20;

(참고로 DB에 SQL을 실행하는 걸 **query** 질의한다고 표현한다.

query할 때 사용하는 언어라 **S**tructured **Query L**anguage인 셈)

우리는 사용자가 입력한 학생 이름으로 점수를 얻고 싶기 때문에 select문을 실행할 것이다.&#x20;

PHP에서 SQL을 사용하기 위해서는 mysqli\_query() 함수를 사용한다.&#x20;

위에서 말했듯이 DB에게 인증해야 하니까 $conn도 같이 넣어준다 :sunglasses:

```php
if(mysqli_num_rows($result) == 0) {
    echo '<script>
        alert("해당 학생 정보는 존재하지 않습니다.");
        location.href = "score.html";
    </script>';
}
```

만약 SQL 결과로 나온 row가 0개라면&#x20;

DB에 없는 학생 이름을 입력한 것이기 때문에 pop up으로 이를 알리고&#x20;

score.html로 돌아간다.&#x20;

```php
$row = mysqli_fetch_array($result);
echo $name." 학생의 점수는 ".$row['score']."점 입니다.";
```

SQL 실행 결과가 존재하면 mysqli\_fetch\_array()로 맨 위에 있는 데이터부터 값을 가져온다.

mysqli\_query() 결과는 Object 형태이기 때문에 우리가 바로 사용할 수 없어 mysqli\_fetch\_array,&#x20;

mysqli\_fetch\_assoc 함수 등을 사용해야 한다.&#x20;

마지막엔 학생 이름과 점수를 알려주는 문장을 echo 해주면 끝!

그럼 실행이 잘 되는 지 확인하러 가자!

***

<figure><img src="https://4088362535-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfPTzhnIGTgzKiyvrjgUu%2Fuploads%2FG58Z75JorOsRxxzeScPx%2Fimage.png?alt=media&#x26;token=8d764e3c-addd-4ed1-aa00-d27d2bd5c6f3" alt=""><figcaption></figcaption></figure>

사용자가 아무런 값을 입력하지 않은 경우, pop up으로 문구를 출력한다.

<figure><img src="https://4088362535-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfPTzhnIGTgzKiyvrjgUu%2Fuploads%2FqJsSGlnpoe8Sl2wLCuDF%2Fimage.png?alt=media&#x26;token=de3f1d1c-56ed-4391-9de0-fb74a85f0908" alt=""><figcaption></figcaption></figure>

만약 mysqli\_connect() 실행 결과에 문제가 있다면 DB connection error 문구를 출력한다.

<figure><img src="https://4088362535-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfPTzhnIGTgzKiyvrjgUu%2Fuploads%2FZm6NuSWb7xbXeP9sTH4P%2Fimage.png?alt=media&#x26;token=19298671-47af-4381-96e0-266742247f1f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4088362535-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfPTzhnIGTgzKiyvrjgUu%2Fuploads%2FPcWFFq8Gwy2XX2pGB0lC%2Fimage.png?alt=media&#x26;token=5d6a48d5-e0b6-45a4-82ca-532f9ccd456e" alt=""><figcaption></figcaption></figure>

DB에 존재하는 학생 이름을 입력한 경우에는 학생 이름 & 점수로 위와 같이

성적을 알려주는 문구를 출력한다.&#x20;

Get method로 파라미터로 학생 이름을 전달하기 때문에&#x20;

URL 바에 현재 입력한 학생 이름이 무엇인지 노출되는 걸 볼 수 있다!

이렇게 해서- Mini mission 완료!
