[PHP] 웹에서 입력한 코드 결과 보기 (2/2) - 코드의 실행 결과 보기

2022. 10. 29. 23:23Program/PHP

[PHP] 웹에서 입력한 코드 결과 보기 (2/2) - 코드의 실행 결과 보기

 

[코드 196]에서 입력한 코드를 받아서 파일로 생성하는 기능을 구현한다.

파일명은 mt_rand() 함수를 사용하여 랜덤으로 정하며, 중복 파일이 있는지 확인 후 중복 파일이 있다면 다른 파일명을 사용한다.

파일명은 찾은 후 해당 파일을 생성하여 입력한 코드를 파일에 fwrite() 함수를 사용해 쓴 후 해당 파일로 이동하는 방식으로 구현한다.

생성한 코드 파일은 [webEditor] 폴더에 있는 [codeList] 폴더에 저장하므로 [webEditor] 폴더에 [codeList] 폴더를 생성한다.

 

다음은 입력한 코드를 실행하는 예제이다.

[예제: 197_playCode.php ]

<?php
  include $_SERVER['DOCUMENT_ROOT'].'/php/common/171_session.php';
  include $_SERVER['DOCUMENT_ROOT'].'/php/common/179_checkSignSession.php';

  $code = $_POST['code'];

  // 파일명 만들기
  function makeFileName(){
    $existsFileList = array();
    $opendir = opendir('./codeList');

    while(($readdir = readdir($opendir))){
      array_push($existsFileList, $readdir);
    }

    $isEqualNameCheck = false;

    while(true){
      $fileName = 'php200-'.mt_rand().'.php';

      foreach($existsFileList as $efl){
        if($existsFileList == $fileName){
          $isEqualNameCheck = true;
        }
      }

      if($isEqualNameCheck == false){
        return $fileName;
      }
    }
  }

  $fileName = makeFileName();
  $filePath = $_SERVER['DOCUMENT_ROOT'].'/php/webEditor/codeList/';
  $myFile = fopen($filePath.$fileName, "w") or die("파일 열기 실패");
  fwrite($myFile, $code);
  fclose($myFile);
  header("Location:./codeList/".$fileName);
?>

1. 로그인한 사람만 사용할 수 있도록 세션을 체크한다.

2. 전달받은 코드를 변수 code에 대입한다.

3. makeFileName() 함수는 사용할 수 있는 파일명을 반환하는 함수이다.

4. 생성한 파일명을 목록으로 생성하기 위한 배열이다. 이 배열의 값으로 앞으로 생성할 파일명과 비교하여 이미 존재하는 파일명인지를 구분한다.

5. 폴더 codeList를 연다.

6. 폴더 codeList에 있는 파일들의 이름을 배열 existsFileList에 추가한다.

7. 변수 isEqualNameCheck는 파일명이 중복인지의 여부를 대입하는 변수이다. 중복된 파일명이 없으면 계속 값은 false를 유지하며, 중복된 파일명이 있는 경우 true를 대입한다.

8. while 반복문의 조건으로 true를 사용했다. 조건문에 true를 대입했으므로 while 반복문은 무한 실행된다.

9. 코드의 파일명을 mt_rand() 함수를 사용하여 랜덤으로 파일명을 짓도록 한다.

10. 배열 existsFileList 에 있는 값과 비교하여 변수 fileName의 값과 동일한지 확인하며 동일하면 새로운 파일명을 찾아야 하므로 23라인에서 25라인의 if 조건문으로 인해 변수 isEqualNameCheck의 값에 true를 대입한다.

11. 변수 isEqualNameCheck의 값이 false이면 변수 fileName의 값이 사용할 수 있는 파일명을 의미하므로 return문을 사용하여 파일명을 반환하여 함수 makeFIleName에서 빠져나온다.

12. 함수 makeFileName이 반환한 값으로 변수 fileName에 대입한다.

13. 파일을 생성할 폴더의 경로를 변수 filePathName에 대입한다.

14. fopen() 함수를 사용해 변수 fileName에 대입된 파일명으로 파일을 생성하여 파일을 연다.

15. fwrite() 함수를 사용하여 form 태그에서 입력한 코드의 변수 code의 값을 파일에 쓴다.

16. 생성한 파일로 이동한다.

17. [코드 197]을 실행하여 코드를 입력 후 실행한다.

 

실행 URL은 http://localhost/php/webEditor/196_editorForm.php  이다.

 

실행결과

코드 입력 후 [PLAY CODE] 버튼을 클릭하면 아래와 같이 결과를 확인할 수 있다.

d이 프로그램은 실제 서버에 코드를 입력하는 기능을 갖고 있기 떄문에 학습 목적으로 사용하면 편리하지만 나쁜 목적으로 사용하면 시스템에 치명적인 결과를 초래하게 된다. 그러므로 이 프로그램을 실제 서버에 업로드하여 활용시에는 굉장히 신뢰를 할 수 있는 사용자에게 사용할 수 있도록 하거나 입력받은 코드에 악영향을 끼치는 것은 없는지 확인하는 과정이 필요하다.

 

 

 


 

 

 

초보자를 위한 PHP 200제
김태영 지음 | 정보문화사