質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3392閲覧

【急募】入力フォームを作成しています【PHP】

3buro

総合スコア29

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

3クリップ

投稿2015/06/15 01:13

###前提・実現したいこと
■入力フォーム・確認画面・アップロード(実行)という構成
■日付やタイトル、作成者や通達内容をCSVに書き出す
■3つの添付ファイルを同時にアップロードする
■入力した内容をHTMLに新しく書き出す(指定したフォルダに作成したい)

上記の条件をふまえた入力フォームの作成を行っています。
それとは別に、ここで書き出されたCSVからデータを読み込んで表示させるページの作成も予定しています。

###問題点
■CSVに書き出すことができたが、ファイルをアップロードすることができない
■HTMLデータを新しく作る記述の仕方がわからない
■複数の添付ファイルをアップロードする記述の仕方
■できればCSVから読み込むデータを範囲指定して表示させる方法

###ソースコード

lang

1■入力フォーム 2<body> 3<form action="check.php" method="post" enctype="multipart/form-data"> 4 ファイル:<br /> 5 <input type="file" name="upfile" size="30" /><br /> 6 <br /> 7 名前:<br /> 8 <input type="text" name="name" size="30" /><br /> 9 <br /> 10 部署名:<br /> 11 <select name="busyo"> 12 <option value="">▼ 選択 </option><!--デフォルトのにはvalueを""にする --> 13 <option>人事</option> 14 <option>広報</option> 15 <option>総務</option> 16 </select><br /> 17 <br /> 18 日付:<br /> 19 <input type="date" name="hiduke" size="30" /><br /> 20 <br /> 21 通達内容:<br /> 22 <textarea name="message" rows="5" cols="100"></textarea><br /> 23 <br /> 24 <br /> 25 <input type="submit" value="アップロード" /> 26</form> 27</body>

lang

1■入力確認画面 2<body> 3<?php 4 $name = htmlspecialchars($_POST['name'], ENT_QUOTES,'UTF-8'); 5 $upfile = htmlspecialchars($_FILES["upfile"]["name"], ENT_QUOTES,'UTF-8'); 6 $busyo = htmlspecialchars($_POST['busyo'], ENT_QUOTES,'UTF-8'); 7 $hiduke = htmlspecialchars($_POST['hiduke'], ENT_QUOTES,'UTF-8'); 8 $message = htmlspecialchars($_POST['message'], ENT_QUOTES,'UTF-8'); 9?> 10<form action="upload.php" method="post" enctype="multipart/form-data" > 11 ファイル:<br /> 12 <?php echo $upfile; ?><br /> 13 <br /> 14 名前:<br /> 15 <?php echo $name; ?><br /> 16 <br /> 17 部署名:<br /> 18 <?php echo $busyo; ?><br /> 19 <br /> 20 日付:<br /> 21 <?php echo $hiduke; ?><br /> 22 <br /> 23 通達内容:<br /> 24 <?php echo nl2br($message); ?><br /> 25 <br /> 26 <br /> 27 <input type='button' onclick="history.back()" value="戻る"> 28 <input type="submit" value="登録" /> 29 <input type="hidden" name="upfile" value="<?php echo $upfile; ?>" > 30 <input type="hidden" name="name" value="<?php echo $name; ?>" > 31 <input type="hidden" name="busyo" value="<?php echo $busyo; ?>" > 32 <input type="hidden" name="hiduke" value="<?php echo $hiduke; ?>" > 33 <input type="hidden" name="message" value="<?php echo $message; ?>" > 34</form> 35</body>

lang

1■アップロード 2<body> 3<p><?php 4if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { 5 if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { 6 chmod("files/" . $_FILES["upfile"]["name"], 0644); 7 echo $_FILES["upfile"]["name"] . "をアップロードしました。"; 8 } else { 9 echo "ファイルをアップロードできません。"; 10 } 11} else { 12 echo "ファイルが選択されていません。"; 13} 14 $name = htmlspecialchars($_POST['name'], ENT_QUOTES,'UTF-8'); 15 $upfile = htmlspecialchars($_POST["upfile"], ENT_QUOTES,'UTF-8'); 16 $busyo = htmlspecialchars($_POST['busyo'], ENT_QUOTES,'UTF-8'); 17 $hiduke = htmlspecialchars($_POST['hiduke'], ENT_QUOTES,'UTF-8'); 18 $message = htmlspecialchars($_POST['message'], ENT_QUOTES,'UTF-8'); 19 $line = array($name, $upfile, $busyo, $hiduke, $message); 20 //エクセルはSJIS-winしか読まないのでUTF-8からSJIS-winへ変換が必要 21 mb_convert_variables("SJIS-win", "UTF-8", $line); 22 //CSVファイルへの書き込み 23 $file_name = "answer.csv"; 24 $fp = fopen($file_name, 'a'); 25 $result = fputcsv($fp, $line); 26 fclose($fp); 27 echo "登録が完了しました。"; 28 echo "<br />"; 29 echo '<a href="form.html">入力フォームへ戻る</a>'; 30?></p> 31</body>

###さいごに
インターネットにある情報を参考に記述しているのでおかしな書き方をしていると思いますが、
助言・コードなど、知識をいただけるとありがたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

他の方の回答を参照していただくとして下記の一点だけ

■CSVに書き出すことができたが、ファイルをアップロードすることができない

ファイルアップロードに確認画面を挟むと途端に難易度が上がります。

まず 入力フォーム → 確認画面 の段階でファイルアップロードが既に行われていて、
確認画面 → アップロード では行われていないというのは分かりますか?
既に 確認画面 の段階でファイルはサーバにアップロードされています。

<input type="hidden" name="upfile" value="<?php echo $upfile; ?>" >

上記の$upfileは元をたどれば$_FILES["upfile"]["name"]なのですが、
これはサーバに置かれたファイル名ではなく、アップロードしたファイルの名前です。
$_FILES["upfile"]["tmp_name"] がサーバに置かれたファイル名です。)

更に、一部の古いブラウザならともかくパス付でファイル名になっているのではなく、
単純にファイル名だけ送られてくるはずなので、hidden を file にしようと再送信は不可能です。
そもそも input type="file" に初期値を入力するのはセキュリティ上不可能です。

$upfile$_FILES["upfile"]["tmp_name"] にして hidden で送信すれば
実現自体はできなくはないのですが、おすすめしません。

  • is_uploaded_file がアップロード画面で失敗する
  • 絶対パスが閲覧者に知れてしまう
  • 他にも問題あるかも

とりあえず「php ファイルアップロード 確認画面」で検索して調べてみて、
その上で分からなければ再度質問してください。
念のためですがディレクトリトラバーサル脆弱性についても調べてみるといいと思います。

投稿2015/06/15 03:17

PruneMazui

総合スコア227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

3buro

2015/06/15 04:18

コメントありがとうございました。 色々不勉強な部分ばかり助言いただき、ありがとうございます。 確認画面の検索結果を参考に少し頑張ってみたいと思います。
guest

0

ベストアンサー

CSVに書き出すことができたが、ファイルをアップロードすることができない

confirm画面で
<input type="hidden" name="upfile" value="<?php echo $upfile; ?>" >
type が hiddenのせいだとおもいます。

HTMLデータを新しく作る記述の仕方がわからない

$file_path = 'hogehoge.html';
ob_start();
//ここにechoとか別ファイルで作ったphp出力ファイルのrequiredとかで出力する
required('views/output_html.php');
$data_str = ob_get_contents();
ob_end_clean();
file_put_contents($file_path, $data_str, FILE_APPEND | LOCK_EX);

複数の添付ファイルをアップロードする記述の仕方

<input type="file" name="upfile[]" size="30" /> <input type="file" name="upfile[]" size="30" /> <input type="file" name="upfile[]" size="30" /> こんな感じで配列で渡してあげてはどうでしょう?

できればCSVから読み込むデータを範囲指定して表示させる方法

$file_line = file($csv_path);
//1行目 $file_line[0];
//10行目 $file_line[9];
http://php.net/manual/ja/function.file.php

この場合、csvが重いようなら
ジェネレータとか使ってメモリを節約して使ってみると良いかもしれません。

投稿2015/06/15 02:10

編集2015/06/15 02:17
nanndemoiikara

総合スコア775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

3buro

2015/06/15 02:30

>> confirm画面で <input type="hidden" name="upfile" value="<?php echo $upfile; ?>" > type が hiddenのせいだとおもいます。 hiddenにしなければ確認画面で再度フォルダを選択と表示されるので、できれば隠しておきたいのですが... 以下2つに関しては参考にさせていただきます。 回答ありがとうございます!
nanndemoiikara

2015/06/15 02:45

確認画面遷移時に一時ディレクトリにアップロード処理しておき 完了画面遷移時に一時ディレクトリから実際に保存したいパスに保存して 一時ファイルは削除するというような実装はいかがでしょうか?
3buro

2015/06/15 02:56

すみません。PHP歴が浅く、一時ディレクトリの効果をあまりよくわかっていません。 一時ディレクトリに処理をしておくメリットを教えていただいてもよろしいですか?
nanndemoiikara

2015/06/15 03:07

確認画面が必要な仕様でしたら、一時的にアップロードするファイルの情報を保存しておく必要があるかと思います。 軽いファイルでしたら、バイナリにしてsessionに持たせたりというような実装も考えられますが現実的ではありません。 そのため、最悪消えてしまっても問題ない一時ディレクトリを作成してその中に保存しておく事で、実際にアップロードしたいディレクトリに不要なファイルが入る事が無いかつ、確認画面を表示する仕様で作成する事ができるメリットがあります。
3buro

2015/06/15 03:19

最初はsessionを使用してデータを遷移できないかと奮闘しておりましたが、現実的ではないのですか... お手数なのですが、その一時ディレクトリへの記述方法など教えていただいてもよろしいですか?
nanndemoiikara

2015/06/15 04:02

http://php.net/manual/ja/features.file-upload.post-method.php ここに記述されているかと思われます。 下記サンプルです。 $tmp_path = './tmp_path/'; $upload_path = './files/'; //ファイル名のはsessionの値として持たせておく $file_name = basename($_FILES['userfile']['name']); //ファイルの存在チェックとリネーム処理 $i = 0; while ( is_file($tmp_path . $file_name) ) { $i++; $file_name = $i . $file_name; } $_SESSION['temp_filename'] = $file_name; //一時Directoryに保存 move_uploaded_file($_FILES['userfile']['tmp_name'], $tmp_path . $file_name); //一時directoryからuploadしたディレクトリに移動させる処理 $file_name = $tmp_file_name = basename($_SESSION['tmp_filename']); if ( ! is_file($tmp_path . $tmp_file_name) ) throw new Exception('Fuck!! Nothing Temporary file!!'); $i = 0; while ( is_file($upload_path . $file_name) ) { $i++; $file_name = $i . $file_name; } //一時dirから移動 rename($tmp_path . $tmp_file_name, $upload_path . $file_name);
3buro

2015/06/15 04:19

長々とありがとうございました! マニュアルを見ながら作成したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問