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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

2回答

750閲覧

unlink を2回実行して、どちらかの削除が失敗したら false を返したいです。

takopo

総合スコア484

PHP

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

0グッド

0クリップ

投稿2019/03/09 15:44

質問させてください。
下のような形で、サムネイルがある場合は普通の画像とサムネイルを、ない場合は普通の画像だけ削除するコードを書いていまして、削除が失敗したときに例外を投げる用に戻り値を受け取っています。

サムネイルがない場合は問題ないのですが、ある場合、unlinkを2回実行することになり、$resが上書きされてしまって、戻り値が正しく受け取れないです。
これを2枚の画像どちらかの削除が失敗したら、$resfalseを入れるためにはどのようにすればよろしいでしょうか。
どなたかご存知の方がいらっしゃいましたらご教授いただけますと助かります。

よろしくお願いいたします。

php

1// サムネイルがある場合は、「photo.jpg」と「thumb.jpg」両方削除 2if ($flg === 1) { 3 $res = unlink ('photo.jpg'); // ←これと 4 $res = unlink ('thumb.jpg'); // ←これのどちらかが失敗したら $res に false を入れたい 5// サムネイルがない場合は「photo.jpg」だけ削除 6} else { 7 $res = unlink ('photo.jpg'); 8} 9 10if ($res === false) { 11 throw new Exception('ファイルの削除に失敗しました'); 12}

試したこと

if 文でどちらの削除も成功したときだけtrueを入れる、というふうにしてみたのですが、階層が深くなってしまって見にくいので、もう少しシンプルにしたいです。

php

1if ($flg === 1) { 2 $res1 = unlink ('photo.jpg'); 3 $res2 = unlink ('thumb.jpg'); 4 if ($res1 === true && $res2 === true) { 5 $res = true; 6 } else { 7 $res = false; 8 } 9} else { 10 $res = unlink ('photo.jpg'); 11}

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1if (file_exists('photo.jpg') && unlink('photo.jpg') && 2file_exists('thumb.jpg') && unlink('thumb.jpg')) { 3 // OK 4} else { 5 // NG 6 throw new Exception('ファイルの削除に失敗しました'); 7} 8

実装として正しいのはこっちだろうな

php

1<?php 2 3if (file_exists('photo.jpg')) { 4 if (!unlink('photo.jpg')) { 5 throw new Exception('ファイルの削除に失敗しました'); 6 } 7} 8if (file_exists('thumb.jpg')) { 9 if (!unlink('thumb.jpg')) { 10 throw new Exception('ファイルの削除に失敗しました'); 11 } 12}

php

1<?php 2 3foreach (['photo.jpg', 'thumb.jpg'] as $file) { 4 if (file_exists($file)) { 5 if (!unlink($file)) { 6 throw new Exception('ファイルの削除に失敗しました'); 7 } 8 } 9}

投稿2019/03/09 16:33

編集2019/03/09 16:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takopo

2019/03/09 16:54 編集

ご回答ありがとうございます。 なるほど結果を戻り値に返さず、その場で例外を投げればよかったのですね。 考え方がとても参考になりました。 あとすみません、file_exists というのはなぜ必要なのでしょうか・・・?
退会済みユーザー

退会済みユーザー

2019/03/09 17:01 編集

エラーメッセージが「ファイルの削除に失敗しました」なので、unlinkの結果だけをもって「ファイル削除に失敗した」とは言えないためです。 unlink() は対象のファイルが存在しなかったときに、Warning 例外が発生する。
takopo

2019/03/09 17:05

そういうことだったのですね。とても勉強になりました。
guest

0

まあ別のアプローチ(bit 演算子による累積)

$flag = true; $flag &= file_exists($file1) && unlink($file1); $flag &= file_exists($file2) && unlink($file2); if ($flag) { // すべてのファイルが削除されました。 } else { // 削除に失敗したファイルが存在します。 }

投稿2019/03/09 16:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takopo

2019/03/09 17:09

ご回答ありがとうございます。 こういった方法もあるのですね。「&=」というのを今初めて知りまして、とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問