서버(PHP)통신 with Web_GET_POST_DB저장

소정·2023년 3월 13일
0

php

목록 보기
2/3

[1] 사용자의 요청규약(request)

사용자가 보낸 요청값을 처리하는 곳(웹프로그래밍)으로 아파치가 보내줌
(ex. php(싱글스레드 처리:대량처리 어려움, 무료) / asp(윈도우 용)/ jsp(유료)/ node.js(자바스크립을 서버로))

php : 인터프리터 / 컴파일 안함


1) php 작성

c 언어를 기준으로 만듦

php에서 변수를 지칭하는 문자 : $ (유일)

$_ : 원래부터 php가 정해둔 변수들(super전역변수) ex) $_GET, $_POST

php에선 배열 종류
1. 인덱스 배열
2. 연관배열(map방식) : [] 안에 input에 name 쓴다
msg=msg=_GET['msg'];


2) get 방식

서버 주소 뒤에 요청값을 보내는 것, url 뒤에 붙여서 보냄, 보안취약, but 속도 빠름

<!DOCTYPE html>
<html>

    <head>
        <title>Http Request</title>
        <meta charset="utf-8">
    </head>

    <body>
        <h2>This is http Request Test page</h2>

        <fieldset>
            <legend>GET METHOD TEST</legend>

            <!-- HTML에서 서버의 다른 문서를 실행하는 요소 - HTTP를 요청하는... -->
            <form action="./getText.php" method="GET">
                <!-- php 문서에 보낼 데이터 입력받는 요소들 -->

                <p>
                    <label for="title">title:</label>
                    <input type="text" name="title">
                </p>

                <p>
                    <label for="msg">message:</label>
                    <input type="text" name="msg">
                </p>

                <p>
                    <!-- form요소 안에서 서버로 데이터 전송하는 버튼 -->
                    <!-- 이 버튼을 클릭하면 form요소에 action 속성에 지정한 문서가 실행됨 -->
                    <!-- file:///D:/AndroidGiraffe/Web/02HttpRequest/getText.php?title=aaa&msg=hello -->
                    <input type="submit">
                </p>

            </form>

        </fieldset>

    </body>

</html>

<?php

    //0.php문서가 응답하는 데이터의 형식지정, 한글깨짐(인코딩) 방지 설정
    header('Content-Type:text/html; charset=utf-8');

    //1.php에서는 $가 변수를 지칭하는 문자 - 자동 문자 변환
    //사용자가 get방식으로 보낸 값들을 $_GET[](값들이니까 배열로)이라는 수퍼전역 변수에 저장함
    // ($_ : 원래부터 php가 정해둔 변수들 : super전역변수)
    //$title=$_GET[0]; //인덱스 배열
    $title=$_GET['title'];
    $msg=$_GET['msg'];

    //php에선 배열  종류
    //1. 인덱스 배열
    //2. 연관배열(map방식) = [] 안에 input name 이름 쓴다


    //잘 받았는지 확인해 보기 위해 응답 : echo
    //php 에서 . 은 문자열 결합 연산자
    echo "제목 : " . $title ."<br>";
    echo "메세지 : " . $msg;

?>

3) post 방식

사용자의 요청값을 body안에 숨겨서 보내는 것

<!DOCTYPE html>
<html>

    <head>
        <title>Http Request</title>
        <meta charset="utf-8">
    </head>

    <body>

        <fieldset>
            <legend>POST METHOD TEST</legend>
            <!-- file:///D:/AndroidGiraffe/Web/02HttpRequest/postText.php -->

            <form action="./postText.php" method="post">
                <p>
                    <label for="id">아이디 : </label>
                    <input type="text" name="id">
                </p>
                <p>
                    <label for="passwd">비밀번호 : </label>
                    <input type="password" name="pwd">
                </p>
                <p>
                    <input type="submit">
                    <input type="reset">
                </p>
            </form>
        </fieldset>

    </body>

</html>

<?php

    header('Content-Type:text/html; charset=utf-8');

    //사용자가 post방법으로 보낸 데이터들은 $_POST[]이라는 배열에 저장되어 있음
    $id= $_POST['id'];
    $password=$_POST['pwd'];

    //잘 받았는지 확인하기 위해 사용자 [web brower]에게 응답 Request
    echo "아이디 : $id <br>"; //php ""안에서는 $가 변수로 인식됨
    echo "비밀번호 : $password";
?>

4) 파일 업로드

  • html에 form에 꼭 enctype="multipart/form-data" 속성 넣어줘야 파일 전송됨
  • file을 보내면 파일은 정보를 가진 헤더와 바이트 덩어리를 가진 바디가 서버에 도착한다
  • 서버에 도착하면 무서운 바디정보는 임시저장소(tmp)에 넣어두고 헤더 정보만 읽는다
  • 헤더에 에러없이 잘 왔으면 영구저장소에 move 시켜야함

<!DOCTYPE html>
<html>

    <head>
        <title>Http Request</title>
        <meta charset="utf-8">
    </head>

    <body>
        <fieldset>
            <legend>Image File Upload</legend>
            <!-- 파일은 바이트 덩어리임 기본 enctype으로 보내면 head 정보(meta)를 주지않아 이미지 인지 모른다-->
            <!-- form의 기본 enctype은 enctype="application/x-www-form-urlencoded"-->
            <!-- 파일(이미지)를 보내려면 enctype="multipart/form-data"를 써줘야함 -->
            <form action="./uploadFile.php" method="post" enctype="multipart/form-data">
                <!-- 사용자가 파일을 선택할 수 있도록 하는 입력 요소 -->
                <input type="file" accept=".jpg" name="img">
                <br><br>
                <input type="submit">
            </form>
        </fieldset>
    </body>

</html>

<?php
    header('Content-Type:text/html; charset=utf-8');

    //사용자가 File을 보내면 실제 파일데이터들은 임시저장소(tmp)에 임시로 저장되어
    //이 php 문서에는 File의 정보만 전달됨
    //그 정보들은 $_FILES[] 에 저장됨

    //file을 보내면 파일은 정보를 가진 헤더와 바이트 덩어리를 가진 바디가 서버에 도착한다
    //서버에 도착하면 무서운 바디정보는 임시저장소(tmp)에 넣어두고 헤더 정보만 읽는다
    //헤더에 에러없이 잘 왔으면 영구저장소에 move 시켜야함

    $file = $_FILES['img'];

    //$file 변수도 배열임 즉 $file배열 변수 안에 전송된 파일에 대한 여러정보(헤더 정보)가 있음
    // $file[''] : []안에 이름은 정해진 이름임 
    $srcName = $file['name']; //원본 파일명
    $type= $file['type']; //파일의 타입
    $size= $file['size']; //파일 크기
    $tmpName= $file['tmp_name']; //파일 데이터가 저장된 임시 저장소의 파일 주소(위치)
    $error= $file['error']; //에러 정보

    //제대로 왔는지 확인해보기 위해 출력(응답)
    echo "$srcName <br>";
    echo "$type <br>";
    echo "$size <br>";
    echo "$tmpName <br>";
    echo "$error <br>"; //0 : 에러 없음

    //정보가 잘 확인 되었다면 분명 서버에 이미지파일이 전송된 것
    //하지만 이 파일데이터는 임시저장소에 저장되어 있어서 이 php 가 끝나면 삭제된다
    //온전히 업로드를 하려면 임시저장소에 있는 파일[$tmpName]을 
    //영구히 사라지지 않는 본인폴더(html폴더 안) 쪽으로 이동해야함
    //이 php문서가 있는 폴더에 [upload]라는 폴더를 새로 만들어서
    //이 폴더 안으로 이동시키기

    $dstName="./upload/".date('YmdHis').$srcName; //이름을 오늘날짜 (Y = yyyy / H = 24기준)
    //파일질라는 폴더 자동으로 못 만듦 올리기 전에 미리 만들어야함

    //임시저장소($tmpName)에 있는 파일을 원하는 위치($dstName)로 이동
    $result = move_uploaded_file($tmpName, $dstName); //(~에서/ 어디로)

    if($result) {
        echo "success upload";
    } else {
        echo "fail upload";
    }

?>

데이터와 파일 업로드 한번에 해보기

<!DOCTYPE html>
<html>

    <head>
        <title>Http Request</title>
        <meta charset="utf-8">
    </head>

    <body>  

        <fieldset>

            <legend>POST data whit File</legend>

            <form action="./postDataFile.php" method="post" enctype="multipart/form-data">
                
                <p>
                    <label for="name">name : </label>
                    <input type="text" name="name">
                </p>

                <p>
                    <label for="msg">message : </label>
                    <input type="text" name="msg">
                </p>

                <p>
                    <label for="img">첨부 이미지 : </label>
                    <input type="file" accept="Image/*" name="img">
                </p>
        
                <input type="submit" value="작성완료">
                <input type="reset" value="취소">
            </form>

        </fieldset>

    </body>

</html>
<?php

    header('Content-Type:text/html; charset=utf-8');

    //사용자로부터 전달된 데이터와 파일정보를 받기
    //글씨와 파일 따로따로 받아야함

    $name = $_POST['name'];
    $message=$_POST['msg'];

    $file = $_FILES['img'];
    //파일의 세부 정보 5개 중에서 가용할 것들만
    $srcName = $file['name'];
    $tmpName = $file['tmp_name'];

    //업로드된 파일이 영구적으로 저장될 위치
    $dstName="./upload/".date('YmdHis').$srcName;
    $moveResult = move_uploaded_file($tmpName, $dstName);

    if($moveResult) echo "success";
    else echo "fail";

    echo "<br>";
    
?>

[2] DB 테이블에 값 넣기

사용순서

  1. MySQL DB에 접속하기
$db = mysqli_connect(DB서버주소, DB접속 아이디, DB접속 비번, DB); 
  1. mySQL DB는 한글이 깨짐 [한글도 저장하도록 쿼리 요청]
mysqli_query($db, "set names utf8");
  1. 원하는 쿼리 작업 수행
  • insert
$sql= "INSERT INTO board(name, msg, file, date) VALUES ('$name', '$message', '$dstName', '$now')";
  • selectAll
 if($result) { //c언어는 0이 아님 다 참임~ (== 뭐냐 라고 안물어도 됨)

    //총 레코드(한 줄 : row) 수 
    $rowNum = mysqli_num_rows($result); 
    // $rowNum = mysqli_num_calums();

    for($i=0; $i<$rowNum; $i++){
        $row=mysqli_fetch_array($result , MYSQLI_ASSOC); 
        //한줄을 배열로 읽어오는 것,  연관배열로 받기 설정 : ($result , MYSQLI_ASSOC);
        //MYSQLI_NUM : 디폴트 , 인덱스 배열

        $no = $row['no']; //배열의 칸번호 대신 식별자 사용 [연관 배열] DB의 컬럼명과 동일해야함
        $name= $row['name'];
        $message= $row['msg'];
        $file= $row['file'];
        $date= $row['date'];

        echo "<h2> $no  $name</h2>";
        echo "<p> $message </p>";
        echo "<p> $date </p>";

        if($file != null) echo "<img src='$file' whith='50%' alt='$file'>";
            echo "<br>=================================================<br><br>";
        }

    } else echo "connect fail";
  1. DB연결 종료
mysqli_close($db);

php 총 코드

1. insert

<?php

    header('Content-Type:text/html; charset=utf-8');

    //사용자로부터 전달된 데이터와 파일정보를 받기
    //글씨와 파일 따로따로 받아야함

    $name = $_POST['name'];
    $message=$_POST['msg'];

    $file = $_FILES['img'];
    //파일의 세부 정보 5개 중에서 가용할 것들만
    $srcName = $file['name'];
    $tmpName = $file['tmp_name'];

    //업로드된 파일이 영구적으로 저장될 위치
    $dstName="./upload/".date('YmdHis').$srcName;
    $moveResult = move_uploaded_file($tmpName, $dstName);

    if($moveResult) echo "success";
    else echo "fail";

    echo "<br>";

    //테이블에 저장할 값 
    //저장할 날짜와 시간 
    $now = date('Y-m-d H:i:s');

    //전송된 데이터들 ($name, $message, $ dstName, $now)을 DB에 저장
    //dothome 서버에는 이미 DBMS(MySQL)이 설치되어 있음

    //MySQL이라는 DBMS를 이용하여 데이터를 저장하기
    //1. MySQL DB에 접속하기
    $db = mysqli_connect('localhost', DB접속 아이디, DB접속 비번, DB); 
    // 파라미터 4개 : DB서버주소, DB접속 아이디, DB접속 비번, DB명
    //닷홈은 php와 db가 같은 컴퓨터 안에 있음 그래서 DB서버주소 : localhost
    // $db : 연결된 db를 제어하는 객체

    //2. mySQL DB는 한글이 깨짐 [한글도 저장하도록 쿼리 요청]
    mysqli_query($db, "set names utf8"); //정해진 키워드임!! (~통해서, ~를)
 
    //3. 원하는 쿼리 작업 수행
    // DB에 저장하고자 하는 데이터들($name, $message, $ dstName, $now)을 
    // 'board' 라는 이름의 테이블(표)에 삽입(insert)하는 명령어(SQL)
    $sql= "INSERT INTO board(name, msg, file, date) VALUES ('$name', '$message', '$dstName', '$now')";
    $result = mysqli_query($db,$sql); //리턴값이 있음

    if($result) echo "insert success";
    else echo "insert fail";

    //4. DB연결 종료
    mysqli_close($db);

?>

2. selectAll

<?php

    header('Content-Type:text/html; charset=utf-8');

    //1. MYSQL 접속
    $db = mysqli_connect('localhost', DB접속 아이디, DB접속 비번, DB);

    //2. 인코딩
    mysqli_query($db, 'set names utf8');

    //3. board 테이블의 테이블 읽어오기 (select)
    $sql = "SELECT * FROM board";
    $result = mysqli_query($db, $sql); //쿼리문에 따른 검색'결과표' 리턴해줌
    //원본 테이블을 건드리지 않음 결과표셋으로 내가 요청한 결과를 가져오고 그걸 읽음

    if($result) { //c언어는 0이 아님 다 참임~ (== 뭐냐 라고 안물어도 됨)

        //총 레코드(한 줄 : row) 수 
        $rowNum = mysqli_num_rows($result); 
        // $rowNum = mysqli_num_calums();

        for($i=0; $i<$rowNum; $i++){
            $row=mysqli_fetch_array($result , MYSQLI_ASSOC); 
            //한줄을 배열로 읽어오는 것,  연관배열로 받기 설정 : ($result , MYSQLI_ASSOC);
            //MYSQLI_NUM : 디폴트 , 인덱스 배열

            $no = $row['no']; //배열의 칸번호 대신 식별자 사용 [연관 배열] DB의 컬럼명과 동일해야함
            $name= $row['name'];
            $message= $row['msg'];
            $file= $row['file'];
            $date= $row['date'];

            echo "<h2> $no  $name</h2>";
            echo "<p> $message </p>";
            echo "<p> $date </p>";

            if($file != null) echo "<img src='$file' whith='50%' alt='$file'>";
            echo "<br>=================================================<br><br>";
        }

    } else echo "connect fail";

    //4. 쿼리 닫기
    mysqli_close($db);

?>
profile
보조기억장치

0개의 댓글