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

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

ただいまの
回答率

87.49%

フォームに画像ファイルの添付を複数設置

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,379
退会済みユーザー

退会済みユーザー

こちらのサイトを参考に
フォームに画像をアップロードさせる機能を追加しようとしています。

画像のアップロードのinputタグを複数設置したいと考えているのですが、
エラーとなり、上手くいきません。

attachment_fileをattachment_file02と追加し、
フォームを複数設置しようと考えたのですが、
エラーが起きてしまいました。

<?php
define( "FILE_DIR", "images/test/");
// 変数の初期化
$page_flag = 0;
$clean = array();
$error = array();
// サニタイズ
if( !empty($_POST) ) {
    foreach( $_POST as $key => $value ) {
        $clean[$key] = htmlspecialchars( $value, ENT_QUOTES);
    } 
}
if( !empty($clean['btn_confirm']) ) {
    $error = validation($clean);
    // ファイルのアップロード
    if( !empty($_FILES['attachment_file']['tmp_name']) or  !empty($_FILES['attachment_file02']['tmp_name'])  ) {
        $upload_res = move_uploaded_file( $_FILES['attachment_file']['tmp_name'], FILE_DIR.$_FILES['attachment_file']['name']);

        $upload_res02 = move_uploaded_file( $_FILES['attachment_file02']['tmp_name'], FILE_DIR.$_FILES['attachment_file02']['name']);
        if( $upload_res !== true or $upload_res02 !== true ) {
            $error[] = 'ファイルのアップロードに失敗しました。';
        } else {
            $clean['attachment_file'] = $_FILES['attachment_file']['name'];
        }
    }
    if( empty($error) ) {
        $page_flag = 1;
        // セッションの書き込み
        session_start();
        $_SESSION['page'] = true;        
    }
} elseif( !empty($clean['btn_submit']) ) {
    session_start();
    if( !empty($_SESSION['page']) && $_SESSION['page'] === true ) {
        // セッションの削除
        unset($_SESSION['page']);
        $page_flag = 2;
        // 変数とタイムゾーンを初期化
        $header = null;
        $body = null;
        $admin_body = null;
        $auto_reply_subject = null;
        $auto_reply_text = null;
        $admin_reply_subject = null;
        $admin_reply_text = null;
        date_default_timezone_set('Asia/Tokyo');

        //日本語の使用宣言
        mb_language("ja");
        mb_internal_encoding("UTF-8");

        $header = "MIME-Version: 1.0\n";
        $header = "Content-Type: multipart/mixed;boundary=\"__BOUNDARY__\"\n";
        $header .= "From: GRAYCODE <yytsm100@yahoo.co,jp>\n";
        $header .= "Reply-To: GRAYCODE <yytsm100@yahoo.co,jp>\n";

        // 件名を設定
        $auto_reply_subject = 'お問い合わせありがとうございます。';

        // 本文を設定
        $auto_reply_text = "この度は、お問い合わせ頂き誠にありがとうございます。
      下記の内容でお問い合わせを受け付けました。\n\n";
        $auto_reply_text .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n";
          $auto_reply_text .= "お問い合わせ内容:" . nl2br($clean['contact']) . "\n\n";
        $auto_reply_text .= "test";

        // テキストメッセージをセット
        $body = "--__BOUNDARY__\n";
        $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
        $body .= $auto_reply_text . "\n";
        $body .= "--__BOUNDARY__\n";

        // ファイルを添付
        if( !empty($clean['attachment_file']) ) {
            $body .= "Content-Type: application/octet-stream; name=\"{$clean['attachment_file']}\"\n";
            $body .= "Content-Disposition: attachment; filename=\"{$clean['attachment_file']}\"\n";
            $body .= "Content-Transfer-Encoding: base64\n";
            $body .= "\n";
            $body .= chunk_split(base64_encode(file_get_contents(FILE_DIR.$clean['attachment_file'])));
            $body .= "--__BOUNDARY__\n";
        }        // ファイルを添付
        if( !empty($clean['attachment_file02']) ) {
            $body .= "Content-Type: application/octet-stream; name=\"{$clean['attachment_file02']}\"\n";
            $body .= "Content-Disposition: attachment; filename=\"{$clean['attachment_file02']}\"\n";
            $body .= "Content-Transfer-Encoding: base64\n";
            $body .= "\n";
            $body .= chunk_split(base64_encode(file_get_contents(FILE_DIR.$clean['attachment_file02'])));
            $body .= "--__BOUNDARY__\n";
        }

        // 自動返信メール送信
        mb_send_mail( $clean['email'], $auto_reply_subject, $body, $header);

        // 運営側へ送るメールの件名
        $admin_reply_subject = "お問い合わせを受け付けました";

        // 本文を設定
        $admin_reply_text = "下記の内容でお問い合わせがありました。\n\n";
        $admin_reply_text .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n";

      $admin_reply_text .= "お問い合わせ内容:" . nl2br($clean['contact']) . "\n\n";

        // テキストメッセージをセット
        $body = "--__BOUNDARY__\n";
        $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
        $body .= $admin_reply_text . "\n";
        $body .= "--__BOUNDARY__\n";

        // ファイルを添付
        if( !empty($clean['attachment_file']) ) {        
            $body .= "Content-Type: application/octet-stream; name=\"{$clean['attachment_file']}\"\n";
            $body .= "Content-Disposition: attachment; filename=\"{$clean['attachment_file']}\"\n";
            $body .= "Content-Transfer-Encoding: base64\n";
            $body .= "\n";
            $body .= chunk_split(base64_encode(file_get_contents(FILE_DIR.$clean['attachment_file'])));
            $body .= "--__BOUNDARY__\n";
        }    
        // ファイルを添付
        if( !empty($clean['attachment_file02']) ) {        
            $body .= "Content-Type: application/octet-stream; name=\"{$clean['attachment_file02']}\"\n";
            $body .= "Content-Disposition: attachment; filename=\"{$clean['attachment_file02']}\"\n";
            $body .= "Content-Transfer-Encoding: base64\n";
            $body .= "\n";
            $body .= chunk_split(base64_encode(file_get_contents(FILE_DIR.$clean['attachment_file02'])));
            $body .= "--__BOUNDARY__\n";
        }

        // 管理者へメール送信
        mb_send_mail( 'yytsm100@yahoo.co,jp', $admin_reply_subject, $body, $header);

    } else {
        $page_flag = 0;
    }    
}
function validation($data) {
    $error = array();

    // お問い合わせ内容のバリデーション
    if( empty($data['contact']) ) {
        $error[] = "「お問い合わせ内容」は必ず入力してください。";
    }

    return $error;
}
?>

<!DOCTYPE>
<html lang="ja">
<head>
<title>お問い合わせフォーム</title>

</head>
<body>
<h1>お問い合わせフォーム</h1>
<?php if( $page_flag === 1 ): ?>

<form method="post" action="">

    <div class="element_wrap">
        <label>お問い合わせ内容</label>
        <p><?php echo nl2br($clean['contact']); ?></p>
    </div>
    <div class="element_wrap">
        <label>画像ファイルの添付</label>
    <?php if( !empty($clean['attachment_file']) or empty($clean['attachment_file02'])  ): ?>
        <p><img src="<?php echo FILE_DIR.$clean['attachment_file']; ?>"></p>
        <p><img src="<?php echo FILE_DIR.$clean['attachment_file02']; ?>"></p>
    <?php endif; ?>
    </div>
<input type="submit" name="btn_back" value="戻る">
    <input type="submit" name="btn_submit" value="送信">

    <input type="hidden" name="contact" value="<?php echo $clean['contact']; ?>">
    <?php if( !empty($clean['attachment_file']) or !empty($clean['attachment_file02'])): ?>
        <input type="hidden" name="attachment_file" value="<?php echo $clean['attachment_file']; ?>">
        <input type="hidden" name="attachment_file02" value="<?php echo $clean['attachment_file02']; ?>">
    <?php endif; ?>
</form>

<?php elseif( $page_flag === 2 ): ?>

<p>送信が完了しました。</p>

<?php else: ?>

<?php if( !empty($error) ): ?>
    <ul class="error_list">
    <?php foreach( $error as $value ): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
    </ul>
<?php endif; ?>

<form method="post" action="" enctype="multipart/form-data">


    <div class="element_wrap">
        <label>お問い合わせ内容</label>
        <textarea name="contact"><?php if( !empty($clean['contact']) ){ echo $clean['contact']; } ?></textarea>
    </div>
    <div class="element_wrap">
        <label>画像ファイルの添付</label>
        <input type="file" name="attachment_file" multiple>

        <input type="file" name="attachment_file02" multiple>
    </div>
    <input type="submit" name="btn_confirm" value="入力内容を確認する">
</form>

<?php endif; ?>
</body>
</htm>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dice142

    2018/10/29 19:53

    エラー文とご自身でお書きになったコードをご提示ください。参考記事が間違っていない限りどこがおかしいか指摘するのは困難です。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/10/29 20:01

    エラーメッセージがどこにどう表示されているのか、指摘された行の前後10行くらいは掲示してくれないとなんとも言えなくない?

    キャンセル

  • m.ts10806

    2018/10/29 21:01

    参考にしたものと実際質問者さんが組んだコードは別物ですよ。ご自身が組んだコードを提示してください

    キャンセル

  • キャンセル

回答 2

checkベストアンサー

+1

複数ファイルのアップロードを、少々勘違いされて理解しているようです。
現状のコードでは、参考にされたページのアップロード部分を2つ書いたような処理になっています。

複数アップロードする場合は、複数のファイルを一つの配列で渡してあげる必要があります。
現状のコードでは、attachment_fileattachment_file02になっていますので、アップロードできていないように思います。

inputタグに付けている multiple属性は、 一つのinputタグで複数のファイルを選択できるダイアログを出すための属性です。multiple属性を使うなら、attachment_file[]をつけて、
<input type="file" name="attachment_file[]" multiple>と一つだけ書きましょう。

multipleを使わない場合は
<input type="file" name="attachment_file[]">を2回書けば、配列で入ります。

そして、アップロードされたファイルは、サーバーのtmpに保存されるので、それを任意のディレクトリに移動します。
場所は$_FILES["attachment_file"]["tmp_name"][添え字]に入ってます。

このあたりを踏まえよく考えて、move_uploaded_file以降の処理を書き直しましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

回答ではないです
このスクリプト、セキュリティ的に問題があるので、まずは基礎学習からしてみては?
問い合わせフォームは、そもそも難易度はそ低いものではないです。
かつ、ファイルアップロードは、危険なものです。

デバッグ環境から整えるのが、変数の遷移が分かって良いのでオススメです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る