2013-08-02 60 views
7

有人能告诉我为什么,当选择一个psd文件时,php代码中的if语句传递为true和echo“image/vnd.adobe.photoshop”?if statement returns true

<?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

说明:'if(anyCondition ||“image/gif”)'总是返回true,因为'image/gif'是一个非空字符串。我猜OP认为'||'做了别的。 –

+0

对不起,我只是想成为第一:P它现在解释 – MightyPork

2

您的||声明是不正确

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

发生了什么事是“图像/ GIF”正在恢复真实的,真正的正由 $ IMAGETYPE ==“图像/ JPEG”返回的错误或运算的结果。 false ||真正的==真

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

是equivqlent到:

​​

将在这种情况下被评估为:

if($condition1 || true) 

计算结果为真正不管是什么值的$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。

这是因为您没有将“image/gif”与任何东西进行比较,您只是将其评估为布尔值。 PHP将字符串值(不是"0"或空(""))转换为TRUE时,它们被评估为布尔值。因此,从本质上讲,你的if语句说:“如果$imagetype等于"image/jpeg" OR "image/gif"为真,那么做这个东西。

你如果条件总是擦肩而过,因为‘图像/ GIF’将始终评估为真,因此,$imagetype的值实际上并不重要