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>
    <h2>
      <?php
      print_title();
      ?>
    </h2>
    <?php
    print_description();
     ?>
  </body>
</html>

create.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>
    <form action="create_process.php" method="post">
      <p>
        <input type="text" name="title" placeholder="Title">
      </p>
      <p>
        <textarea name="description" placeholder="Description"></textarea>
      </p>
      <p>
        <input type="submit">
      </p>
    </form>
  </body>
</html>

create_process.php

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

 

댓글

댓글 본문
작성자
비밀번호
  1. 로버트한
    감사합니다.^^
  2. 아 그렇군요 감사합니다 상대폴더 개념이군요^^ 감사합니다
    대화보기
    • ByungHyuk Jeon
      저는 폴더 구조를 htdocs/Web/ 안에 만들어서 실습하고있는데요, '/index..' 라고 하시면 htdocs 폴더 부터 상대적으로 가는것 같아요. 그래서 not found가 뜹니다.
      그런데 그냥 index... 라고 하시거나 './index' 를 하시면 create_process.php 파일이 있는 폴더를 기준으로 찾기 때문에 문제 없이 해당 파일을 찾을 수 있는것 같네요.

      즉 scott님의 경우는 htdocs 폴더 안에 저 파일들이 존재해서 상관없이 동작하는 거라고 볼 수 있을 것 같네요.
      대화보기
      • 동영상 강의 잘보고있습니다 제가 궁금한게 있어서 글을 올려봅니다.

        간단하게
        A : header('Location: /index.php?id='.$_POST['title']); 와
        B : header('Location: index.php?id='.$_POST['title']); 차이가 무엇인지 궁금합니다.

        A는 되지 않았고 B로 수정했을때는 정상으로 동작했습니다 ' / ' 가 있고 없고 차이가 무엇인가요??
      • 참고
        저 같은 경우에는 글쓰기 기능을 사용해도 파일이 생성되지 않고 아무 반응이 없었는데
        데이터를 저장하는 디렉토리(예: data)의 일반사용자 쓰기권한을 주고 나니까 파일이 생성되고 글쓰기 기능이 제대로 실행됬습니다. 리눅스 서버를 사용하시는 분은 참고해주세요.
      • 오셔
        저도 그랬었는데 Location: 이 부분 띄어쓰기 고치니까 되네요! 확인해보세요~
        대화보기
        • egoing
          error_log 파일을 확인해보셨나요?
          대화보기
          • 생활코딩짱짱
            Internal Server Error
            The server encountered an internal error or misconfiguration and was unable to complete your request.

            Please contact the server administrator at admin@example.com to inform them of the time this error occurred, and the actions you performed just before this error.

            More information about this error may be available in the server error log.

            Additionally, a 302 Found error was encountered while trying to use an ErrorDocument to handle the request.

            이런 에러가 발생했는데... 혹시 왜그러는 걸까요?ㅠㅠ
          • 생활눈코입딩
            아직 잘 모르지만. 폼의 전송방식이 핵심이네요
            즉 GET방식으로 url을 누군가에게 보여준다면...원하지않는 글쓰기가 된다.
            그래서 post 방식으로 url이 숨겨진 상태로 만들어야 사용자가 정상적으로 페이지를 방문한다....??
            사용자의 불편함을 줄이기 위해 사용자가 전송을 하고나면 그 페이지에 머무르게 하지말고 다시 메인홈페이지로
            보내버린다~이게 리 다이렉션이군요!!
          • 제갈량
            사용자가 웹 브라우저에서 서버에게 작업을 요청하면
            서버는 그것을 받아 처리하여서 사용자한테 제공하는 거였군요.
            단순해 보이지만, 여기에는 눈에 보이지 않는 뭔가가 존재하는데
            이건 우리가 알기에는 어렵다는 생각이 듭니다.
            그나마 웹 브라우저와 서버가 통신을 어떻게 하는지 조금은 알게되서 좋습니다.
            감사합니다. ^^
          • 마샤
            해결했어요

            파일명이 'PHP 6 ', 스페이스 한 칸이 뒤에 들어가 있어서 그랬어요 고맙습니다
            대화보기
            • egoing
              파일을 찾을 수 없다는 말이에요. 경로 잘 찾아보서요~
              대화보기
              • Dong-In Andy Kang
                학생들의 심리를 어떻게 이렇게 잘 파악하시는지... 작지만 강의를 계속해 나갈 수 있는 윤활유와도 같은 이고잉님의 격려!!
              • PHP 6, PHP 7처럼 한 칸 띄어져 있는 이름을 클릭하면 경고창이 뜨면서 본문은 뜨지 않네요

                Warning: file_get_contents(data/PHP 7): failed to open stream: No such file or directory in /Applications/mampstack-7.1.13-0/apache2/htdocs/index.php on line 11

                왜 그런지 아는 분 계신가요?
              • egoing
                그런 파일이 없다는 말이네요~ 파일의 경로를 잘 확인해보셔요
                대화보기
                • Yi Hong-cheon
                  Warning: file_get_contents(data/egoing): failed to open stream: No such file or directory in /Applications/XAMPP/xamppfiles/htdocs/index.php on line 11

                  egoing 님 코드를 그대로 붙여도 이럽니다. file_get_contents() 를 못하게 설정 되어있나... 궁금합니다
                  참고로 저장 할때마다 Atom Helper 가 비밀번호를 요구하네요.
                • 스파이크
                  int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )

                  http://php.net......php

                  콤마 앞은 파일명, 뒤는 파일 내용 맞습니다~
                  대화보기
                  • Mingi Son
                    강의 감사합니다
                  • 코딩잘하고싶어요 ㅎ
                    이 강의에서는 $_POST['title'] => form태그의 전송방식(Method)가 POST이고 name값이 title로 설정된 input필드가 '제목'을 입력하는 창으로 설정이 되었고 마찬가지로 $_POST['description']은 파일의 내용을 입력하는 textarea필드의 name값으로 description이 설정이 되었습니다. 따라서 반드시 $_POST['title']이 파일의 제목이 되고 $_POST['description']이 반드시 파일의 내용이 되는 것은 아닙니다.
                    대화보기
                    • godpapa
                      'data/'.$_POST['title'], $_POST['description']에서 앞에 $_POST['title']은 파일의 제목이 되고 컴마 뒤에 있는 것은 무조건 그 파일의 내용이 되나요?
                    버전 관리
                    egoing
                    현재 버전
                    선택 버전
                    graphittie 자세히 보기