2013-08-02 40 views
7

Ai đó có thể cho tôi biết lý do, khi chọn tệp psd, câu lệnh if trong mã php chuyển thành true và echos "image/vnd.adobe.photoshop"?nếu câu trả lời đúng

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

Như một mẹo chung: bạn có thể kích hoạt kiểm tra trong hầu hết các IDE hiện đại sẽ phàn nàn về điều kiện xấu như 'if (" foo ") {' bạn sẽ bị buộc phải viết 'if (" foo "=== true") {'(nghĩa là' false') giúp dễ dàng phát hiện ra những sai lầm này. – Halcyon

Trả lời

9

Bởi vì điều này là sai

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

Nên

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

Hoặc thậm chí

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

Đó là, bởi vì chuỗi không trống được coi là đúng, do đó, điều kiện IF được đáp ứng.

+3

Cũng vui lòng giải thích _why_ nó trả về một sự thật không mong muốn. –

+2

Giải thích: 'if (anyCondition ||" image/gif ")' luôn trả về true là 'image/gif' là một chuỗi không trống. Tôi đoán OP nghĩ rằng '||' làm một cái gì đó khác. –

+0

Xin lỗi tôi chỉ muốn là người đầu tiên: P Nó được giải thích ngay bây giờ – MightyPork

2

|| của bạn || tuyên bố là không chính xác

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

gì đang xảy ra là "image/gif" đang trở lại đúng sự thật và sự thật đã được or'd với sai trả về bởi $ imagetype == "image/jpeg". false || đúng == true

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

là equivqlent tới:

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

đó sẽ được đánh giá trong trường hợp này như:

if($condition1 || true) 

mà đánh giá để đúng dù là những gì giá trị của $condition1

if(false || true) lợi nhuận true

điểm khác: Tôi đề nghị sử dụng === điều hành thay vì ==, do đó, mã cuối cùng của bạn nên là:

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

này được vì nhà điều hành Bitwise có ưu tiên thấp hơn kiểm tra bình đẳng. Nó đi như thế này:

  1. Bạn có

    if ($imagetype == "image/jpeg" || "image/gif") { 
    
  2. bình đẳng giải quyết để boolean đầu tiên, và biểu hiện của bạn trở thành:

    if (false || "image/gif") { 
    
  3. chuỗi không có sản phẩm nào được đối xử như true khi được sử dụng trong biểu thức. Điều đó có nghĩa chúng tôi có

    if (false || true) { 
    
  4. Và kết quả của việc này, tất nhiên, là true, do đó thực thi nếu khối.

+0

Cảm ơn bạn rất nhiều vì đã trả lời – davelowe85

2

Bạn cũng có thể có các điều kiện sau đây:

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

Những câu trả lời khác là tốt, đây chỉ là một cách để giải quyết nó :)

1

Các câu lệnh if như bạn đã viết nó sẽ được dự kiến ​​sẽ đánh giá là TRUE.

Điều này là do bạn không so sánh "hình ảnh/gif" với bất kỳ thứ gì, bạn chỉ đơn giản đánh giá nó dưới dạng giá trị boolean. PHP chuyển đổi các giá trị chuỗi (không phải là "0" hoặc trống ("")) thành TRUE khi chúng được đánh giá là boolean. Vì vậy, về cơ bản, tuyên bố NẾU bạn đang nói "nếu $imagetype bằng "image/jpeg" HOẶC "image/gif" là TRUE, sau đó làm công cụ này.

của bạn nếu điều kiện sẽ luôn vượt qua, bởi vì 'image/gif' sẽ luôn được đánh giá là đúng, Vì vậy, nó không quan trọng những gì thực sự là $imagetype s giá trị thực sự là

Các vấn đề liên quan