데이터베이스 MYSQL 실습




원래는 php가 file에서 정보를 가져왔지만 

이제는 데이터베이스에서 정보를 가져온다. 

php같이 중간에서 작업하는 언어를 가지고 미들웨어라고도 한다. 

어떻게 프로그래밍 해야하나

=> mysqli (php 내장)



실습

1차원 적인 목표 => file_get~ 이 file에서 정보를 가져오는 php 코드를 MySQL에서 가져오는 것으로 바꾼다. 

MySQL을 다루는 데에서 에러가 많이 발생한다. 에러를 찾는 것을 계속 하면서 만들어야

=> error.log 파일 켜기 => Openfile, bitnami, wampstack, apache2, logs 에 있다. 


mysqli의 코드를 <!DOCTYPE html> 위에 작성한다

<?php
  $conn = mysqli_connect("localhost","root",111111);
  mysqli_select_db($conn,'opentutorials');
?>



조회와 출력


출력에서 

=> 

<?php
    $a = array("About JavaScript","JavaScript is...");
    echo $a[0];

    echo "<br />" // 줄바꿈

    echo "연관배열";

    $b = array("title"=>"About JavaScript","description"=>"JavaScript");
    echo $b["title"];
?>

연관배열 : 어떤 값에 이름을 주는 것 



연관배열의 값을 가져올 때 


result에는 mysql_monitor에 보이는 표 처럼 topic에 있는 정보를 모두 result에 저장한다.

그리고 그 결과를 바로 사용할 수 있는게 아닌 fetch를 해준 다음 return 된 값을 변수에 저장한다.

$row = mysqli_fetch_assoc($result);

여기서 $row 에는 첫번째 행의 데이터만을 저장한다. 

그리고 그 형식은 associative 배열의 형식

ex)
$row = mysqli_fetch_assoc($result);
echo $row['id']; 
echo $row['title'];

---------------
ouput =>
1About JavaScript

이 된다. 

한번 더 fetch를 하면 그 다음 행을 가져온다.

ex)

$row = mysqli_fetch_assoc($result);
echo $row['id']; 
echo $row['title'];

$row = mysqli_fetch_assoc($result);
echo $row['id']; 
echo $row['title'];

---------------
ouput =>
1About JavaScript
2Variable and Constant

계속해서 반복하다 보면 데이터가 없을 때도 실행된다. 그러면 blank가 나오고 

그것을 제대로 확인하기 위해 사용하는 함수는 

var_dump(확인하고 싶은 변수);

이다. 내용이 없을 때 함수를 실행하면 NULL이 나온다. 

  • php에서 NULL은 곧 false라는 것을 암시적으로 알아두기.



작성한 코드는 중복이 있다. 

중복 없애기


while($row = mysqli_fetch_assoc($result)){
    echo $row['id'];
    echo $row['title'];
    echo "<br />";
  }


이런식으로 작성 가능

while 바로 옆의 괄호의 의미는 php에서 어떤 것이 값을 가질때, 또는 false가 아닌 상황은 모두 true로 간주하는 특성이 있다.

그래서 row 가 값을 가질때는 true, null 일때는 false이므로 이를 이용해서 while 문을 위와 같이 작성할 수 있다. 



배운 것 활용하기 

배운 내용으로 ol의 내용을 php에서 불러오자. 

위에서 사용한 while문은 ol태그 안에 집어넣는다. 

<ol>
      <?php
        while($row = mysqli_fetch_assoc($result)){
          echo $row['id'];
          echo $row['title'];
          echo "<br />";
        }
       ?>
    </ol>

li태그를 추가하고 "\n"을 통해 줄 바꿈을 하면

<ol>
      <?php
        while($row = mysqli_fetch_assoc($result)){
          echo '<li><a>'.$row['title'].'</a></li>'."\n";
        }
       ?>
</ol>

이 된다.

링크까지 걸면

  <ol>
      <?php
        while($row = mysqli_fetch_assoc($result)){
          echo '<li><a href="http://localhost/phptem/index.php?id='.$row['id'].'">'.$row['title'].'</a></li>'."\n";
        }
       ?>
</ol>



만든 것 깔끔하게 보이게 수정하기 



왼쪽에 보이는 여백은 너무 크고 

내용이 많아질 경우 오른쪽 여백에 내용이 출력되는 것이 아닌, 아래쪽에 출력이 된다. 

여백 조정하기

구글 개발자 도구를 켜서 ol태그에 마우스를 가져다 대면 초록색으로 여백이 나온다.

박스 모델에서 오른쪽 40px의 여백이 있다는 것을 알 수 있는데 이것을 조정해 보자.

초록색 박스의 40 숫자를 더블 클릭해서 40을 0으로 바꿔보자

마음에 든 다면 style.css 파일에서 수정한다. 

style.css 에서

nav ol{
  list-style:none;
  padding:0;
}

아래쪽 컨텐츠가 내려간 것 수정하기

우선 실습하기 위해 2.txt안에 충분히 많은 내용의 텍스트를 입력하고 

개발자 도구에서 오른쪽 상단의 점 세개를 누르고 아래쪽으로 개발자 도구 위치하기를 누르면 좀더 원활하게 확인 가능하다.
 
article 부분에 마우스를 가져대 대 보면 article 상단이 윗 여백보다 많은 공간을 차지하고 있어 아래로 내려간 것을 확인할 수 있다. 

=> article의 width를 수정하면 해결될 것으로 보이는 문제이다. 

style.css 에서

article{
    ...
    width:500px;
}

article의 내용을 불러오는 것을 데이터베이스의 id 값을 이용해서 불러오기 

SELECT*FROM topic WHERE id=

이 코드를 이용해서 topic의 값을 id를 통해 얻을 수 있다. 

<?php
    $sql = 'SELECT*FROM topic WHERE id='.$_GET['id'];
?>

(SELECT * FROM topic; => topic에서 데이터를 가져오겠다. ) - 데이터베이스 이론에서 

여기서 이 값을 데이터베이스로 전송하기 위해서 

mysqli_query($conn, $sql); 여기서 conn 은 connet의 약자. 맨위의 php문에서 정의했다. 

$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
echo '<h2>'.$row['title'].'</h2>';

을 바로아래에 추가해서 가져온 값을 바로 출력할 수 있다. 

=> 실행시켜보면 id값이 존재하는 경우 ex) 1,2,3 은 잘 작동하지만 h1 태그를 클릭했을때 나오는 index.php에서는 제대로 작동하지 않는 것을 알 수 있다.

이를 해결하기 위해

if(empty($_GET['id]===false){
    $sql = 'SELECT*FROM topic WHERE id='.$_GET['id'];
    $result = mysqli_query($conn, $sql);
      $row = mysqli_fetch_assoc($result);
      echo '<h2>'.$row['title'].'</h2>';
    echo $row['description'];
}

  • 여기서 === 인 것은 오타가 아니라 더 자세히 체크한다는 뜻 여기서는 자세히 몰라도 된다. 



사용자가 입력한 내용을 데이터베이스로 보내기 => form

html 파일을 만들어서
 
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <input type="text">

  </body>
</html>


이러한 코드를 입력하면


이런 칸이 나온다. 

입력해야 할 정보가 많을 때는

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    제목 : <input type="text">
    본문 : <textarea></textarea>
  </body>
</html>


본문과 같은 textarea의 코드를 작성하면


이러한 칸이 나타나게 된다. 

각각 칸에 같은 줄에 있다.

하나의 단락이라는 것을 알려주기 위해 p태그 사용

그리고 아래에 제출하는 버튼을 만들기 위해 코드 추가.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>제목 : <input type="text"></p>
    <p>본문 : <textarea></textarea></p>
    <input type="submit">
  </body>
</html>

제출을 눌렀을 때 서버로 전송

=> 그 때 사용하는 태그 => form 태그

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <form action="https://localhost/phptem/3.php" method="GET" >
    <p>제목 : <input type="text"></p>
    <p>본문 : <textarea></textarea></p>
    <input type="submit">
    </form>
  </body>
</html>


form action 뒤의 링크의 의미

=> submit 버튼을 눌렀을 때 form안에 들어있는 control들을 (제목과 본론같이 안에 있는 것들을 control이라고 한다. )

=> control들에 입력된 정보를 action 속성에 지정된 에플리케이션에게 전송한다.


submit을 눌러 실행하면

=> 결과창


정보를 받게 하기 

3.php파일을 만들어서 안에

<?php
  echo $_GET['title'];
  echo $_GET['description'];
?>

이러한 코드를 넣는다.

상당히 큰 내용 넣어보기

description 안에 엄청 긴 내용을 넣어보자. 

다른 방법으로 전송해야 한다.

    <form action="https://localhost/phptem/3.php" method="POST" >

action에서 받는 method를 POST 방식으로 한다. 

그리고 3.php에서는 받는 것을 GET에서 POST로 바꿔준다.

<?php
  echo $_POST['title'];
  echo $_POST['description'];
?>



이전시간 form => 사용자의 정보를 서버로 전송하는 수단

데이터베이스를 직접 수정하지 않고 이 정보를 수정, 삭제 등등 관리하는 것을 배운다.

 

 

white black 버튼 아래에 write 버튼을 넣고 누르면 글을 작성하는 페이지로 가도록 만들고 싶다. 

그 페이지는 위의 영역을 그대로 유지하고 오른쪽 아래부분에 글을 작성하도록 하고 싶다.

=> 버튼 아래에 a href로 시작하는 코드 넣기 

  <div id="control">
    <input type="button" value="white" onclick="document.getElementById('target').className='white'"/>
    <input type="button" value="black" onclick="document.getElementById('target').className='black'"/>
  </div>
  <a href="http://localhost/phptem/write.php">쓰기</a>

그리고 형식을 똑같이 하고 싶으므로 write.php는 index.php를 duplicate 해서 생성한다. 

write.php 수정하기

<article>
    <form action="process.php" method="post">
      <p>
        제목 : <input type="text" name="title">
      </p>
      <p>
        작성자 : <input type="text" name="author">
      </p>
      <p>
        본문 : <textarea name="description"></textarea>
      </p>
        <input type="submit" name="name">
    </form>
  </article>

정보를 받기위해 process.php 만들기

<?php
  echo $_POST['title'];
  echo "<br>";
  echo $_POST['author'];
  echo "<br>";
  echo $_POST['description'];
  echo "<br>";
?>

데이터베이스(MySQL 에 저장하기)

먼저 저장할 데이터베이스 확인

=> sql monitor 켜서 DESC topic; 을 치면 topic의 상황을 보여준다.




현재상황 => 보면서 title, description, author, created 에 정보를 저장할 것이다. 


<?php
  $sql = "INSERT INTO topic(title,description,authormcreated) VALUES(".$_POST['title'].",".$_POST['description'].",".$_POST['author'].",now())";
  echo $sql;
?>


  • ,  를 " " 로 감쌀 때 shift + 방향키로 ,를 감싸고 "키를 누르면 자동으로 감싸게 입력해준다.  


출력결과

INSERT INTO topic(title,description,authormcreated) VALUES(123,12345678942,456789,now())

VALUES 안의 값 사이의 ' ' 가 필요한 것을 확인

<?php
  $sql = "INSERT INTO topic(title,description,authormcreated) VALUES('".$_POST['title']."','".$_POST['description']."','".$_POST['author']."',now())";
  echo $sql;
?>

출력결과

INSERT INTO topic(title,description,authormcreated) VALUES('123','12345678942','456789',now())

now()의 정체 => MySQL이가지고 있는 함수

지금 now의 위치 => created => created 는 Datetime 을 저장하는 곳

=> 현재시간을 저장하는 곳

값 이용하기 

우선 process.php 위에 mysql에 접속하는 코드를 넣는다

<?php
  $conn = mysqli_connect("localhost","root",17691769);
  mysqli_select_db($conn,'opentutorials');
  $result = mysqli_query($conn,'SELECT*FROM topic');
?>

그리고 이전에 작성한 php 코드와 합친다.

<?php
  $conn = mysqli_connect("localhost","root",17691769);
  mysqli_select_db($conn,'opentutorials');
  $sql = "INSERT INTO topic(title,description,author,created) VALUES('".$_POST['title']."','".$_POST['description']."','".$_POST['author']."',now())"; // 생성한 쿼리를 담음
  $result = mysqli_query($conn,$sql);
?>



실행하기 전에 database에 어떤 정보가 있는지 확인

mysql monitor에서 

SELECT id,title,author FROM topic; 입력


현재 들어있는 내용이고

process.php를 실행시키고 나면


데이터베이스에 추가가 된다. 


process.php 작업이 끝나면 원래의 창으로 보낼 수 있는 것 => Redirection

process.php 에

header('Location:http://localhost/phptem/index.php'); 를 추가한다

최종 process.php 코드 

<?php
  $conn = mysqli_connect("localhost","root",17691769);
  mysqli_select_db($conn,'opentutorials');
  $sql = "INSERT INTO topic(title,description,author,created) VALUES('".$_POST['title']."','".$_POST['description']."','".$_POST['author']."',now())"; // 생성한 쿼리를 담음
  $result = mysqli_query($conn,$sql);
  header('Location:http://localhost/phptem/index.php');
?>

'웹 프로그래밍' 카테고리의 다른 글

외부에서 Mysql 접속을 위해 고려해야 할 것들  (0) 2020.09.15
데이터베이스 MYSQL 이론  (0) 2017.12.23
PHP 실습  (0) 2017.12.22
JavaScript 실습  (0) 2017.12.21
JavaScript 실습  (0) 2017.12.20

+ Recent posts