WEB2 - PHP

PHP에서 글수정 기능 구현하기

수업소개

PHP를 이용해서 기존의 글을 수정하는 방법을 알려드립니다.

 

 

변경사항

index.php

<?php
function print_title(){
  if(isset($_GET['id'])){
    echo $_GET['id'];
  } else {
    echo "Welcome";
  }
}
function print_description(){
  if(isset($_GET['id'])){
    echo file_get_contents("data/".$_GET['id']);
  } else {
    echo "Hello, PHP";
  }
}
function print_list(){
  $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>\n";
      }
    }
    $i = $i + 1;
  }
}
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>
      <?php
      print_title();
      ?>
    </title>
  </head>
  <body>
    <h1><a href="index.php">WEB</a></h1>
    <ol>
      <?php
      print_list();
      ?>
    </ol>
    <a href="create.php">create</a>
    <?php if(isset($_GET['id'])) { ?>
      <a href="update.php?id=<?=$_GET['id']?>">update</a>
    <?php } ?>
    <h2>
      <?php
      print_title();
      ?>
    </h2>
    <?php
    print_description();
     ?>
  </body>
</html>

 

update.php

<?php
function print_title(){
  if(isset($_GET['id'])){
    echo $_GET['id'];
  } else {
    echo "Welcome";
  }
}
function print_description(){
  if(isset($_GET['id'])){
    echo file_get_contents("data/".$_GET['id']);
  } else {
    echo "Hello, PHP";
  }
}
function print_list(){
  $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>\n";
      }
    }
    $i = $i + 1;
  }
}
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>
      <?php
      print_title();
      ?>
    </title>
  </head>
  <body>
    <h1><a href="index.php">WEB</a></h1>
    <ol>
      <?php
      print_list();
      ?>
    </ol>
    <a href="create.php">create</a>
    <?php if(isset($_GET['id'])) { ?>
      <a href="update.php?id=<?=$_GET['id']?>">update</a>
    <?php } ?>
    <h2>
     <form action="update_process.php" method="post">
       <input type="hidden" name="old_title" value="<?=$_GET['id']?>">
       <p>
         <input type="text" name="title" placeholder="Title" value="<?php print_title(); ?>">
       </p>
       <p>
         <textarea name="description" placeholder="Description"><?php print_description(); ?></textarea>
       </p>
       <p>
         <input type="submit">
       </p>
     </form>
  </body>
</html>

 

update_process.php

<?php
rename('data/'.$_POST['old_title'], 'data/'.$_POST['title']);
file_put_contents('data/'.$_POST['title'], $_POST['description']);
header('Location: /index.php?id='.$_POST['title']);
?>

 

댓글

댓글 본문
  1. Cpt.MJ
    I'm here!!!
  2. enujo
    23.12.03 헤헷 업데이트된다냥
  3. 30늦은나이아니라고해줘
    너무 어렵다 20231012
  4. heartsound2
    좋은정보 감합니다
    대화보기
    • 드림보이
      2022.02.25. WEB2 - PHP - PHP에서 글수정 기능 구현하기 파트 수강완료
    • pmxsg
      2022.1.4. 수강
    • 뭉치우석
      ^^
    • Rkim
      header 관련 추가하면 혹시 index.php 파일을 root 폴더가 아니라
      하위 폴더 예를 들어 localhost/web2-php/index.php 이런 식으로 저장하신 분들은
      header('Location: /index.php?id='.$_POST['title']);
      이렇게 하면 실행이 안 될 겁니다.
      /index.php 로 하면 같은 폴더로 redirect하는 게 아니라
      root에 있는 index.php로 redirect 합니다.
      같은 폴더에 있는 index.php로 redirect하려면
      header('Location: index.php?id='.$_POST['title']);
      로 변경해서 실행하면 실행이 됩니다. 앞에 /가 없으면 같은 폴더에 있는 파일로, /가 있으면 root에 있는 파일명으로 redirect하네요 !
      header('Location: /web2-php/index.php?id='.$_POST['title']);
      또는 이렇게 해도 실행이 됩니다. 모든 폴더를 다 적어주어야 해서 불편하지만요.
    • acs0209
      감사합니다 준형님 덕분에 이해가 되네요
      대화보기
      • chimhyangmoo
        21.06.02
      • jwoh
        21-04-25
        혹시나 Redirection이 안되시는 분은 파일경로를 확인해서 파일경로에 맞게 코드를 작성하시면 될 것 같습니다.
        예를들어서 저는 HTDOC폴더에서 다시 php폴더를 만들어서 파일들을 만들었거든요.
        그럼
        header('Location: /php/index.php?id='.$_POST['title']); 이런식으로 작성하시면 되겠습니다.
        혹시 저처럼 헤매는 사람 있을까 봐 댓글 작성!
      • jeisyoon
        2021.04.14 글수정 기능 구현 - OK
      • PUNGY
        김준형님의 답변 너무 감사합니다! php 안에서 html 태그를 그냥 echo로 한번에 쓰면 되지, 굳이 php태그랑 html태그를 구분해서 복잡하게 쓸까라는 생각을 했었는데 답변을 통해 명쾌하게 해결되었네요!
        대화보기
        • 김준형
          <?php if(isset($_GET['id'])){
          echo "<a href=\"update.php?id=".$_GET['id']."\">update</a>";
          }
          ?> 이렇게 하는 것이 우선 맞습니다. update.php 링크 연결하기 위해 "" 앞에 \을 하는 것이고.
          ".$_GET['id']."\" 이부분을 질문 주셨는데
          잘라서 생각해보겠습니다. <a href="update.php?id=.$_GET['id']">update</a> 원래는 이걸 표현하고 싶은 겁니다. 하지만 html태그는 우선 ""에 감싸져 있어야합니다. 그래서 우선 "<a href="update.php?id=.$_GET['id']">update</a>"
          이렇게 된겁니다.
          여기서 "<a href ="이 되기 때문에 여기서 문자열이 끊깁니다. 하지만 링크에 속하는 "" 부분은 그대로를 유지해줘야하기 때문에 \"이 되는 것입니다. 그렇게 되면
          "<a href=\"update.php?id=$_GET['id']\">update</a>" 여기까지 왔습니다.
          하지만 여기서 문제가 있습니다. ""에서는 $는 함수나 변수처럼 사용이 가능하지만 ['id'] 부분은 문자처럼 사용이 돼서 변수나 함수에 속하지 않는 고정적인 문자가 됩니다. 그래서 아톰이나 비쥬얼 스튜디오에서 작성해보면['id'] 부분이 다른 문자랑 같은 색으로 보일 겁니다.
          그래서 여기서 php를 이어주는 . 이 필요합니다.
          "<a href=\"update.php?id= 이부분에서 "를 찍어 하나의 문자를 만들고 변수는 . 으로 연결시킵니다.
          .$_GET['id'].을 하고 다시 문자가 나타나기 때문에 "를 찍습니다.
          쉽게 생각하면 ""안에서 함수나 변수를 넣기 위해서는 변수나 함수앞에 "을 통해 문자열을 끊어주고 .을 이용해서 이어줍니다. 그리고 다시 문자열이 시작할 때 "를 통해 문자열을 시작해주시면 됩니다.

          하지만 echo "<li><a href = \"index.php?id=$list[$i]\">$list[$i]</a></li>"; 이거와 같은 경우에는 큰 따옴표 안에서는 변수나 함수가 적용이 됩니다. 근데 ['id']는 앞에 $표시가 없어 변수로 적용되는 것이 아니라 문자로 적용이 되어, .이 필요한 것입니다.

          이고잉님은 이런 번거로움을 줄이기 위해 위에 나타난 코드를 사용한 거에요!

          이해가 될지 모르겠는데ㅜ 궁금한점 다시 답변 주세용
          대화보기
          • 테루
            update주소를 보이게 할때 위와 같이 쓰는게 이해가 안되서 그냥 하나의 php코드로 썼는데요
            제가 써놓고도 왜 이렇게 되는지 이해가 안되서 여쭤봅니다.
            ".$_GET['id']." 이부분인데 왜 저렇게 써야만 작동이 될까요....???
            문자열을 나눈 거니까 .을 이용해서 연결 하는 건 알겠는데 저렇게 쓸 경우 문자열이 어떻게 나뉘는지 모르겠습니다..ㅠㅠㅠ

            작동은 잘되서 신기합니다 ㅋㅋㅋㅋ

            <?php if(isset($_GET['id'])){
            echo "<a href=\"update.php?id=".$_GET['id']."\">update</a>";
            }
            ?>
          • hanel_
            21.2.18
          • asumgm
            4번은 봤습니다... 왜 이렇게 하나씩 빼먹는지 참!!!!!!!!!!!!!!!
          • kkn1125
            21.01.05.화 완료~!
          • 우성짱
            좋아요!
          • siver
            완료
          • 김남규
            행복
          • 이서연
            완료
          • 아자요
            HTML, Java Script 완강 후 새로운 도전시작

            20.05.13일 / 완료
          • Lucas Trowman
            완료!
          • OneJae EE
            20.04.12 일 / 37세 비전공자 / 완료
          • 스티븐잡숴
            완료
          • moon
            항상 감사합니다.!!
          • 햄쮸맨
            오우! 맞나 아닌가 확인하려고 보니까 앞에 생각은 얼추 맞은거 같은데 뒤는 틀렸네요. hidden기능은 있는 줄 몰랐는데 으헤헤;;
          • 햄쮸맨
            와 이번건 직접 풀어보려고 고민해봤는데 직접 짜는건 역시 어렵네용! 처음에 update_process.php에서 rename()을 써야하는건 알았어요.근데 예전 이름하고 현재 이름을 받아와야 하기에 Post로 새 이름을 받고 get으로 전 이름을 받아오나??? 막 이런 말도 안되는 생각을 했어요.ㅎㅎ.그 후엔 POST로 둘 다 받아서 변수 두개를 선언하고 하나는 옛 이름 A 하나는 새 이름 B로 받고 까지는 생각을 했더랬죠? 그래서 다시 update.php로 돌아와서 if 선언 하고 만약 id 가 달라지는 경우에는 A와 B를 전송하는 폼을 짜자는 생각을 했어요.그러고서 직접 그걸 코드로 짜려고 하니까 또 어렵네요 ㅎㅅㅎ)..
          • 몽글몽글솜사탕
            감사합니다
          • 허공
            190507 감사합니다.
          • 하 재밌어
          • 이희재
            update_process.php 에서
            $_GET['id'] 를 쓸 수 없는게

            <form action="~.php"></form>으로 인해 넘어간 ~.php 에선 어디까지 정보를 쓸수있냐??
            form 문 안에서 name 된것만 쓸 수 있는 것 같다.
            ~.php 전의 .php 문서의 form 문에서는 알 수 있는 id를
            ~.php 에선 알 수 없다.

            그래서 어쩔 수 없이
            <input type="hidden" name="old_title" value="<?=$_GET['id']?>">
            이런 식으로 id 값을 새로운 name 의 old_title 로 넘겨서 사용한다.


            일단 이렇게 혼잣말 하듯이 이해를 한 상태인데
            이게 확실한 건지 잘 모르겠습니다.
          • 요정
            감사요^^ 도움이 되었습니다~
            대화보기
            • Gihoon Pomme Ryu
              완료. 고맙습니다.
            • <a>태그는 html 문법을 따르고, php에서는 에러가 나기 때문에 php 태그에서 빼야 출력합니다.
              따라서 전체 코드 중 html 문법의 코드를 제외한 부분만 php 문법의 코드로 wrapping 한 것으로 생각됩니다.
              대화보기
              • 로버트한
                감사함을 드립니다.^^
              • kong Snag Cheol
                강의 감사 드려요. //
              • 어거스틴
                _process.php 부분에서 리디렉션이 안될때

                쏘스코드 중 header('Location: /index.php?id='.$_POST['title']); 이 부분을
                아래처럼 빠꿔주시면 잘됩니다

                $host = $_SERVER['HTTP_HOST'];
                $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
                $extra = 'index.php';
                header("Location: http://$host$uri/$extra");
                exit;
              • 제갈량
                update_process.php파일에서
                header안에 있는 "Location:~~"이 부분이
                콜론 다음에 공백이 있으면 에러가 나네요.
                참고하시길 바랍니다.
                create_process.php 파일도 마찬가지구요.
              • 저는 xampp로 아파치를 실행시키는데요. Error: Apache shutdown unexpectedly. 이런에러로인해
                서버포트를 localhost:8080으로 바꿧는데요.( https://www.youtube.com......NXk 이 영상을보면서요.)
                header('Location: /index.php?id='.$_POST['title']); 이렇게 하면
                오류가 뜨는것도 아니고 페이지가 정상적으로 뜨는것도 아닌 그냥 localhost:8080/dashboard/ xampp홈페이지가 뜨는데요ㅠㅠ
                이런거는 어디 물어볼곳도 없고해서 질문올려봐요..
                대화보기
                • 마샤
                  질문 있습니다.

                  <?php if(isset($_GET['id'])){ ?>
                  <a href="update.php">update</a>
                  <?php } ?>

                  위 코드에서 <?php >?를 쓰고 a태그를 쓰고 다시 <?php ?>를 쓰는 이유가 있나요?

                  아래와 같이 쓰면 작동이 안 돼 위처럼 쓰는 건 알겠습니다.

                  <?php if(isset($_GET['id'])){
                  <a href="update.php">update</a>
                  } ?>

                  다만 특별한 이유가 있는 건지, 제가 모르는 php 속성이 있는 건지 알고 싶습니다. 고맙습니다.
                • 헬리사우드
                  header함수로 meta태그에 들어갈 내용을 집어넣는건가요?
                • Mingi Son
                  강의 감사합니다!
                • Kyoungil Lee
                  자칫 놓칠뻔했지만 잘 들었습니다 감사합니다
                버전 관리
                egoing
                현재 버전
                선택 버전
                graphittie 자세히 보기