2013-08-02 20 views
7

Qualcuno può dirmi perché, quando si seleziona un file psd, l'istruzione if nel codice php passa come true ed echos "image/vnd.adobe.photoshop"?se l'istruzione restituisce 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

Come suggerimento generale: puoi abilitare le ispezioni nella maggior parte degli IDE moderni che si lamenteranno di cattive condizioni come 'if (" foo ") {' sarai costretto a scrivi 'if (" foo "=== true") {'(che è' false') che rende più facile individuare questi errori. – Halcyon

risposta

9

Perché questo è sbagliato

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

dovrebbe essere

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

O anche

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

Cioè, perché la stringa non vuota è considerata vera, quindi la condizione IF è stata soddisfatta.

+3

Si prega di spiegare anche _why_ restituisce un inaspettato vero. –

+2

Spiegazione: 'if (anyCondition ||" image/gif ")' restituisce sempre true come 'image/gif' è una stringa non vuota. Immagino che l'OP pensi che '||' faccia qualcos'altro. –

+0

Scusa se volevo essere il primo: P È spiegato ora – MightyPork

2

Il tuo || affermazione non è corretta

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

Quello che sta succedendo è "image/gif" sta tornando vero e che la vera sta in OR con la falsa restituito da $ imagetype == "image/jpeg". falso || vero == true

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

è equivqlent a:

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

che sarà valutato in questo caso come:

if($condition1 || true) 

che valuta a vero non importa quale sia il valore di $condition1

perchè if(false || true) rendimenti true

Un altro punto: Suggerisco di usare === operatore invece di ==, in modo che il codice finale dovrebbe essere:

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

Questo perché operatore bit per bit ha priorità inferiore rispetto al controllo di uguaglianza. Va in questo modo:

  1. Si hanno

    if ($imagetype == "image/jpeg" || "image/gif") { 
    
  2. uguaglianza decide di boolean prima, e la vostra espressione diventa:

    if (false || "image/gif") { 
    
  3. stringhe non vuote sono trattati come true quando usato nell'espressione. Ciò significa che dobbiamo

    if (false || true) { 
    
  4. E il risultato di questo, naturalmente, è true, in modo che i eseguito se-block.

+0

Grazie mille per la risposta – davelowe85

2

si può anche avere la seguente condizione:

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

Le altre risposte sono buone, questo è solo un altro modo per risolverlo :)

1

L'istruzione if, come si scrisse che sarebbe dovrebbe essere valutato come VERO.

Questo perché non stai confrontando "immagine/gif" con nulla, lo stai semplicemente valutando come valore booleano. PHP converte i valori stringa (che non sono "0" o vuoti ("")) su TRUE quando vengono valutati come booleani. Quindi, in sostanza, la vostra istruzione IF sta dicendo "se $imagetype è uguale a "image/jpeg" O "image/gif" è vero, allora fare questa roba.

vostro se la condizione sarà sempre passare, perché 'image/gif' sarà sempre valutata come vera, quindi non importa quale sia il valore di $imagetype s

Problemi correlati