2009-07-17 8 views
7

私の最初の質問は、ありがとう。 :)

私は自分の会社のサポートロギングシステムを開発しており、ファイルがアップロードされ、データベースに提出された問題も許可する必要があります。 サポートの問題とともに、確認するアップロードが0〜6回ある可能性があります。私は、イメージがtype = "file"入力によって選択されるか、フォームから削除されるたびに、jsを介して更新される隠れた入力フィールド(imgcount)を持つことによって、そこにいくつのファイルがあるかという正確な変数を得ることができました。

私の[input type = "file"]の名前はimage1、image2などです。私が思うように、この方法でループするのは簡単でしょう。

フォームが送信されると、次のコードでは、ファイルが有効かどうかを確認して、有効なタイプ(gif/jpeg/png)であることを確認して、安全にアップロードできます。私はサポートシステムが安全なログオンを持っており、私たちのクライアントを信頼しているので、ウイルスについてあまり心配していません。

$sscount = $_POST['imgcount']; 
echo $sscount; //to test the variable 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 
     if (($_FILES["image$i"]["type"] == "image/gif") 
     || ($_FILES["image$i"]["type"] == "image/jpeg") 
     || ($_FILES["image$i"]["type"] == "image/png") 
     && ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 
     else 
     { 
     $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />"; 
     } 
    } 
} 

これは正しくループしているようには見えませんが、どのようにループスルーして正しく戻ってくるのでしょうか?

答えて

8

、それは実際にA OR B OR (C AND D)

ですかっこを使用して、意図した評価を実施することができます。

しかし、このようなものは読み/維持するためにクリーンかつ容易かもしれません:

$allowed_types=array(
    'image/gif', 
    'image/jpeg', 
    'image/png', 
); 


$sscount = $_POST['imgcount']; 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 

     if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
      ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 

    } 
} 
+0

ありがとうポール、多くの感謝 - 私は最後にこれを行った。 – Stann0rz

+0

ニースコードPaul。 – Josh

2

あなたのブール論理はあいまいであり、あなたが望むことをしていない可能性があります。これはおそらく、より良い動作します:

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

私はdruthersを持っていた場合は、全体の事は次のようになりますが:

$file = $_FILES['image' . $i]; 
    $type = $file['type']; 
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000) 
+1

これはあくまで作者が意図したものではありません。演算子優先ルールは、その式のあいまいさを解決します。 –

+0

私の謝罪;私が "あいまい"を使っていたのはあいまいでした。 – chaos

+0

これは完全に仕事をするようです。 –

0

私はあなたのif条件が間違っていると思います。あなたはこのようなORで結合されているブール値の最初のグループ、周りのブラケットを必要とする:「ファイル(GIFまたはJPEGまたはPNG)の画像であり、そのサイズより小さい場合、」

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

これが正しく意味します。

あなたが以前に持っていたやり方は、あなたが望むロジックではなかったでしょう。

5

これはあなたの質問に対する直接的な答えではありませんが、PHPにフォーム値を渡すことができます。 in_array()は、値が許可リスト内にあるかどうかをチェックするのにも役立ちます。

HTML:

<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 

PHP:& &オペレータはあなたが意図したとおり||よりprecedence高い、そうではなく(A OR B OR C) AND Dを持って

<?php 
if (isset($_FILES['image'])) { 
    foreach ($_FILES['image'] as $file) { 
     if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png")) 
      || $file['size'] > 500000) { 
      //error 
     } else { 
      //ok 
     } 
    } 
} 
+1

+1は 'in_array()'の提案です。 – ceejayoz

+0

私は2番目のトムハイの+1 – Josh

4

他の人が述べたように、あなたはあなたの条件文をグループ化した方法が間違っていました。しかし、単にかっこを追加するのではなく、2つの条件を完全に分離することをお勧めします。

// this declaration + the use of in_array() isn't necessary, 
// it just makes things a bit cleaner. 
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000) 
{ 
    if(in_array($_FILES["image$i"]["type"], $file_types))) 
    { 
     // do stuff 
    } 
    else 
    { 
     // error about file type 
    } 
} 
else 
{ 
    // error about file size 
} 

このように分離すると、コードが読みやすくなり、条件階層がより簡単に示唆され、エラーメッセージをより意味のあるものにすることができます。さまざまなタイプの条件文を分離して、エラーメッセージが有効なまま残るようにすることをお勧めします。あなたのコードがそのままエラーを投げた場合、ユーザーは自分のイメージが大きすぎるのか間違ったのかを知る方法がありません。

+1

+1異なるエラーメッセージです。 –

0

すべての['type'] == x ||を組み合わせることができます。

$ _FILES [..] ['type']は、クライアントによって送信された、phpによってチェックされたり、サニタイズされていないデータを含んでいます。ファイルのタイプが関連性のものであれば、$ _FILES [..] ['type']や$ _FILES [..] ['name']の接尾辞に依存しません。 実際の内容のみが重要です。必要ならば、the fileinfo extensionまたはmime_content_type()でそれをテストすることができます(これはfileinfoのために非推奨とマークされています)

2

本当にJavascriptで更新される変数は必要ないと思います。 PHPを使用して、アップロードされたファイルの数を確認することができます。checking the error codeさまざまなブラウザが異なるMIMEタイプを送信することが多いため、ファイルの拡張子をチェックすることでファイルのアップロードを処理できます。私が話していることの例です:

$accepted_files = array(
    'jpg', 
    'png', 
    'gif', 
    'jpeg' 
); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    foreach($_FILES as $key => $upload) { 
     if ($upload['error'] == 0) { 
      $file_parts = explode ('.',$upload['name']); 
      if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) { 
       // This type of file is a-ok 
      } 
      else { 
       // Not an accepted file type 
      } 
     } 
    } 
} 
+0

私はこの方法が好きです、ヒントのためにありがとう。 私はこの作業を、私が取り組んでいる別のプロジェクトに使っています。 – Stann0rz

+0

+1不要なJavascriptを使用していないため、あまり複雑ではないソリューションが優れています – Josh

関連する問題