본문 바로가기
  • think normal
새로워지기/서른의 생활코딩

생활코딩 따라하기 WEB2 - PHP _ CRUD를 MySQL로 구현해보기

by 청춘만화 2019. 3. 4.

php 생활코딩 2019.03.03

생활코딩 따라하기 WEB2 - PHP _ CRUD를 MySQL로 구현해보기 

 


실습 내용
 : https://opentutorials.org/course/3167

실습 결과 : http://127.0.0.1:8080/index.php  ( <— MAMP 실행 후, 브라우저 주소 창에 입력 )


개발 환경 : MAC OS 



database 준비

MySQL 접속 

cd /Applications/mampstack-7.1.26-2/mysql/bin

./mysql -uroot -p 


데이터베이스 생성 

CREATE DATABASE opentutorials;

show databases;

use opentutorials;


테이블 생성 

create table topic(

    id int(11) not null auto_increment,

    title varchar(45) not null,

    description text,

    created datetime not null,

    primary key(id)

    )engine=InnoDB;


원리 

php <-> MySQL server <-> MySQL Client( Monitor… )

(=MySQL Clien)

php MySQL api

Recommended API   ->  mysqli or PDO_MySQL

* 추천 : PDO_MySQL 객체를 기준으로 사용, 오라클 등과 손쉽게 연계(교체)할 수 있다.


MySQL = MySQL Improved

가이드 : http://php.net/manual/en/book.mysqli.php

데이터베이스 제어

함수방식 & 객체방식 : http://php.net/manual/en/mysqli.quickstart.dual-interface.php


실습 

mysqli_connect( );

http://php.net/manual/en/mysqli.construct.php

connect_test.php

<?php

$link = mysqli_connect('localhost','root','ever1227','opentutorials');

if (!$link) {

    die('Connect Error (' . mysqli_connect_errno() . ') '

            . mysqli_connect_error());

}

echo 'Success... ' . mysqli_get_host_info($link) . "\n";

mysqli_close($link);

  ?>

php 서버에서 어떤 일이 일어나는지 확인 

키워드 : mysql general_log enable


mysqli_query()

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

var_dump($result);

var_dump($result ->num_rows);


mysqli_fetch_array()

$row = mysqli_fetch_array($result);

print_r($row);

//없으면 null


연관배열

echo '<h1>'.$row['title'].'</h1>';


while(boolean)

null = false

not null = true


파라미터를 sql 에 조합하기  

$sql = "SELECT * FROM topic where id={ $_GET['id'] }";


배열에 담기

$article = array(

  "title" => $row["title"],

  "description" => $row["description"]

);


사용 시 ->  $article['title']


속성 확인하기

print_r($article);


사용자를 통해 입력될 수 있는 부분은 모두 보안처리

URL의 경우

$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);

INPUT의 경우

mysqli_real_escape_string($conn, $_POST['title'])


개인적으로 헷갈리는 부분

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

$sql = "SELECT * FROM topic where id={$_GET['id']}";

$update_link = "<a href=\"update.php?id=". $_GET['id'] ."\">update</a> “; }

<p><input type="text" name="title" placeholder="title" value=“<?=$article['title'] ?>"></p>

<p><input type="text" name="title" placeholder="title" value="<?php echo $article['title'] ?>"></p>


자료형에 맞춰 인자값의 타입을 변환시키기 

settype($_POST['id'], "integer");


SQL 넘기기 전에 브라우저에서 쿼리만 확인하기  

die($sql);



필터링 : 크로스사이트스크립팅 공격을 방어하기 - htmlspecialchars 

$escaped= array(

  'name' => '',

  'profile' => ''

);


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

/타입1

  $filtered_id = mysqli_real_escape_string($conn, $_GET['id']);

  settype($filtered_id,"integer");

  $sql="select * from author where id={$filtered_id}";

  

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

  $row = mysqli_fetch_array($result);


//타입2

  $escaped['name']= htmlspecialchars($row['name']);

  $escaped['profile']= htmlspecialchars($row['profile']);

}



리다이렉트 

header('Location : author.php');



관련 소스 :  htdocs_2-1.zip

                     <-- 첨부파일을 넣어야할 위치입니다. 

 




+ 추가 수업 : 관계형 데이터베이스 적용 예제 


테이블을 하나 더 추가 하고 

테이블을 JOIN 해서 다시 CRUD하는 과정


조인 코드 예

  $sql = "SELECT * FROM topic LEFT JOIN author ON topic.author_id=author.id where topic.id={$filtered_id}";



관련 소스 :  htdocs2-2.zip

                     <-- 첨부파일을 넣어야할 위치입니다. 



이런... 이슈가 발생...  <--   이 부분이  먹지를 않는다..


  $table_form .= '

    <tr>

      <td>'.$filtered['id'].'</td>

      <td>'.$filtered['name'].'</td>

      <td>'.$filtered['profile'].'</td>

      <td><a href ="author.php?id='.$filtered['id'].'">update</a></td>

      <td>

        <form action="process_delete_author.php" method="post" onsubmit="conform(\'sure?\');">

          <input type="hidden" name="id" value="'.$filtered['id'].'">

          <input type="submit" value="delete">

        </form>

      </td>

    </tr>

  ';



댓글