2012年11月22日木曜日

開発環境

『初めてのPHP5』 (David Sklar 著、 桑村 潤 翻訳、 廣川 類 翻訳、 オライリー・ジャパン、2005年、ISBN978-4-87311-257-2)の10章(ファイルの操作)10.9(演習問題)4、5を解いてみる。

4, 5.

PHPのコード(TextWrangler)

sample69.php

<?php
  require 'formhelpers.php';
  if(array_key_exists('_submit_check', $_POST)){
    if($_POST['_submit_check']){
      if($form_errors = validate_form()){
        show_form($form_errors);
      } else {
        process_form();
      }
    } else {
      show_form();
    }
  } else {
    show_form();
  }
  function show_form($errors = ''){
    if($errors){
      print "Error<ul><li>";
      print implode("</li><li>", $errors);
      print "</li></ul>";
    }
    print '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '" />';
    print "file name: ";
    input_text('filename', $_POST);
    input_submit("submit", "submit");
    print '<input type="hidden" name="_submit_check" value="1" />';
    print "</form>";
  }
  function validate_form(){
    $errors = array();
    if(!strlen(trim($_POST['filename']))){
      $errors[] = "ファイル名を入力してください";
    } else {
      $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . $_POST['filename'];
      $filename = realpath($filename);
      $len = strlen($_SERVER['DOCUMENT_ROOT']);
      if($_SERVER['DOCUMENT_ROOT'] != substr($filename, 0, $len)){
        $errors[] = "ドキュメントルートディレクトリ下に{$_POST['filename']}はありません。";
      } elseif(strcasecmp(substr($filename, -5), ".html") != 0){
        $errors[] = ".htmlで終わる名前のファイルしか表示できません。";
      }
    }
    return $errors;
  }
  function proccess_form(){
    $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . $_POST['filename'];
    $filename = realpath($filename);
    $page = file_get_contents($filename);
    if($page === false){
      print "Couldn't load {$filename}";
    } else {
      print $page;
    }
  }
?>

HTMLソース

<form method="POST" action="/kamimura_blog/learning_php/sample69.php" />file name: <input type="text" name="filename" value="" /><input type="submit" name="submit" value="submit"/><input type="hidden" name="_submit_check" value="1" /></form>

一応それっぽく書いてはみたものの、上手くいかない。。

0 コメント:

コメントを投稿