🎉

学習日記 20230918

2023/09/18に公開

8:50 2023/09/18
おはようございます。
つづきです。
foreach とforを合わせる書き方はうまくいった。
あとはどういうバリデーションを考えるか、というだけ。
現投稿が1枚だけなのに、その画像を削除しようとしたらエラー。
これを最初に持ってこないといけないね。

$array = array(1,2,3)という配列があった場合
isset($array[4])と、range外のものを調べても、range errorにならない。
falseが返ってくるだけ。

サーバ内の写真データ削除は1日ごとくらいに、
写真のファイル名がDB上になかったら削除するというcronをいつか考えればいいかな。

前にも書いた気がするけど、投稿画像の編集をするにあたって、
ユーザはどういう操作をするだろうか

テキスト系を編集する
画像を削除する
画像を追加する
画像を差し替える(=画像を削除して追加する)

この4つだけしかできない。
テキスト系のバリテーションは簡単だから、飛ばす

画像を削除する場合は削除して、追加する場合は追加する。
うわー。あともう少し。
今回は絶対あっていると思うから
あともう少しなんだが、集中が切れたので一旦、他のことしよう。
9:55 2023/09/18

13:57 2023/09/18
ファイルを削除する。
unlink('削除対象へのファイルパス')

更新の場合は、画像登録と同じように画像がPOSTされた場合に差し替えを行います。
その時に、画像があればそれを削除してから、アップロードするといった流れになると思います。

いずれも、画像の差し替え、削除が終わってから、データベースの画像情報を更新するようにします。
(逆の場合ですと、データベース更新後に、画像削除・差し替えが失敗すると不整合が起きてしまうのがその理由です。)

テーブル内の全データを削除するために発行するSQLは
DELETE FROM tablename

ファイルのアップロード確認
is_uploaded_file('filepath')
投稿画像のファイルサイズ確認
array_sum($_FILES['input_name']['size']

よし、とりあえず、投稿画面で、
1枚目の投稿フォームじゃなくて、2枚目の投稿フォームから投稿しても、
頭詰めして、1枚目のデータとして扱うように
$_FILESを加工する処理は成功。
これを元に、前から考えていた1枚も画像を投稿していない場合のエラー判定ができる。

なんかダメだった。
2枚目の投稿フォームから投稿しても添え字数字はずれているので、
ダメだった。
array_filterで空白文字が入った要素をフィルタリングした後、
array_mergeで添え字番号を振りなおす。
そうすることによって、たとえ2枚目の投稿フォームから投稿したとしても
添え字番号は1枚目のものとして振りなおされて、期待する処理が可能となる。

どういうものを作っているか、実際にモノを見ていただいた方がわかりやすいと思う。
まず、$_FILESで渡ってくる元配列がこれ。

array(1) {
  ["up_image"]=>
  array(6) {
    ["name"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["full_path"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["type"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["tmp_name"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["error"]=>
    array(3) {
      [0]=>
      int(4)
      [1]=>
      int(4)
      [2]=>
      int(4)
    }
    ["size"]=>
    array(3) {
      [0]=>
      int(0)
      [1]=>
      int(0)
      [2]=>
      int(0)
    }
  }
}

これは <input name="up_image[]">という書き方でPOSTしている。
この時、1枚目の投稿フォームから投稿すると当然下のようになる。

array(1) {
  ["up_image"]=>
  array(6) {
    ["name"]=>
    array(3) {
      [0]=>
      string(23) "desk-g5b22c4658_640.jpg"
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["full_path"]=>
    array(3) {
      [0]=>
      string(23) "desk-g5b22c4658_640.jpg"
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["type"]=>
    array(3) {
      [0]=>
      string(10) "image/jpeg"
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["tmp_name"]=>
    array(3) {
      [0]=>
      string(14) "/tmp/php9bz7KB"
      [1]=>
      string(0) ""
      [2]=>
      string(0) ""
    }
    ["error"]=>
    array(3) {
      [0]=>
      int(0)
      [1]=>
      int(4)
      [2]=>
      int(4)
    }
    ["size"]=>
    array(3) {
      [0]=>
      int(45741)
      [1]=>
      int(0)
      [2]=>
      int(0)
    }
  }
}

しかし、2枚目の投稿フォームから投稿すると当然こうなる。

array(1) {
  ["up_image"]=>
  array(6) {
    ["name"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(49) "man-at-home-in-quarantine-working-on-computer.jpg"
      [2]=>
      string(0) ""
    }
    ["full_path"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(49) "man-at-home-in-quarantine-working-on-computer.jpg"
      [2]=>
      string(0) ""
    }
    ["type"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(10) "image/jpeg"
      [2]=>
      string(0) ""
    }
    ["tmp_name"]=>
    array(3) {
      [0]=>
      string(0) ""
      [1]=>
      string(14) "/tmp/phpJQnKyq"
      [2]=>
      string(0) ""
    }
    ["error"]=>
    array(3) {
      [0]=>
      int(4)
      [1]=>
      int(0)
      [2]=>
      int(4)
    }
    ["size"]=>
    array(3) {
      [0]=>
      int(0)
      [1]=>
      int(532683)
      [2]=>
      int(0)
    }
  }
}

解消すべき問題は2つ

  1. 0もしくは空白文字の要素は削除する
  2. 削除した後、詰める
  3. $_FILESのerrorは邪魔だから取らない。

ここからは2つ目の投稿フォームから投稿した際の$_FILESを使用して説明する。
1については、array_filterを使用した。3はifで外した
そうすると、空白文字は削除できるが、配列の添え字数字も継承してしまう。

array(5) {
  ["name"]=>
  array(1) {
    [1]=>
    string(49) "man-at-home-in-quarantine-working-on-computer.jpg"
  }
  ["full_path"]=>
  array(1) {
    [1]=>
    string(49) "man-at-home-in-quarantine-working-on-computer.jpg"
  }
  ["type"]=>
  array(1) {
    [1]=>
    string(10) "image/jpeg"
  }
  ["tmp_name"]=>
  array(1) {
    [1]=>
    string(14) "/tmp/phplgMRep"
  }
  ["size"]=>
  array(1) {
    [1]=>
    int(532683)
  }
}

#処理コード
foreach ($_FILES['up_image'] as $key => $value){
	if($key !== 'error'){
		$up_image_array[$key] = array_filter($value);
	}
}

そこで添え字数字を振りなおすために新たにarray_mergeをした。
次のように添え字が1->0になっていることが確認できる。

array(5) {
  ["name"]=>
  array(1) {
    [0]=>
    string(49) "man-at-home-in-quarantine-working-on-computer.jpg"
  }
  ["full_path"]=>
  array(1) {
    [0]=>
    string(49) "man-at-home-in-quarantine-working-on-computer.jpg"
  }
  ["type"]=>
  array(1) {
    [0]=>
    string(10) "image/jpeg"
  }
  ["tmp_name"]=>
  array(1) {
    [0]=>
    string(14) "/tmp/php3ndwPc"
  }
  ["size"]=>
  array(1) {
    [0]=>
    int(532683)
  }
}

#処理コード
foreach ($_FILES['up_image'] as $key => $value){
	if($key !== 'error'){
		$up_image_array[$key] = array_merge(array_filter($value));
	}
}

やりたかった写真投稿の処理修正
ようやく終わった。
自分はどういうことがしたいのか。
それを言葉にできる力を高めていった方がいいと思った。
経験がものをいうのだろうか。
この4行くらいのコードを考え抜くのに、数時間かかった。

18:10 2023/09/18

Discussion