2013-08-02 13 views
7

Czy ktoś może mi powiedzieć, dlaczego przy wyborze pliku psd instrukcja if w kodzie php podaje się jako true, a echo "image/vnd.adobe.photoshop"?jeśli instrukcja powraca 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

Jako ogólna wskazówka: możesz włączyć inspekcje w większości nowoczesnych IDE, które będą narzekać na złe warunki, takie jak 'if (" foo ") {' będziesz zmuszony do napisz 'if (" foo "=== true") {'(co jest' false'), co ułatwia dostrzeżenie tych błędów. – Halcyon

Odpowiedz

9

Ponieważ jest źle

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

Powinny być

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

Albo nawet

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

Oznacza to, ponieważ niepusty łańcuch jest uważany za prawdziwy, więc warunek IF został spełniony.

+3

Proszę również wyjaśnić, dlaczego zwracana jest nieoczekiwana prawda. –

+2

Objaśnienie: 'if (anyCondition ||" image/gif ")' zawsze zwraca wartość true, ponieważ 'image/gif' jest niepustym łańcuchem. Sądzę, że OP uważa, że ​​"||" robi coś innego. –

+0

Przepraszam, chciałem być pierwszy: P Zostało wyjaśnione teraz: – MightyPork

2

Twoje || Stwierdzenie to jest nieprawidłowe

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

Co się dzieje jest „image/gif” wraca prawdziwe i że prawda jest or'd z fałszywym zwrócony przez $ imagetype == „image/jpeg”. false || prawda == true

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

jest equivqlent do:

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

które będą oceniane w tym przypadku jak:

if($condition1 || true) 

których ocenia się prawdziwej bez względu na to, co jest wartość: $condition1

ponieważ if(false || true) powraca true

Kolejny punkt: Proponuję użyć === operatora zamiast ==, więc ostateczny kod powinien być:

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

to ponieważ operator ma bitowe niższy priorytet niż kontrola równości. To idzie tak:

  1. Masz

    if ($imagetype == "image/jpeg" || "image/gif") { 
    
  2. Równość postanawia boolean pierwszy, a ekspresja staje:

    if (false || "image/gif") { 
    
  3. niepuste ciągi są traktowani jak true kiedy używane w wyrażeniu. Oznacza to, że mamy

    if (false || true) { 
    
  4. a wynik tego, oczywiście, jest true, więc sporządzi IF-blokowych.

+0

Dziękuję bardzo za odpowiedź – davelowe85

2

Można również mieć następujący warunek:

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

innych odpowiedzi są dobre, to po prostu kolejny sposób, aby rozwiązać to :)

1

if jak napisałeś, że będzie oczekuje się, że oceni jako PRAWDA.

To dlatego, że nie porównujesz "image/gif" do niczego, po prostu oceniasz to jako wartość boolowską. PHP konwertuje wartości łańcuchowe (które nie są "0" lub puste ("")) na TRUE, gdy są one oceniane jako wartości logiczne. Więc zasadniczo swoje oświadczenie IF jest powiedzenie „jeśli $imagetype jest równa "image/jpeg" LUB "image/gif" jest TRUE, wtedy robić te rzeczy.

Wasza jeśli warunek zawsze będzie przechodzić, bo«image/gif»zawsze będzie oceniana jako prawdziwa, więc nie ma znaczenia, jaka jest wartość $imagetype.

Powiązane problemy