html/php 학습

Simcurity·2023년 5월 2일
0

html/css/javascript/php

목록 보기
3/4

오늘도 php에 대해 학습하겠습니다.

1. 사용자 정의 함수 만들기

일단 가장 쉬운 print함수를 정의해보겠습니다.

<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <title></title>
</head>
<body>
        <h1>function</h1>
        <?php
                function printfn() {
                        print("php is web language<br>");
                        print("security is essential<br>");
                }

                printfn();
        ?>
</body>
</html>


함수를 정의 후 호출 한 모습입니다.

1-1) 더하기 함수

<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <title></title>
</head>
<body>
        <h1>add</h1>
        <?php
                function addfn($left, $right) {
                        print($left + $right);
                        print("<br>");
                }
                addfn(2,4);
        ?>
</body>
</html>


여기서 함수의 $left, $right는 매개변수, 입력된 2, 4는 입력 값이라고 합니다.

file_put_contents() : 내용을 집어넣는 함수

title을 지정하는 부분을 함수로 정의하는 경우

<?php
        function titlename() {
        if(isset($_GET['id'])){
                echo $_GET['id'];
        } else {
                echo "Welcome";
        }
        }
?>

<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <title>
                <?php
                        titlename();
                ?>
        </title>
</head>


미리 함수를 정의하여 해당 함수만 가져다쓰는것으로 간단하게 기능 구현 가능
또한, 가독성증가

함수 구현 후 다시 만든 페이지

index.php 파일
<?php
        function titlename() {
        if(isset($_GET['id'])){
                echo $_GET['id'];
        } else {
                echo "Welcome";
        }
        }

        function li() {
                $list = scandir("./data");
                $i = 0;
                while($i < count($list)) {
                        if($list[$i] != '.') {
                                if($list[$i] != '..') {
                                        echo "<li><a href = \"index.php?id=$list[$i]\">$list[$i]</a></li><br>";
                                }
                        }
                        $i = $i +1;
                }
        }

        function name() {
                if(isset($_GET['id'])) {
                        echo $_GET['id'];
                } else {
                        echo "Welcome";
                }
        }

        function content() {
                if(isset($_GET['id'])) {
                        echo file_get_contents("data/".$_GET['id']);
                } else {
                        echo "Hello PHP";
                }
        }
?>

<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <title>
                <?php
                        titlename();
                ?>
        </title>
</head>
<body>
        <h1><a href = "index.php">WEB</a></h1>
        <ol>
                <?php
                        li()
                ?>
        </ol>
        <h2>
        <?php
                name()
        ?>
        </h2>
        <h3>
        <?php
                content()
        ?>
</body>
</html>


함수는 정리정돈의 도구

2. 웹앱 만들기 (CRUD)

사용자가 직접 글을 작성하여 /data디렉터리안에 파일이 생성되도록 하려면 어떻게 해야할까요
이번에는 사용자가 등록하고 수정, 삭제하는 기능을 만들어보겠습니다.
정보시스템에서 가장 처음에 해야할 일 -> CRUD

<input type = "text" placeholder = "title"/>
-----> text를 입력받는 박스를 만들고 회색 글씨로 title써져있음
<input type = "submit"/>
-----> 제출 버튼 생성
<textarea name = "description"></textarea>
-----> 텍스트 적을 수 있는 공간 생성
<p>
태그
</p>
-----> 태그를 줄 바꿈할수 있는 태그

아직 해당 제출 정보를 어떤 페이지로 전달할지 정하지 않아서 동작하지 않습니다.

<form action="전달할 페이지">
코드
</form>

다음과 같이 전달할 페이지 지정

제출 버튼 클릭 시 form.php로 이동한 모습
(연관배열 : 숫자 대신 문자로 값을 가져올 수 있는 배열)
form.php 작성

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

2-1) Create

file_put_contents() 함수를 이용한 데이터 생성

<?php
        file_put_contents("data/".$_POST['title'], $_POST['description']);
?>

form.php 다음과 같이 작성

post방식으로 데이터 전달을 위해 수정
만약 method 미지정 시 기본 값은 GET방식으로 전송

<form action = "form.php" method = "post">

form.php 에서도 수정 GET ---> POST

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

그런데 계속 data/밑에 파일이 생성되지 않았습니다... 도대체 왜 이러는지 모르겠네요.
file_put_contents() 함수 위에 echo로 타이틀과 내용을 출력해보았는데 정상적으로 나오는데 파일이 생성이 안됩니다..
그렇게 기나긴 구글링 여정 끝에 답이 안나와서 포기하려다가 지피티에게 물어보았는데 권한 문제일 수 있다고 말해주었습니다 ㅋㅋㅋㅋ

와 진짜 지피티는 천재네요... 내가 멍청한건가..

쨋든 그래서 data디렉터리 권한을 777로 주고 해보니

드디어 파일이 생성되었습니다 ㅠ

2-2) Read

index.php에 create기능을 추가해 구현해주고 파일 생성 시 흰 배경으로 나타나지 않고 정상적인 페이지가 나오도록 create.process.php파일 수정해주었습니다.
file_put_contents()함수 아래
header('Location: /index.php?id='.$_POST['title']); 추가 ---> 페이지 리다이렉션

GPT라는 타이틀로 is smart라는 내용의 파일 생성 시

여기까지 CRUD중 Create기능과 Read기능을 만들어보았습니다.

2-3) Update

글 내용을 수정하는 update기능을 추가해보겠습니다.
만약 글이 지정되지 않은경우 update기능이 나오면 안되므로 if문을 써서 id파라미터 값이 존재하는 경우에만 기능이 보이도록 수정하겠습니다.

index.php 파일
  <a href = "create.php">create</a>
        <?php
             if(isset($_GET['id']) {?>
                   <h1><a href = "update.php?id="<?= $_GET['id'];?>">Update</a></h1>
        <?php
        }
        ?>
        ...

index.php 파일에서 Update링크를 추가해주고 update.php파일로 복사 후 제목과 본문을 바꿔줍니다.
여기서 코드를 더욱 간결히 바꾸려면

부분을 로 수정해줄 수 있습니다.

value 값은 기본값을 설정하는 속성
value를 이용한 원본 내용이 고정되있게 하는 코드

update.php 파일
  <a href = "create.php">Create</a>
        <?php
                                if(isset($_GET['id'])) {?>
                                        <a href = "update.php?id=<?= $_GET['id'];?>">Update</a>
        <?php } ?>

        <form action = "create.process.php" method = "POST">
        <p>
        <input type = "text" name = "title" placeholder = "Title" value = "<?php name();?>" />
        </p>
        <p>
        <textarea name = "description" placeholder = "Description" ><?php content();?></textarea>
        </p>
        <p>
                <input type = "submit" value = "Submit"/>
        </p>

이렇게 하면 value 값이 해당 함수 출력 값으로 고정

이제 업데이트 시 리다이렉션할 페이지 설정을 하겠습니다.
업데이트 작업 파일로 보내는 폼 태그 추가

사용자가 수정한 내용을 재정의하기 위해선 php file name change인 rename 함수를 사용합니다.
rename(oldname, newname)
일단 hidden 태그를 사용해 이전에 사용된 제목을 지정해줍니다.

<input type = "hidden" name = "old_title" value = "<?= $_GET['id'];?>" />

hidden 태그는 사용자에게 노출되지 않으면서 submit버튼 클릭 시 action이 가리키는 곳으로 어떠한 데이터를 전송이 필요할 때 사용하는 태그입니다.

그리고 update.process.php파일을 만들어줍니다.

update.process.php파일
<?php
		rename('data/'.$_POST['old_title'], 'data/'.$_POST['title']);
?>

rename의 첫 번째 인자는 이전이름 두 번째 인자는 새로운 이름이므로 hidden 태그는 사용하기 유용한 태그입니다.

파일 명이 변경되었습니다.

그럼 이제 파일 내용도 바꿔주겠습니다.
update.process.php 파일에서

file_put_contents('data/'.$_POST['title'], $_POST['description']); 추가


파일 내용 변경

마지막으로 파일 업데이트 후 흰 배경이 아닌 정상적인 페이지로 리다이렉션 해주겠습니다.
update.process.php 파일에

header('Location: /index.php?id='.$_POST['title']); 추가


업데이트 후에도 index.php페이지 반환

여기까지 U의 과정이었습니다.

2-4) Delete

마지막 삭제 과정을 정리해보겠습니다.
일단 삭제 버튼을 index페이지에 만들어보겠습니다.
업데이트와 마찬가지로 id값이 있을 경우 나타나게 만들겠습니다.

index.php 파일
   <a href = "create.php">Create</a><br>
        <?php
             if(isset($_GET['id'])) {?>
                    <a href = "update.php?id=<?= $_GET['id'];?>">Update</a><br>
                    <a href = "delete.process.php?id=<?= $_GET['id'];?>">Delete</a>
<?php } ?>

삭제는 추가적인 폼을 거칠 필요가 없으므로 바로 delete.process.php로 갑니다.
이제 delete.process.php 파일을 만들겠습니다.
php file delete 해주는 함수는 unlink()가 있습니다.
unlink('파일 명'); 과 같은 형식입니다.

update.process.php 파일
<?php
unlink('data/'.$_GET['id']);
header('Location: /index.php');
?>


삭제된 GPT 파일

그러나 이렇게 삭제하는 기능을 링크로 구현하는 것은 매우 나쁜 행동이라고 합니다.
링크를 들어가는 것만으로 파일이 삭제되기 때문입니다.
그러므로 우리는 post방식으로 파라미터 값을 숨기고 hidden 태그를 이용해 전달되는 값을 숨겨줍니다.

index.php 파일
 <a href = "create.php">Create</a><br>
        <?php
                                if(isset($_GET['id'])) {?>
                                        <a href = "update.php?id=<?= $_GET['id'];?>">Update</a><br>
                                <form action = "delete.process.php" method = "POST">    
                                <p>     
                                <input type = "hidden" name = "id" value = "<?= $_GET['id'];?>"/>       
                                </p>    
                                <input type = "submit" value = "Delete"/>       
                                </p>    
                                </form> 
        <?php } ?>           


빨라서 잘 보이지 않지만 삭제 버튼 클릭 시 delete.process.php를 호출 할때 post방식으로 페이지가 호출됩니다.

여기까지 CRUD 구현을 마치겠습니다.

참고 : 생활코딩 PHP+MySQL

0개의 댓글