teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

誤字修正

2021/01/30 10:58

投稿

mjxoxo
mjxoxo

スコア6

title CHANGED
File without changes
body CHANGED
@@ -109,7 +109,7 @@
109
109
  //ファイルがフォルダに存在しているかのチェック
110
110
  if(file_exists('./images/' . $image)){
111
111
  $message1 = '画像をアップロードしました';
112
- $sql = 'UPDATE cc SET cc_photo = :image WHERE cc_date = "'.$cc['cc_date'].'" AND cc_name = "'.$cc['cc_name'].'"';
112
+ $sql = 'UPDATE テーブル名 SET photo = :image WHERE date = "'.$検索用変数1.'" AND name = "'.$検索用変数2.'"';
113
113
  try {
114
114
  $stmt = $dbh->prepare($sql);
115
115
  $stmt->bindValue(':image', $image, PDO::PARAM_STR);

3

拡張子の検査を追加し全体を見直し

2021/01/30 10:58

投稿

mjxoxo
mjxoxo

スコア6

title CHANGED
File without changes
body CHANGED
@@ -58,21 +58,21 @@
58
58
  <?php endif;?>
59
59
  ```
60
60
 
61
- ※追記 2021/1/30
61
+ ※追記 2021/1/30 19:20修正
62
62
  m.ts10806様にご指摘頂いた部分を念頭に
63
63
  色々な事が理解出来ていないと感じましたので勉強し直しまして、以下のように致しました。
64
64
 
65
65
  ①imageとnameの相違を修正して一致させる
66
66
  ②do{}while (file_exists('./images/' . $image));とし既に同名ファイルが存在してしまっている間は出し直し
67
- ③mt_rand()time().mt_rand()に変更(③があれば②は余分かもしれません)
67
+ ③mt_rand()time().mt_rand()に変更(③があれば②は余分かもしれません)
68
68
  ④try-catchを接続時以外にも追加
69
69
  ⑤トランザクションを追加
70
+ ⑥「本質的に画像じゃないもの」に対する検査の為に明示的に拡張子を検査
71
+ 参考
72
+ https://qiita.com/papillon/items/6904437e4c98e3783eb3
73
+
70
74
  現在の所正常にファイルがアップされている為、実際にはおかしいコードになっているかもしれません。
71
75
  何分初めての処理ばかりで、判断がついていない状況です。
72
-
73
- 「本質的に画像じゃないもの」に対する検査に関しては
74
- https://qiita.com/papillon/items/6904437e4c98e3783eb3
75
- のような記事を発見したのですが、具体的にどうすればよいかに関してはまだたどり着けていません。
76
76
  お時間がかかってしまってすみません。
77
77
 
78
78
  "解決方法”は自己解決の場合のみ と記載があるのでこちらにコードを乗せました。
@@ -88,39 +88,43 @@
88
88
  } catch (PDOException $e) {
89
89
  // ロールバック
90
90
  $dbh->rollBack();
91
- // エラーメッセージ出力
91
+ // エラーメッセージ出力
92
92
  echo $e->getMessage();
93
93
  die();
94
94
  }
95
- if (isset($_POST['upload'])) {//送信ボタンが押された場合
95
+ if (isset($_POST['upload']) && !empty($_FILES['image']['name'])) {//送信ボタンが押されていて、ファイルがアップされてい
96
- do{
96
+ do{//imagesディレクトリに同名になるファイルが存在してしまっている間は出し直しをする
97
97
  $image = uniqid(time().mt_rand(), true);//ファイル名をユニーク化
98
- }while (file_exists('./images/' . $image));//imagesディレクトリに同名になるファイルが存在してしまっている間は出し直し
98
+ }while (file_exists('./images/' . $image));
99
- $image .= '.' . substr(strrchr($_FILES['image']['name'], '.'), 1);//アップロードされたファイルの拡張子を取得
99
+ $filepath = pathinfo($_FILES['image']['name']);
100
+ $ext = $filepath['extension'];//拡張子を取得
101
+ if($ext !=="jpg" && $ext !=="jpeg" && $ext !=="gif" && $ext !=="png") { //拡張子がこの4つ何れでも無ければ
102
+ $message2 = '画像ファイルではありません';
103
+ }else{//拡張子がこの4つのどれかに該当したら
104
+ $image .= '.' .$ext;//ファイル名と拡張子を合体
100
- $file = "images/$image";
105
+ $file = "images/$image";
101
- if (!empty($_FILES['image']['name'])) {//ファイルが選択されていれば$imageにファイル名を代入
102
106
  move_uploaded_file($_FILES['image']['tmp_name'], './images/' . $image);//imagesディレクトリにファイル保存
107
+ //念の為exif_imagetypeでもチェック
108
+ if (exif_imagetype($file)) {
103
- //ファイルがフォルダに存在しているかのチェック
109
+ //ファイルがフォルダに存在しているかのチェック
104
- if(file_exists('./images/' . $image)){
110
+ if(file_exists('./images/' . $image)){
105
- if (exif_imagetype($file)) {//画像ファイルかのチェック
106
111
  $message1 = '画像をアップロードしました';
107
112
  $sql = 'UPDATE cc SET cc_photo = :image WHERE cc_date = "'.$cc['cc_date'].'" AND cc_name = "'.$cc['cc_name'].'"';
108
113
  try {
109
114
  $stmt = $dbh->prepare($sql);
110
115
  $stmt->bindValue(':image', $image, PDO::PARAM_STR);
111
116
  $stmt->execute();
112
- // コミット
113
117
  $dbh->commit();
114
118
  } catch(PDOException $e) {
115
- // ロールバック
119
+ // ロールバック
116
- $dbh->rollBack();
120
+ $dbh->rollBack();
117
- // エラーメッセージ出力
121
+ // エラーメッセージ出力
118
- echo $e->getMessage();
122
+ echo $e->getMessage();
119
- die();
123
+ die();
120
124
  }
121
- } else {
122
- $message2 = '画像ファイルではありません';
123
125
  }
126
+ } else {
127
+ $message2 = '画像ファイルではありません';
124
128
  }
125
129
  }
126
130
  }

2

誤字修正

2021/01/30 10:20

投稿

mjxoxo
mjxoxo

スコア6

title CHANGED
File without changes
body CHANGED
@@ -63,7 +63,7 @@
63
63
  色々な事が理解出来ていないと感じましたので勉強し直しまして、以下のように致しました。
64
64
 
65
65
  ①imageとnameの相違を修正して一致させる
66
- ②do{}while (file_exists('./images/' . $image));とし既に同名ファイルが存在してしまっていないる間は出し直し
66
+ ②do{}while (file_exists('./images/' . $image));とし既に同名ファイルが存在してしまっている間は出し直し
67
67
  ③mt_rand()→time().mt_rand()に変更(③があれば②は余分かもしれません)
68
68
  ④try-catchを接続時以外にも追加
69
69
  ⑤トランザクションを追加

1

その後に関して追記

2021/01/30 08:06

投稿

mjxoxo
mjxoxo

スコア6

title CHANGED
File without changes
body CHANGED
@@ -56,4 +56,73 @@
56
56
  <button><input type="submit" name="upload" value="送信"></button>
57
57
  </form>
58
58
  <?php endif;?>
59
+ ```
60
+
61
+ ※追記 2021/1/30
62
+ m.ts10806様にご指摘頂いた部分を念頭に
63
+ 色々な事が理解出来ていないと感じましたので勉強し直しまして、以下のように致しました。
64
+
65
+ ①imageとnameの相違を修正して一致させる
66
+ ②do{}while (file_exists('./images/' . $image));とし既に同名ファイルが存在してしまっていないる間は出し直し
67
+ ③mt_rand()→time().mt_rand()に変更(③があれば②は余分かもしれません)
68
+ ④try-catchを接続時以外にも追加
69
+ ⑤トランザクションを追加
70
+ 現在の所正常にファイルがアップされている為、実際にはおかしいコードになっているかもしれません。
71
+ 何分初めての処理ばかりで、判断がついていない状況です。
72
+
73
+ 「本質的に画像じゃないもの」に対する検査に関しては
74
+ https://qiita.com/papillon/items/6904437e4c98e3783eb3
75
+ のような記事を発見したのですが、具体的にどうすればよいかに関してはまだたどり着けていません。
76
+ お時間がかかってしまってすみません。
77
+
78
+ "解決方法”は自己解決の場合のみ と記載があるのでこちらにコードを乗せました。
79
+ (※sqlは既にレコードをinsertした後に画像を追加する仕様なのでupdateにしています)
80
+ ```ここに言語を入力
81
+ <?php
82
+ $dsn = "mysql:host=localhost; dbname=xxx; charset=utf8";
83
+ $username = "xxx";
84
+ $password = "xxx";
85
+ try {
86
+ $dbh = new PDO($dsn, $username, $password);
87
+ $dbh->beginTransaction();
88
+ } catch (PDOException $e) {
89
+ // ロールバック
90
+ $dbh->rollBack();
91
+ // エラーメッセージ出力
92
+ echo $e->getMessage();
93
+ die();
94
+ }
95
+ if (isset($_POST['upload'])) {//送信ボタンが押された場合
96
+ do{
97
+ $image = uniqid(time().mt_rand(), true);//ファイル名をユニーク化
98
+ }while (file_exists('./images/' . $image));//imagesディレクトリに同名になるファイルが存在してしまっている間は出し直し
99
+ $image .= '.' . substr(strrchr($_FILES['image']['name'], '.'), 1);//アップロードされたファイルの拡張子を取得
100
+ $file = "images/$image";
101
+ if (!empty($_FILES['image']['name'])) {//ファイルが選択されていれば$imageにファイル名を代入
102
+ move_uploaded_file($_FILES['image']['tmp_name'], './images/' . $image);//imagesディレクトリにファイル保存
103
+ //ファイルがフォルダに存在しているかのチェック
104
+ if(file_exists('./images/' . $image)){
105
+ if (exif_imagetype($file)) {//画像ファイルかのチェック
106
+ $message1 = '画像をアップロードしました';
107
+ $sql = 'UPDATE cc SET cc_photo = :image WHERE cc_date = "'.$cc['cc_date'].'" AND cc_name = "'.$cc['cc_name'].'"';
108
+ try {
109
+ $stmt = $dbh->prepare($sql);
110
+ $stmt->bindValue(':image', $image, PDO::PARAM_STR);
111
+ $stmt->execute();
112
+ // コミット
113
+ $dbh->commit();
114
+ } catch(PDOException $e) {
115
+ // ロールバック
116
+ $dbh->rollBack();
117
+ // エラーメッセージ出力
118
+ echo $e->getMessage();
119
+ die();
120
+ }
121
+ } else {
122
+ $message2 = '画像ファイルではありません';
123
+ }
124
+ }
125
+ }
126
+ }
127
+ ?>
59
128
  ```