前提・実現したいこと
PHPで投稿フォームにて画像を送信し、別のところでバリデーションに引っ掛かった時、(例えば価格でバリデーションおきた)画像は選択したファイルを残したい。
わかりにくいと思うので、具体例を挙げます。
例:タイトル
②タイトル入力状態だと、$_POSTされたタイトルがフォームに残る
これが実現できるのは、
<input type="text" class="form-control" id="title" name="title" value="<?php if(isset($title)) echo h($title) ?>" placeholder="タイトルを入力してください(30文字以内)">
で、
value="<?php if(isset($title)) echo $title ?>"
があるから。
ここで本題です。
上記のタイトルの例のように画像も選択して送信したとします。
もし他のところでバリデーションに引っ掛かったとしても、画像ファイルは選択された状態にしたいです。
(タイトルのように、またわざわざ画像選択するのは億劫なので。)
ただ、タイトルとかはinput type="text"なので、
value="<?php if(isset($title)) echo h($title) ?>"
で表示できるのですが、画像の場合、file形式なので、
value="<?php if(isset($img)) echo $img ?>"
みたいにしても、タイトルのように表示できません。
<?php session_start(); require_once(ROOT_PATH .'/Models/Post.php'); require_once(ROOT_PATH .'function.php'); ini_set('display_errors', "On"); $obj = new Post(); $err = []; if($_SERVER['REQUEST_METHOD'] === 'POST'){ $title = filter_input(INPUT_POST, 'title'); $text = filter_input(INPUT_POST, 'text'); $category = filter_input(INPUT_POST, 'category'); $price = filter_input(INPUT_POST, 'price'); // 画像 $img = basename($_FILES['img']['name']); $img_err = $_FILES['img']['error']; $imgsize = $_FILES['img']['size']; $tmp_path = $_FILES['img']['tmp_name']; $upload_dir = 'img/'; $save_filename = date('Ymdhis').$img; $save_path = $upload_dir.$save_filename; // タイトル、詳細、カテゴリー、参考価格のバリデーション if(empty($title) || mb_strlen($title) > 30) { $err['title'] = "タイトルは必須です。また、30文字以内で入力してください。"; } if(empty($text) || mb_strlen($text) > 3000) { $err['text'] = "サービスの詳細は必須です。また、3000文字以内で入力してください。"; } if(empty($category)) { $err['category'] = "カテゴリーを以下のセレクトボックスから選択してください"; } if(empty($price) || !preg_match("/^[0-9]+$/", $price)) { $err['price'] = "サービスの参考価格を半角数字で入力してください。"; } // 画像ファイルのバリデーション // ①画像ファイルがあるか if(is_uploaded_file($tmp_path)) { // 画像データを移動 move_uploaded_file($tmp_path, $save_path); } else { $err['img'] = "画像を保存できませんでした。"; } // ②拡張子は画像形式か $allow_ext = array('jpg', 'jpeg', 'png'); $file_ext = pathinfo($img, PATHINFO_EXTENSION); if(!in_array(strtolower($file_ext), $allow_ext)) { $err['img'] = "画像ファイルを添付してください。"; } // ③ファイルのサイズが1MB未満か if($imgsize > 1048576 || $img_err == 2) { $err['img'] = "ファイルのサイズは1MB未満にしてください。"; } // エラーがなければ、DBにデータを保存し、リスト一覧にページ遷移 if(count($err) === 0) { $result = $obj->createList($_POST, $save_path); $_SESSION['list_msg'] = "リストの投稿に成功しました!"; header('Location: index.php'); exit; } } ?> ここからHTMLのフォーム <form action="" method="POST" enctype="multipart/form-data" id="p-form"> <!-- サービスの参考価格 --> <h6 id="p-price"><label for="kome"><font color="red">*</font></label>サービスを利用する際の参考価格</h6> <?php if(isset($err['price'])): ?> <p class="err_one"><font color="red"><?php echo $err['price'] ?></font></p> <?php endif; ?> <div class="mb-3"> <input type="text" class="form-control" id="p-price_form" name="price" placeholder="29800" value="<?php if(isset($price)) echo h($price) ?>"> </div> <!-- 画像 --> <h6 id="p-image">画像を追加してください</h6> <?php if(isset($err['img'])): ?> <p class="err_one"><font color="red"><?php echo $err['img'] ?></font></p> <?php endif; ?> <input type="hidden" name="MAX_FILE_SIZE" value="1048576"> <input type="file" class="form-control" id="p-image_upload" name="img" value="<?php if(isset($img)) echo h($img) ?>"> <!-- リスト投稿ボタン --> <div class="p-btn"> <button type="submit" class="btn btn-primary" id="p-btn_btn">リストを投稿する</button> </div> </form>
##試したこと
value="<?php if(isset($_FILES['img']['name'])) echo $_FILES['img']['name'] ?>">
と書いてみたが、効果なし
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/18 13:24