2013-08-02 8 views
7

psdファイルを選択すると、PHPコードのif文が真となり、echos "image/vnd.adobe.photoshop"が渡される理由を教えてもらえますか?これは間違っているのでif文が真を返す

<?php 

if (isset($_POST['submit'])) { 
    foreach ($_FILES["myimages"]["error"] as $key => $error) { 
     $tmp_name = $_FILES["myimages"]["tmp_name"][$key]; 
     $name = $_FILES["myimages"]["name"][$key]; 
     $imagetype = $_FILES['myimages']['type'][$key]; 

     if ($imagetype == "image/jpeg" || "image/gif") { 
      echo $imagetype; 
     } 
    } 
} 

?> 

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 

<form method="post" enctype="multipart/form-data" action="<? echo basename(__file__); ?>"> 
    <input type="file" name="myimages[]" multiple> 
    <input name="submit" type="submit" value="submit"> 
</form> 

</body> 
</html> 
+0

一般的なヒント:ほとんどの現代のIDEで検査を有効にして、 'if(" foo "){'のように強制するこれらの間違いを見つけやすくするために 'if(" foo "=== true"){'(これは' false'です)を書いてください。 – Halcyon

答えて

9

if($imagetype == "image/jpeg" || "image/gif") { /*...*/ } 

if($imagetype == "image/jpeg" || $imagetype == "image/gif") { /*...*/ } 

かであっても

if(in_array($imagetype, ["image/jpeg", "image/gif"])) { /*...*/ } 

でなければならず、空でない文字列が真と見なされるため、IF条件が満たされたためです。

+3

予期せぬ真実を返す_why_も説明してください。 –

+2

説明: 'image/gif'が空でない文字列であるため、' if(anyCondition || "image/gif") 'は常にtrueを返します。私は、OPは '||'が何か他のことをしていると思うと思う。 –

+0

申し訳ありません。私は最初になりたかったのです:P今度は – MightyPork

2

あなたの||声明は、何が起こっている

$imagetype == "image/jpeg" || 
$imagetype == "image/gif" 

は、「画像/ GIFが」trueを返すされている間違っていると、その真のは の$にimagetype ==「画像/ JPEG」で返される偽とOR演算されています。偽||

この場合で を評価されます ​​

関係なく、何であるかと評価さ
if($condition1 || true) 

真==真

1
if($imagetype == "image/jpeg" || "image/gif") 

はにequivqlentです$condition1の値

if(false || true)ために戻っtrue

もう一つのポイント:私は代わりに=====演算子を使用することをお勧めので、あなたの最終的なコードは次のようになります。

if($imagetype === "image/jpeg" || $imagetype === "image/gif") 
4

これは、ビット演算子を持っているされているため、平等チェックよりも低い優先順位。

  1. あなたは

    if ($imagetype == "image/jpeg" || "image/gif") { 
    
  2. 平等が最初にブール値を決議持っており、あなたの式は次のようになります:それはこのように書き

    if (false || "image/gif") { 
    
  3. 非空の文字列がtrueときのように扱われ表現に使用される。それは私たちが

    if (false || true) { 
    
  4. そして、この結果を持っていることを意味、当然のことながら、trueあり、もしそうなら、ブロックを実行。

+0

お返事ありがとうございます – davelowe85

2

また、次の条件を持つことができます。他の回答が良好である

if ($imagetype == ("image/jpeg" || "image/gif")) { 
    echo $imagetype; 
} 

、これはそれを解決するだけで、別の方法です:)

1

ザ・あなたはそれが希望書いたようにif文TRUEと評価されることが期待される。

これは、「画像/ gif」と何も比較していないためです。単にブール値として評価しているからです。 PHPは文字列値(0​​でないか、または空("")ではない)をTRUEに変換します。だから、基本的に、あなたのIF文が言っている「$imagetype"image/jpeg" OR "image/gif"と等しい場合はtrueで、その後、このようなものを行う。

ので、あなたの状態は常に、合格する場合は、 『画像/ gif形式は、』常に真として評価されます、実際に値が$imagetypeであるかどうかは関係ありません。

関連する問題