学習日記 20230918
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つ
- 0もしくは空白文字の要素は削除する
- 削除した後、詰める
- $_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