2011-10-24 107 views
0

我想了PHP我的第一個實際腳本,其中大部分來自教程:( 反正是PHP文件類型限制

我在這部分有問題

// This is our limit file type condition 
if (!($uploaded_type=="text/java")||!($uploaded_type=="file/class")||!($uploaded_type=="file/jar")) { 
echo "You may only upload Java files.<br>"; 

$ok=0; 
} 

它基本上不!讓任何文件,即使是那些在那裏 幫助 我想要的Java文件要只允許

編輯:! 以下是完整的代碼

<?php 
$target = "upload/"; 
$target = $target . basename($_FILES['uploaded']['name']) ; 
$uploaded = basename($_FILES['uploaded']['name']) ; 
$ok=1; 

//This is our size condition 
if ($uploaded_size > 350000) { 
    echo "Your file is too large.<br>"; 
    $ok=0; 
} 

// This is our limit file type condition 
if (!($uploaded_type=="text/java")||!($uploaded_type=="file/class")||! ($uploaded_type=="file/jar")) { 
    echo "You may only upload Java files.<br>"; 
    $ok=0; 
} 

echo $ok; //Here we check that $ok was not set to 0 by an error 
if ($ok==0) { 
    echo "Sorry your file was not uploaded"; 
}else { 
    if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) { 
     echo "The file ". $uploaded ." has been uploaded"; 
    } else { 
     echo "Sorry, there was a problem uploading your file."; 
    } 
} 
?> 

回答

2

您正在使用OR ...表示如果ANY的成員參數爲真,則整個語句的計算結果爲TRUE。由於文件只能是一種類型,因此您將排除所有文件。你需要的是一個「和」匹配:

if (!($uploaded_type == 'text/java') && !($uploaded_type == ....)) { 
            ^^---boolean and 

假裝我們有一個文件/類文件類型的工作,那麼你的版本上寫着:

if the (file is not text/java) OR the (file is not file/class) OR the (file is not file/jar) 
       TRUE       FALSE       TRUE 

TRUE or FALSE or TRUE -> TRUE 

Switchign來,讓您

TRUE and FALSE and TRUE -> FALSE 
+0

不會讓它成爲一個.java,.class,.jar在同一時間嗎? 我做的Java,所以我可能是錯的! – Hego555

+0

編號布爾邏輯在所有語言中都是相同的。 –

+0

@ Hego555你正在做'沒有條件,沒有條件',這意味着它不能被整個子句評估爲TRUE。只要它匹配一個,該子句的計算結果就是FALSE。如果將其更改爲「條件或條件」(刪除NOT),它會減少混淆 - 這會產生相同的效果並更具可讀性。 – DaveRandom

0

只有你的三個條件之一可能可能是真實的,讓你最終:

if (!false || !false || !true) 

其中就變成了:

if (true || true || false) 

所以您應該在的地方使用&&OR的,或者用一個更好的功能,從一組檢查多件事情:

if (!in_array($uploaded_type, array("text/java", "file/class","file/jar")) { 

所以如果將會成功,如果既沒有的允許值被發現。

+0

if(!in_array($ uploaded_type,array(「text/java」,「file/class」,「file/jar」))){ echo「您只能上傳Java文件。
「; $ OK = 0;} 仍然 給出錯誤的文件類型 – Hego555

+0

調試什麼'$ uploaded_type'含有這種情況發生時,MIME類型可能不是你認爲它是 – mario

+0

我試圖做回聲$ uploaded_type!。 ;但沒有任何打印! – Hego555

0

您可以使用此更in_array()靈活:

$allowed_types = array("text/java", "file/class", "file/jar"); 
if(!in_array($uploaded_type, $allowed_types)) { 
    echo "You're not allowed to upload this kind of file.<br />"; 
    $ok = 0; 
} 

這使得它非常容易讓後來更多的文件類型。如果你想允許「text/html」,你只需要將它添加到數組中,而不需要創建這麼多的檢查。您甚至可以將允許的類型存儲在配置文件或數據庫中的表中,並動態創建數組$allowed_types

+0

哎呀,我剛剛看到馬里奧也提出了這個問題,無論如何,我會留下我的答案,因爲我認爲它解釋得很好。 – middus