PHPでのファイルのアップロード方法

実現したいこと

・フォームを送信してファイルをアップロードする。
・フォームが既に画面に貼り付けられている状態のときに、ファイルを選んでフォームを送信すると更新される。
・フォームが既に画面に貼り付けられている状態のときに、ファイルを選ばずにフォームを送信すると添付されているファイルはそのまま。

前提

ここに質問の内容を詳しく書いてください。
(例)
PHPでサイトの管理画面を作っています。
ファイルアップロード機能を実装中に以下の不具合が発生しました。

発生している問題・エラーメッセージ

ファイルを添付してフォームを送信するとDBに保存、サーバーにアップロード、画面に添付ファイルのリンクテキスト表示まではできます。
しかし、内容を変更する場合にフォームでファイルを選択していない状態で送信すると添付していたファイルが消えてしまいます。

該当のソースコード

ソースコード //DB接続 $pdo = new DbUtility(); $data = $_REQUEST; foreach ($data as $column => $val) { ${$column} = $val; } // exit; if (isset($updbtn)) { // エラーメッセージを格納する配列 $errors = array(); // タイトル、カテゴリ、本文のバリデーション if (empty($title)) { $errors[] = "タイトルは必須です。"; } if (empty($news_flg)) { $errors[] = "カテゴリは必須です。"; } if (empty($body)) { $errors[] = "本文は必須です。"; } // エラーメッセージがない場合にのみクエリを実行 if (empty($errors)) { $values = array( "title" => $title, "body" => $body, "img1" => $img, "release_dt" => $release_dt, "url_string" => $url_string, "pdf_string" => $pdf_string, "link_string" => $link_string, "del_flg" => $del_flg, "news_flg" => $news_flg, "n_id" => $n_id // 追加 ); if ($flg == "INS") { $strQuery = "INSERT INTO t_news (release_dt, title, body, url_string, pdf_string, news_flg, del_flg, link_string) VALUES ('$release_dt', '$title', '$body','$url_string', '$pdf_string', '$news_flg', '0', '$link_string')"; } else { $strQuery = " UPDATE t_news SET title=:title, body=:body, img1=:img1, url_string=:url_string, pdf_string=:pdf_string, link_string=:link_string, release_dt=:release_dt, upd_dt=NOW(), news_flg=:news_flg, del_flg=:del_flg WHERE n_id=:n_id LIMIT 1"; } // SQL実行 $pdo->setQuery($strQuery) ->setValues($values) ->execute(); if (isset($_FILES["img1"]["name"])) { // ファイルの保存先 $filePath = $com_Imgdir . 'DATA' . $n_id . '_' . $MAX_IMG_NUM.'.pdf'; // 古いファイルが存在するか確認 if (file_exists($filePath)) { // 古いファイルを削除 unlink($filePath); } // アップロードが正しく完了したかチェック if (move_uploaded_file($_FILES['img1']['tmp_name'], $filePath)) { echo 'アップロード成功'; // ファイルとディレクトリのパーミッションを変更 chmod($filePath, 0777); // 対応するSQL文を実行 $strQuery = "UPDATE t_news SET img1=:img WHERE n_id=:n_id LIMIT 1"; $pdo->setQuery($strQuery) ->setValues(array("img" => 'DATA' . $n_id . '_' . $MAX_IMG_NUM.'.pdf', "n_id" => $n_id)) ->execute(); } } else { } header("Location: {$_SERVER['PHP_SELF']}?flg=UPD&n_id={$n_id}&msg={$msg}"); $msg = '登録が完了しました。'; } else { // バリデーションの処理は<p class="mymsg">の中に記述している } } catch (Exception $e) { $msg = "エラー発生:" . $e->getMessage(); } フォーム部分 <form id="MyForm" name="MyForm" action="<?= $_SERVER['PHP_SELF'] ?>" method="post" onSubmit="return chkitem();" enctype="multipart/form-data"> <input type="hidden" id="flg" name="flg" value="<?= $flg ?>"> <input type="hidden" id="n_id" name="n_id" value="<?= $n_id ?>"> <?php for ($i = 1; $i <= $MAX_IMG_NUM; $i++) : ?> <input type="hidden" name="img<?= $i ?>" value="<?= ${"img{$i}"} ?>"> <?php endfor; ?> <input type="hidden" name="sort_no" value=100> <p class="btnSubmit alc"> <? if ($flg == "UPD") { ?> <input type="submit" name="updbtn" class="botan pink" value="<?= $botan ?>する"> <? } ?> </p> <p class="alc fs16" style="color: red;">※赤字は必須項目です</p> <table class="tblForm wd1000 flc"> <tr> <th>ニュース更新日付</th> <td><input class="wd45 flatpickr" type="text" name="release_dt" value="<?= $release_dt ? date("Y-m-d", strtotime($release_dt)) : date("Y-m-d") ?>"></td> </tr> <tr> <th class=" ">カテゴリ</th> <td class=""> <? foreach ($ary_com_news_flg as $news_flg_id => $news_flg_name) { $sel = ($news_flg_id == $news_flg) ? " checked" : ""; ?> <span class="input"> <input type="radio" id="news_flg<?= $news_flg_id ?>" name="news_flg" value="<?= $news_flg_id ?>" <?= $sel ?>> <label for="news_flg<?= $news_flg_id ?>"> <?= $news_flg_name ?> </label> </span> <? } ?> </td> </tr> <tr> <th>タイトル</th> <td> <input type="text" name="title" class="wd95" value="<?= $title ?>"> </td> </tr> <tr> <th>本文</th> <td> <textarea class="wd95 edit-text" name="body" rows="4"><?= $body ?></textarea> <div><span class="fs11 bold">※行間を空けずに改行する場合は「Shift+Enter」で改行して下さい。</span></div> </td> </tr> <?php for ($i = 1; $i <= $MAX_IMG_NUM; $i++) : ?> <tr> <th>PDF添付</th> <td> <?php if (!empty(${"img{$i}"})) : ?> <a href="<?= $com_Imgurl . ${"img{$i}"} ?>" target="_blank"><?= ${"img{$i}"} ?></a> <span class="input"> <input type="checkbox" name="delimg<?= $i ?>" value=1 id="id_delimg<?= $i ?>"><label for="id_delimg<?= $i ?>">削除</label> </span> <br> <?php endif; ?> <input type="file" name="img<?= $i ?>"> <div><span class="fs11 bold">※次のPDFリンクテキストにお知らせページに表示されるPDFファイルのリンクテキストを入力して下さい。</span></div> </td> </tr> <?php endfor; ?> <tr> <th>PDFリンクテキスト</th> <td> <input type="text" name="pdf_string" class="wd45" value="<?= $pdf_string ?>" size="3"> </td> </tr> <tr> <th>URL貼り付け</th> <td> <input type="text" name="url_string" class="wd95" value="<?= $url_string ?>" size="3"> <div><span class="fs11 bold">※次のURLリンクテキストにお知らせページに表示されるURLのリンクテキストを入力して下さい。</span></div> </td> </tr> <tr> <th>URLリンクテキスト</th> <td> <input type="text" name="link_string" class="wd45" value="<?= $link_string ?>" size="3"> </td> </tr> <tr> <th class="">表示</th> <td class=""> <select name="del_flg"> <?php foreach ($ary_del_flg as $key => $val) : ?> <option value="<?= $key ?>" <?= $del_flg == $key ? "selected" : "" ?>><?= $val ?></option> <?php endforeach; ?> </select> </td> </tr> </table> <p class="btnSubmit alc"> <input type="submit" name="updbtn" class="botan fs18 pink" value="<?= $botan ?>する"><br> <input type="button" name="list" class="botan" value="一覧" onClick="location.href='./index.php'"> </p> </form> ### 試したこと $_FILES['img1']['name']の中身の有無で条件分岐をして、中身がある場合はDBを更新、中身がない場合は処理なしで条件文を作成しましたが、うまく機能しません。以下のコードです。 if (isset($_FILES["img1"]["name"])) { // ファイルの保存先 $filePath = $com_Imgdir . 'DATA' . $n_id . '_' . $MAX_IMG_NUM.'.pdf'; // 古いファイルが存在するか確認 if (file_exists($filePath)) { // 古いファイルを削除 unlink($filePath); } // アップロードが正しく完了したかチェック if (move_uploaded_file($_FILES['img1']['tmp_name'], $filePath)) { echo 'アップロード成功'; // ファイルとディレクトリのパーミッションを変更 chmod($filePath, 0777); // 対応するSQL文を実行 $strQuery = "UPDATE t_news SET img1=:img WHERE n_id=:n_id LIMIT 1"; $pdo->setQuery($strQuery) ->setValues(array("img" => 'DATA' . $n_id . '_' . $MAX_IMG_NUM.'.pdf', "n_id" => $n_id)) ->execute(); } } else { } ### 補足情報(FW/ツールのバージョンなど) var_dumpで$_FILESの中身を表示しようとしてもうまく表示ができません。

コメントを投稿

0 コメント