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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Q&A

1回答

2766閲覧

[PHP] 複数アップロードした画像ファイルが他の画像と同じになってしまう

mmm022

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

0グッド

0クリップ

投稿2021/07/07 07:05

前提・実現したいこと

PHPで画像ファイルをアップロードし、アップロードされた画像に一意のシステム名を割り振りURLを生成して表示できるようにするプログラムを書いています。
現在、アップロードするためのフォームを6つ用意しており、それぞれにファイルを指定してアップロードボタンを押すときちんとDBへ書き込みがされるのですが、ファイル名や拡張子などの情報はきちんと取得できているもののURLがあげたものとは別の画像と同じものになってしまいます。
また、その現象は同時にアップロードする枚数によって複製される画像は異なります。

例:アップロード時
1.〇2.△3.□4.◎5.▽6.◆

理想             現状(同時にアップロードする枚数で変化あり)
1.〇2.△3.□4.◎5.▽6.◆   1.〇2.〇3.□4.◎5.◎6.◎

アップロードされたファイルは一度、別階層のfileディレクトリに一意のシステム名をつけて保管します。(タイムスタンプ等)ですが、本来あがっているべきである画像はfileフォルダには入っていませんでした。
(上記の例の場合fileフォルダには〇と□と◎のファイルしか格納されていない状態)

※文字数制限のため以下のソースコードは3つ分までに省略しています。

upload.php  アップロードされた時の処理

php

1 2 3if($file_category == 1){ 4 $upload_No1 = $_FILES['upload_1']['name']; 5 $upload_No2 = $_FILES['upload_2']['name']; 6 $upload_No3 = $_FILES['upload_3']['name']; 7}else{ 8 $upload_No7 = $_FILES['upload_7']['name']; 9} 10 11if($_SESSION['company_ID'] == ""){?> 12<SCRIPT LANGUAGE="JavaScript"> 13 location.href = "../../index_timeout.php?<?php echo $time;?>"; 14</SCRIPT> 15<?php 16exit(); 17} 18 19if($upload_No1 !== ""){ 20 if($file_category == 1){ 21 $category = pathinfo($_FILES['upload_1']['name'], PATHINFO_EXTENSION); 22 $category = strtolower($category); 23 if($category=="png"){ 24 $category = "1"; 25 }elseif($category=="jpeg"){ 26 $category = "2"; 27 }elseif($category=="jpg"){ 28 $category = "3"; 29 }elseif($category=="pdf"){ 30 $category = "4"; 31 } 32 ?> 33 34 35 <?php 36 $tempfile_1 = $_FILES['upload_1']['tmp_name']; 37 $filename = '../../file/'.$company_ID.$category.$timestamp.".".pathinfo($_FILES['upload_1']['name'], PATHINFO_EXTENSION); 38 39 if (is_uploaded_file($tempfile_1)) { 40 if ( move_uploaded_file($tempfile_1 , $filename )) { 41 } else { 42 } 43 } else { 44 } 45 46 47 $file_name = $_FILES['upload_1']['name']; 48 $system_name = $company_ID.$category.$timestamp.".".pathinfo($_FILES['upload_1']['name'], PATHINFO_EXTENSION); 49 50 $file_url = "http://sample.com/test/maika/dss/mediamanagement/file/".$system_name; 51 $class = 1; 52 $media_No = 1; 53 54 try{ 55 $pdo = new PDO('mysql:dbname=DSS; host=localhost; charset=utf8','maika','powerB1234', 56 array(PDO::ATTR_EMULATE_PREPARES => false)); 57 } catch (PDOException $e) { 58 exit('データベース接続失敗。'.$e->getMessage()); 59 } 60 //プリペアドステートメント 61 $stmt = $pdo -> prepare("INSERT INTO T_FILE(company_ID,pattern,class,media_No,file_name,system_name,other,extension,touroku_date) VALUES (:company_ID,:pattern,:class,:media_No,:file_name,:system_name,:other,:extension,:touroku_date)"); 62 //プレースホルダへ実際の値を設定する 63 if ($stmt===false){ 64 // エラー処理 65 } 66 $stmt->bindparam(':company_ID',$company_ID, PDO::PARAM_STR); 67 $stmt->bindparam(':pattern',$pattern, PDO::PARAM_STR); 68 $stmt->bindparam(':class', $class, PDO::PARAM_STR); 69 $stmt->bindparam(':media_No', $media_No, PDO::PARAM_STR); 70 $stmt->bindparam(':file_name', $file_name, PDO::PARAM_STR); 71 $stmt->bindparam(':system_name', $system_name, PDO::PARAM_STR); 72 $stmt->bindparam(':other', $other, PDO::PARAM_STR); 73 $stmt->bindparam(':extension', $category, PDO::PARAM_STR); 74 $stmt->bindparam(':touroku_date', $time, PDO::PARAM_STR); 75 76 $stmt->execute(); 77 78 // 使用を終了したので、閉じます 79 $stmt = null; 80 $pdo = null; 81 }else{ 82 } 83 84}else{ 85 86} 87 88if($upload_No2 !== ""){ 89 if($file_category == 1){ 90 $category = pathinfo($_FILES['upload_2']['name'], PATHINFO_EXTENSION); 91 $category = strtolower($category); 92 if($category=="png"){ 93 $category = "1"; 94 }elseif($category=="jpeg"){ 95 $category = "2"; 96 }elseif($category=="jpg"){ 97 $category = "3"; 98 }elseif($category=="pdf"){ 99 $category = "4"; 100 } 101 ?> 102 103 104 <?php 105 $tempfile_2 = $_FILES['upload_2']['tmp_name']; 106 $filename = '../../file/'.$company_ID.$category.$timestamp.".".pathinfo($_FILES['upload_2']['name'], PATHINFO_EXTENSION); 107 108 if (is_uploaded_file($tempfile_2)) { 109 if ( move_uploaded_file($tempfile_2 , $filename )) { 110 } else { 111 } 112 } else { 113 } 114 115 116 $file_name = $_FILES['upload_2']['name']; 117 $system_name = $company_ID.$category.$timestamp.".".pathinfo($_FILES['upload_2']['name'], PATHINFO_EXTENSION); 118 119 $file_url = "http://sample.com/test/maika/dss/mediamanagement/file/".$system_name; 120 $class = 1; 121 $media_No = 2; 122 123 try{ 124 $pdo = new PDO('mysql:dbname=DSS; host=localhost; charset=utf8','maika','powerB1234', 125 array(PDO::ATTR_EMULATE_PREPARES => false)); 126 } catch (PDOException $e) { 127 exit('データベース接続失敗。'.$e->getMessage()); 128 } 129 //プリペアドステートメント 130 $stmt = $pdo -> prepare("INSERT INTO T_FILE(company_ID,pattern,class,media_No,file_name,system_name,other,extension,touroku_date) VALUES (:company_ID,:pattern,:class,:media_No,:file_name,:system_name,:other,:extension,:touroku_date)"); 131 //プレースホルダへ実際の値を設定する 132 if ($stmt===false){ 133 // エラー処理 134 } 135 $stmt->bindparam(':company_ID',$company_ID, PDO::PARAM_STR); 136 $stmt->bindparam(':pattern',$pattern, PDO::PARAM_STR); 137 $stmt->bindparam(':class', $class, PDO::PARAM_STR); 138 $stmt->bindparam(':media_No', $media_No, PDO::PARAM_STR); 139 $stmt->bindparam(':file_name', $file_name, PDO::PARAM_STR); 140 $stmt->bindparam(':system_name', $system_name, PDO::PARAM_STR); 141 $stmt->bindparam(':other', $other, PDO::PARAM_STR); 142 $stmt->bindparam(':extension', $category, PDO::PARAM_STR); 143 $stmt->bindparam(':touroku_date', $time, PDO::PARAM_STR); 144 145 $stmt->execute(); 146 147 // 使用を終了したので、閉じます 148 $stmt = null; 149 $pdo = null; 150 }else{ 151 } 152 153}else{ 154 155} 156 157if($upload_No3 !== ""){ 158 if($file_category == 1){ 159 $category = pathinfo($_FILES['upload_3']['name'], PATHINFO_EXTENSION); 160 $category = strtolower($category); 161 if($category=="png"){ 162 $category = "1"; 163 }elseif($category=="jpeg"){ 164 $category = "2"; 165 }elseif($category=="jpg"){ 166 $category = "3"; 167 }elseif($category=="pdf"){ 168 $category = "4"; 169 } 170 ?> 171 172 173 <?php 174 $tempfile_3 = $_FILES['upload_3']['tmp_name']; 175 $filename = '../../file/'.$company_ID.$category.$timestamp.".".pathinfo($_FILES['upload_3']['name'], PATHINFO_EXTENSION); 176 177 if (is_uploaded_file($tempfile_3)) { 178 if ( move_uploaded_file($tempfile_3 , $filename )) { 179 } else { 180 } 181 } else { 182 } 183 184 185 $file_name = $_FILES['upload_3']['name']; 186 $system_name = $company_ID.$category.$timestamp.".".pathinfo($_FILES['upload_3']['name'], PATHINFO_EXTENSION); 187 188 $file_url = "http://sample.com/test/maika/dss/mediamanagement/file/".$system_name; 189 $class = 1; 190 $media_No = 3; 191 192 try{ 193 $pdo = new PDO('mysql:dbname=DSS; host=localhost; charset=utf8','maika','powerB1234', 194 array(PDO::ATTR_EMULATE_PREPARES => false)); 195 } catch (PDOException $e) { 196 exit('データベース接続失敗。'.$e->getMessage()); 197 } 198 //プリペアドステートメント 199 $stmt = $pdo -> prepare("INSERT INTO T_FILE(company_ID,pattern,class,media_No,file_name,system_name,other,extension,touroku_date) VALUES (:company_ID,:pattern,:class,:media_No,:file_name,:system_name,:other,:extension,:touroku_date)"); 200 //プレースホルダへ実際の値を設定する 201 if ($stmt===false){ 202 // エラー処理 203 } 204 $stmt->bindparam(':company_ID',$company_ID, PDO::PARAM_STR); 205 $stmt->bindparam(':pattern',$pattern, PDO::PARAM_STR); 206 $stmt->bindparam(':class', $class, PDO::PARAM_STR); 207 $stmt->bindparam(':media_No', $media_No, PDO::PARAM_STR); 208 $stmt->bindparam(':file_name', $file_name, PDO::PARAM_STR); 209 $stmt->bindparam(':system_name', $system_name, PDO::PARAM_STR); 210 $stmt->bindparam(':other', $other, PDO::PARAM_STR); 211 $stmt->bindparam(':extension', $category, PDO::PARAM_STR); 212 $stmt->bindparam(':touroku_date', $time, PDO::PARAM_STR); 213 214 $stmt->execute(); 215 216 // 使用を終了したので、閉じます 217 $stmt = null; 218 $pdo = null; 219 }else{ 220 } 221 222}else{ 223 224} 225

file.php ファイルをアップロードする画面

php

1<h1>画像アップロード</h1> 2<form method="post" enctype="multipart/form-data" action="upload_execute.php"> 3 4 <li> 5 <input type="file" name="upload_1" accept=".png, .jpg, .jpeg, .pdf" > 6 <input type="hidden" name="file_category" value="1"> 7 備考 8 <textarea name="other" class="textarea"></textarea> 9 </li> 10 11 <li> 12 <input type="file" name="upload_2" accept=".png, .jpg, .jpeg, .pdf" > 13 <input type="hidden" name="file_category" value="1"> 14 備考 15 <textarea name="other" class="textarea"></textarea> 16 </li> 17 18 <li> 19 <input type="file" name="upload_3" accept=".png, .jpg, .jpeg, .pdf" > 20 <input type="hidden" name="file_category" value="1"> 21 備考 22 <textarea name="other" class="textarea"></textarea> 23 </li> 24 25 <button type="submit" class="button">アップロード</button> 26</form> 27

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/07 07:37

コピペミスやテスト用サーバーへのアップロードミスはないと考えてヨシ?
mmm022

2021/07/07 07:45

既にこちらでソースコードのケアレスミス等は一通り確認済みですが、100%ないとは言い切れませんので、もしかしたら見落としはあるかもしれないです...。 アップロードミスはしていないと考えてもらってよろしいかと思います。 URL生成時に使用する変数 $tempfileや$filenameの中身も目的の値が入っていることは確認できています。
fukasawah

2021/07/07 07:55

問題は2つあるように見えています。以下は別の事象なはずですが、それは認識していますか? 「ファイル名や拡張子などの情報はきちんと取得できているもののURLがあげたものとは別の画像と同じもの」 「本来あがっているべきである画像はfileフォルダには入っていませんでした。」 1つ目の「URL」とはこのコード中にあるでしょうか?私には無いように見えますので、どうやってURLを作っているかを明記したほうが良いと思います。おそらくですがDBの値を基にURLを作っていると思いますが、その場合、DBに入れている情報が正しくない可能性があると思います。 2つ目はmove_uploaded_fileで使っている「$tempfile_1, $filename 」の値が目的の値であるかどうかを確認していたら起きないはずです。目的の値が入っていることをどのように確認しましたか?例えば単純にmove_uploaded_fileの前に error_log("$tempfile_1 => $filename"); 等のようにログに出力して確認しましたか?
guest

回答1

0

No1と2と3で変数名の使い回しがあるため、
初期化漏れがあるとちょっと怖い。
is_uploaded_file()やmove_uploadfile()のelse条件の処理が雑なので、
直後のINSERT INTO文を実行しちゃってるね、きっと。
1だけ指定して2や3がカラのとき、
使いまわししている変数に1のときの処理結果が残っちゃっているから、
それを元にINSERT INTO文が実行されているのだと思う。

is_uploaded_file()やmove_uploadfile()で条件が成立していないとき、
どういうINSERT INTO文がいいのかをもう一度考えて実装を見直してみては。

1と2と3で処理内容がまるで同じなのであれば、
いっそ共通関数にでもして外部からfor()ループなどで叩いたほうがまともになりそう。
ユーザー定義関数内の変数で処理が完結するなら1と2と3の混在も避けられるし。
コピペで3つ置くと、一部の変更箇所を全部に適用するときにミスが生じやすいし。

以下、プログラミングスタイル的な話。
PDO接続をしては廃棄してを繰り返している癖が悪いのもちょっと気になる。
接続時のみtry-catchして、INSERT INTO文の実行で例外キャッチしないの、雑すぎでは。
PDOException以外のExceptionが発生したときもキャッチできるようにするべき。

あと、bindParamじゃなくbindValueを使うかなこのシチュエーションなら。
bindParam()だとクエリー実行によって変数の中身の影響を受けるので、
意図しない変化が加わることもあるようで。
そもそもクエリー実行の結果を変数で受けたいときに使うものって気もするし。
bindParam()とbindValue()の違い - Qiita
PHP bindParam()の落とし穴とbindValue()メモ - Qiita

投稿2021/07/07 07:50

編集2021/07/07 08:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問