• ベストアンサー

PHPで定義されるあるクラスの関数について

お世話になります。自分がいま勉強しているPHP教本の中の、画像ファイルをアップロードするクラスUploadを以下に掲載します。 自分の質問は この中のcheckFile()という関数についてです。 それぞれがtrueまたはfalseを返す3つの関数を続けて実行していますが、すべての戻り値がtrueでなければtrueを返せないはずなのに、ここでは一番最後のcheckType()がtrueであれば前の2つはfalseでも構わないことになってしまいます。それぞれの戻り値である$accept を順次かけ合わせていけば問題ないように思われますが、そうではなくて、それぞれを単純に$accept に代入するだけでよいのでしょうか? 詳しい方、どうかご意見をお聞かせください。 class Upload{ protected $destination; protected $max = 81920; protected $messages = [];// error or success message, to show to the user protected $permitted = ['image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/webp' ]; // to check if the uploaded file is one of these types public function __construct($path){ if(is_dir($path) && is_writable($path)){ $this->destination = rtrim($path, '/\\').DIRECTORY_SEPARATOR; }else{ throw new \Exception("$path must be a valid, writable directory.") } } public function upload($fieldname){ $uploaded = $_FILES[$fieldname]; if($this->checkFile($uploaded)){ // child function 1 $this->moveFile($uploaded); // child function 2 } } protected function checkFile($file){ // child function 1 $accept = $this->getErrorLevel($file); $accept = $this->checkSize($file); $accept = $this->checkType($file); return $accept; } protected function moveFile($file){ // $file is the same as $uploaded in parent function $success = move_uploaded_file($file['tmp_name'], $this->destination.$file['name']); if($success){ $result = $file['name'] .' was uploaded successfully.'; $this->messages[] = $result; }else{ $this->messages[] = 'Could not upload '.$file['name']; } } public function getMessages(){ return $this->messages; } protected function getErrorLevel($file){ switch($file['error']){ case 0: return true; case 1: case 2: $this->messages[] = $file['name'].' is too big. (max: '.$this->getMaxSize().')'; break; case 3: $this->messages[] = $file['name'].' was only partially uploaded.'; break; case 4: $this->messages[] = 'No file was submitted.'; break; default: $this->messages[] = 'Sorry. There was a problem uploading '.$file['name']; } return false; } protected function checkSize($file){ if($file['error'] == 1 || $file['error'] == 2 ){ return false; }else if($file['size'] == 0){ $this->messages[] = $file['name']. " is an empty file."; return false; }else if($file['size']>$this->max){ $this->messages[] = $file['name']." exceeds the maximum size for a file (". $this->getMaxSize().")"; return false; } return true; } protected function checkType($file){ if(!in_array($file['type'], $this->permitted)){ $this->messages[] = $file['name']." is not permitted type of file."; return false; } return true; } public function getMaxSize(){ return number_format($this->max/1024, 1)." KB"; } }

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6638/9405)
回答No.1

>それぞれを単純に$accept に代入するだけでよいのでしょうか? 確かにおかしい気がしますね。 2つ目・3つ目を &= に変えた > $accept = $this->getErrorLevel($file); > $accept &= $this->checkSize($file); > $accept &= $this->checkType($file); にすれば、いずれかでエラーになったならばエラー、と返せるんじゃないかと思います。

papashiroSooke
質問者

お礼

早速にご回答をいただき、有難うございます。確かにおかしいですよね。自分もこれは出版社の誤植ではないかと考えていました。&= で戻り値をつないでいけば正しい結果を得られると思います。

Powered by GRATICA

関連するQ&A

  • phpでファイルの読み込みができません

    phpを使って掲示板のコードを書いたのですが、ファイルの読み込みができないとエラーがでます。 なぜ読み込みが出来ないのでしょうか。サーバにアップした際に、権限の変更などが必要なのでしょうか。 以下が問題のコードの部分になります。 function load_data( $file_name, &$data_array ){ global $sys_mes; if( is_readable ( $file_name ) ){ $data_array = @file( $file_name ); return true; }else{ $sys_mes = "ErrorFile open for load<br> データファイルが開けませんでした<br>\n"; return false; } } このコードを実行するとelse文を実行します。なぜでしょうか

    • 締切済み
    • PHP
  • ファイル選択と同時にアップロード HTML+JS

    HTMLとJava Scriptのことを質問させてください <form>タグからファイルを選択すると同時をアップロードしたいと思っています。 複数の「ファイルを選択ボタン」を設置し、それぞれ"001.jpg"、"002.jpg"など指定の名前でアップロードしたいです。 下記のようにいくつかの<form>タグを設置し、javascriptでコントロールできるかと思いケース1のように書いた場合はうまくいったのですが、ケース2のように複数並べて記述した場合、動かなくなり困っております。 どなたか教えていただけないでしょうか? よろしくお願いいたします ケース1) <form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="001.jpg" />    <input type="file" id="file_id_1" name="file_name" accept="image/jpeg"> </form> <form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="002.jpg" />    <input type="file" id="file_id_2" name="file_name" accept="image/jpeg"> </form> <script> var form = document.getElementById("upload_file1"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; </script> ケース2) <form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="001.jpg" />    <input type="file" id="file_id_1" name="file_name" accept="image/jpeg"> </form> <form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="002.jpg" />    <input type="file" id="file_id_2" name="file_name" accept="image/jpeg"> </form> <script> var form = document.getElementById("upload_file1"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; var form = document.getElementById("upload_file2"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; </script>

  • 画像をアップロードする度に古い画像を削除

    お世話になっております。 とあるサイトのソースを参考に画像のリアルタイムプレビューを作成しました。 画像を上げプレビューを表示することはできたのですが画像を上げる度に次々と表示される画像が増えてしまいます。 画像を新しく上げる場合は以前に入っていた画像を削除する、 もしくは最後に上げた画像のみをプレビュー表示する方法はありますでしょうか? unlinkを使用して削除を考えたのですが、 削除とアップロードの両立ができませんでした。 以下が使用しているソースになります。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>jQuery.uploadのサンプル</title> <script type="text/javascript" src="./js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="./js/jquery.upload-1.0.2.min.js"></script> <script type="text/javascript"> $(function() { $('#file_id').change(function() { $(this).upload('upload.php', function(res) { $(res).insertAfter(this); }, 'html'); }); }); </script> </head> <body> <style> .thumb { height: 200px; border: 1px solid #000; margin: 10px 5px 0 0; } </style> <input type="file" name="upload_file" id="file_id"> </body> </html> <?php #アップロードされたファイルが存在するか if ( !is_uploaded_file( $_FILES['upload_file']['tmp_name'] ) ) { echo '<div>ファイルが選択されていません。</div>'; exit(); } #$_FILES["upload_file"]["tmp_name"]がテンポラリにあるファイル名 #$_FILES["upload_file"]["name"]がアップロード元のファイル名 #tmpからファイルをコピー move_uploaded_file($_FILES["upload_file"]["tmp_name"], "files/" . $_FILES["upload_file"]["name"]); echo '<div>'.$_FILES["upload_file"]["name"].'をアップロードしました</div>'; echo '<img class="thumb" src="files/' . $_FILES["upload_file"]["name"] . '">' ?> どなたかご回答いただけましたら幸いでございます。 どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • 同じファイル内で、アップロードとアップロードされたファイルの処理をすることについて

    OS:Window XP Pro 開発環境:Xampp(Apache + PHP + Mysql) 現在ファイルをアップロードする処理を書いているのですが、 この処理を 1)a.phpでファイルをアップロードする処理 2)b.phpでアップロードされたファイルの処理 と分けて、コーディングするのではなく 1)a.php内にファイルをアップロードする処理とアップロードされたファイルの処理を一緒に記述する という風にできないかと思いましたので、 以下のようなコードを書いたのですが $_FILES['upload_file']['tmp_name']) の値を調べてみたところ、なんの値も 入っていなかったことから このコードでは、二つの処理を一つのファイル内に書くことが でいないようでした。 どうにかしてひとつのファイル内に この二つの処理を同居させることはできないのでしょうか? a.php --------------------------------------- switch($action) { case "update": if(is_uploaded_file($_FILES['upload_file']['tmp_name'])) { $upload_file = $_FILES['upload_file']['tmp_name']); if(file_exists(dirname(__FILE__)."/profile_phote/") == TRUE) { $phote_name = dirname(__FILE__)."/profile_phote/".$upload_file; } else { mkdir(dirname(__FILE__)."/profile_phote/"); $phote_name = dirname(__FILE__)."/profile_phote/".$upload_file; } move_uploaded_file($_FILES['upload_file']['tmp_name'],$phote_name); "リダイレクト処理・・・" case ... case ... default: <form name="profile" action="" method="post"> <input type="file" name="upfile"> <input type="hidden" name="action" value="update"> </form> }

    • ベストアンサー
    • PHP
  • PHPのreturnについて

    function hoge(){ if(条件){ return false; } 処理A; return true;  } 上記のような場合if文内通ると、return falseするのでその後の処理Aは走らないですよね? 頭がこんがらがってきました・・・

    • ベストアンサー
    • PHP
  • PHPでファイルのアップロード

    OSはLinuxのfedoraを利用しており、WebサーバーソフトはApacheを利用しています。 PHPを使って、クライアントからサーバーにファイルのアップロードをしたいのですが、プログラミングがあまり理解できておらず、アップロードができません。ちなみにphp.iniファイルの設定に関しては、アップロードは受け付けるようにしていますし、設定にミスはないと思います。 sample.phpというファイル名で下記のファイルを作ってみたのですが、アップロードすることができませんでした。まだPHPは初心者で間違いだらけだと思うのですが、こうすればアップロードできるようになるといった指摘をお願い致します。 <html> <head> <title> </title> </head> <body> <form enctype="multipart/form-data" action="sample.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> Send this file: <input name="userfile" type="file"> <input type="submit" value="Send File"> </form> <?php if(isset($uploadfile) and is_uploaded_file($uploadfile)) { if(move_uploaded_file($uploadfile, $path . "/var/www/html/test/" . $uploadfile_name)){ print("<br>Uploaded file saved."); }else{ print("<br>Uploaded file save failed."); } } ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP で動的ファイル出力

    PHP 猛勉強中です、またお世話になりますm( __ __ )m ドキュメントルート外に置いたイメージファイルを HP からリンクして表示できるように readfile 関数を使った PHP ファイルを作成しようと思っています。 readfile.php に対して URL クエリーでhttp://hoge/readfile.php?name=hage&ext=jpg のような感じで呼び出したいと思っています。 ※ name はファイル名、 ext は拡張子です。 [readfile.php] <?php $_name = ""; $_ext = ""; if(isset($_GET["name"]) === true && isset($_GET["ext"]) === true){ // null byte 対策 $_name = delete_nullbyte($_GET["name"]); $_ext = delete_nullbyte($_GET["ext"]); // ディレクトリトラバーサル対策 $_name = str_replace(".", "", @htmlspecialchars($_name, ENT_QUOTES, "UTF-8")); $_ext = str_replace(".", "", @htmlspecialchars($_ext, ENT_QUOTES, "UTF-8")); }else{ exit(); } $_file_path = "/home/xxx/img/" . $_name . "." . $_ext; // ファイル存在確認 if(file_exists($_file_path) === false){ exit(); } // MimeType 取得 $_ext_type = substr($_file_path, -3); $_mime_type = ""; if(strcasecmp($_ext_type, "jpg") === 0){ $_mime_type = "image/jpeg"; _out_file($_file_path, $_mime_type); }else{ exit(); } ///////////////////////////////////////////////// // ファイル出力 function _out_file($file_path, $mime_type) { // ファイル名取得 $_fname = @basename($file_path); // ファイルストリーム取得 header('Content-Type: ' . $mime_type); header("Content-Disposition: inline; filename='" . $_fname . "'"); readfile($file_path); } ///////////////////////////////////////////////// // null byte 除去メソッド function delete_nullbyte($str) { if(is_array($str) === true){ return ""; } return str_replace("\0", "", $str); } ?> 色々作業を進めるうちに「null byte 攻撃」や「ディレクトリトラバーサル攻撃」などの言葉が耳に入ってきてセキュリティ的に不安を感じています。 自分なりに調べて上記のようなコーディングをしましたが、果たして問題が無いのか、それとももっとたくさん考えなくてはならないのか、先輩方の意見が聞きたく質問させていただきました。 よろしくお願いしますm( __ __ )m

    • ベストアンサー
    • PHP
  • phpでのファイルアップロード

    ファイルのアップロードについてご質問があります。 宜しくお願いします。 基礎phpという本でファイルをアップロードするサンプルがあり、このスクリプトでアップロードされたファイルを格納する『upload』というディレクトリをサーバに作成し、スクリプトを実行して、実際にファイルがアップロードできているかffftpにて『upload』ディレクトリの中を見てみると、なにも表示されませんでした。しかしブラウザから http://myドメイン/upload/ファイル名 にアクセスすると表示されます。 ですのでアップロードはできているがファイルが見えないという状態になっております。また『upload』ディレクトリの削除などもできなくなってしまいます。 サーバの設定が関係しているのかとも思ったのですが、サーバの設定を変更することはできないので、プログラムがわで何とかできないでしょうか? 大変申し訳ありませんが宜しくお願いいたします。 以下がそのコードです。 【up.html】 <html> <head><title>File Uploader</title></head> <body> <form method="post" enctype="multipart/form-data" action="up.php"> <input type="file" name="upfile"> <input type="submit" value="upload"> </form> </body> </html> 【up.php】 <html> <head><title>File Uploader</title></head> <body> <p> file uploader </p> <?php $updir = "./upload/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed..."); print($_FILES['upfile']['error']); }else { print("<b>" . $filename . "</b> uploaded!"); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • javascriptの関数につきまして

    javascriptの関数につきまして javascriptの関数につきましての質問です。 Daycheck()関数 function Daycheck(year, mon, day){ maxDayOfMonth = Array( 31,29,31,30,31,30,31,31,30,31,30,31 ); if (year < 1901 || 2200 < year) return false; if( mon < 1 || mon > 12 ) return false; if( day < 1 || day > maxDayOfMonth[mon-1] ) return false; if( mon != 2 ) return true; if( day < 29 ) return true; if( ( year % 4 ) == 0 && ( year % 100 ) != 0 ) return true; if( ( year % 400 ) == 0 ) return true; return false; } というサンプルソースを見たのですが、Daycheck()の中のif( mon != 2 ) return true;とは2月以外が選択されていた場合trueを返す。 つまり、2月は選択できないということでしょうか? プログラミングについて詳しい方がいらっしゃりましたらご指導お願いします。 宜しくお願い致します。

  • 3日で作るPHPの本で画像アップロードするには?

    3日で作るPHPの本で画像アップロードするには? フォーム内 画像 <input type="file" name="image" size="40"><br> 下記内容でファイル内に保存する $upload_file = date("ymdHis")."_".basename($_FILES["image"]["name"]); $upload_path = "<保存先のディレクトリ名>".$upload_file; $upload_url = "./images/".$upload_file; move_uploaded_file($_FILES["image"]["tmp_name"],$upload_path); 以上のように表記してありましたが、 表示の仕方が書いていなくどのように表記したよいのかサンプルなどで教えていただきたいです。 さらに上記のように保存先のディレクトリ名書を絶対相対パスで書いてみたのですが保存されませんでした。 どこを変更するとよいでしょうか

    • 締切済み
    • PHP

専門家に質問してみよう