2010-08-23 59 views
1

我設計了一個PHP文件上傳表單,它將3張圖片作爲varchar數據類型存儲在數據庫中,並將其移動到目標目錄。幫我重新格式化我的PHP驗證代碼

上傳或插入值,以我想確保

a)其是文件類型的圖像/ JPEG

b)該三個圖像應該有不同的固定尺寸的值的數據庫(前對此我取出由和getimagesize()的尺寸值;及驗證它)

c)和,以檢查是否文件名的重複在目錄(我正在通過file_exists())

如果檢查存在任何一個如果條件返回false,那麼腳本應該死()

我已經定義了它的代碼,但是我的代碼的問題是,如果最後一個條件返回false,那麼上面的條件將執行代碼並執行一些操作move_uploaded_file我不想發生,請看看代碼

請檢查最後4條件,因爲我想要重新格式化。

$w_title = 685; 
    $h_title = 50; 
    $w_brief = 685; 
    $h_brief = 177; 
    $w_detail = 685; 

     if(empty($_POST['ns_title']) || empty($_FILES["ns_pic_title"]["name"]) || empty($_FILES["ns_pic_brief"]["name"]) || empty($_FILES["ns_pic_detail"]["name"])) { 
      echo "<script type=\"text/javascript\">" . "alert(\"Please Fill All the Required Fields\");" . "</script>"; 
      echo "<meta http-equiv=\"refresh\" content=\"0;post-news.php\"/>"; 
      die(); 
     } 
     else { 
      $ns_title = htmlspecialchars(strip_tags(mysql_real_escape_string($_POST['ns_title']))); 
      if($_FILES["ns_pic_title"]["type"] == "image/jpeg" && $_FILES["ns_pic_brief"]["type"] == "image/jpeg" && $_FILES["ns_pic_detail"]["type"] == "image/jpeg") { 

       $ns_pic_title_loc= $_FILES["ns_pic_title"]["tmp_name"]; 
       $ns_pic_title_name = $_FILES["ns_pic_title"]["name"]; 
       list($width_title, $height_title) = getimagesize($ns_pic_title_loc); 

       $ns_pic_brief_loc = $_FILES["ns_pic_brief"]["tmp_name"]; 
       $ns_pic_brief_name = $_FILES["ns_pic_brief"]["name"]; 
       list($width_brief, $height_brief) = getimagesize($ns_pic_brief_loc); 

       $ns_pic_detail_loc = $_FILES["ns_pic_detail"]["tmp_name"]; 
       $ns_pic_detail_name = $_FILES["ns_pic_detail"]["name"]; 
       list($width_detail, $height_detail) = getimagesize($ns_pic_detail_loc); 

       if(file_exists($ns_target.$ns_pic_title_name)) { 
        echo "<script type=\"text/javascript\">" . "alert(\"File Already Exists, Please Choose a Different Name for the File\");" . "</script>"; 
        echo "<meta http-equiv=\"refresh\" content=\"0;post-news.php\"/>"; 
        die(); 
       } 

       if(!$width_title == $w_title && !$height_title == $h_title) { 
        echo "<script type=\"text/javascript\">" . "alert(\"Incorrect File Dimension for Title News, please make sure it is (685 X 50)\");" . "</script>"; 
        echo "<meta http-equiv=\"refresh\" content=\"0;post-news.php\"/>"; 
        die(); 
       } 
       else { 
        move_uploaded_file($ns_pic_title_loc, $ns_target.$ns_pic_title_name); 
       } 

       if(!$width_brief == $w_brief && !$height_brief == $h_brief) { 
        echo "<script type=\"text/javascript\">" . "alert(\"Incorrect File Dimension for Brief News, please make sure it is (685 X 177)\");" . "</script>"; 
        echo "<meta http-equiv=\"refresh\" content=\"0;post-news.php\"/>"; 
        die(); 
       } 
       else { 
        move_uploaded_file($ns_pic_brief_loc, $ns_target.$ns_pic_brief_name); 
       } 
       if(!$width_detail == $w_detail) { 
        echo "<script type=\"text/javascript\">" . "alert(\"Incorrect File Dimension for Detail News, please make sure it is (685 in width)\");" . "</script>"; 
        echo "<meta http-equiv=\"refresh\" content=\"0;post-news.php\"/>"; 
        die(); 
       } 
       else { 
        move_uploaded_file($ns_pic_brief_loc, $ns_target.$ns_pic_brief_name); 
       } 

我如何格式化代碼,以便

一)應檢查所有三個條件

B),如果它的任何一個返回false,那麼就應該立即停止執行

謝謝

回答

2

我會建議你的邏輯移動到功能以減少重複。

注意:我沒有辦法測試任何這個,所以不會嘗試,但它應該讓你開始。

function fail($error) 
{ 
    echo '<script type="text/javascript">alert("' . $error . '");</script>'; 
    echo '<meta http-equiv="refresh" content="0;post-news.php"/>'; 
} 

function valid_image($image, $width, $height = 0) 
{ 
    if ($image['type'] != 'image/jpeg') 
    { 
    fail('File must be of type image/jpeg'); 
    return false; 
    } 

    if(file_exists($ns_target . $image['name'])) 
    { 
    fail('File Already Exists, Please Choose a Different Name for the File'); 
    return false; 
    } 

    list($image_width, $image_height) = getimagesize($image['tmp_name']); 
    if ($image_width != $width || ($image_height && $image_height != $height)) 
    { 
    fail('Incorrect File Dimension for ' . $image['name'] . 
     ', please make sure it is (' . $width . 
     ($height ? ' X ' . $height : ' in width'). ')'); 
    return false; 
    } 
    return true; 
} 

if(empty($_POST['ns_title']) || 
    empty($_FILES["ns_pic_title"]["name"]) || 
    empty($_FILES["ns_pic_brief"]["name"]) || 
    empty($_FILES["ns_pic_detail"]["name"])) 
{ 
    fail('Please Fill All the Required Fields'); 
    die(); 
} 

if (valid_image($_FILES['ns_pic_title'], 685, 50) && 
    valid_image($_FILES['ns_pic_brief'], 685, 177) && 
    valid_image($_FILES['ns_pic_detail'], 685)) 
{ 
    move_uploaded_file($_FILES['ns_pic_title']['tmp_name'], 
    $ns_target . $_FILES['ns_pic_title']['name']); 

    move_uploaded_file($_FILES['ns_pic_brief']['tmp_name'], 
    $ns_target . $_FILES['ns_pic_brief']['name']); 

    move_uploaded_file($_FILES['ns_pic_detail']['tmp_name'], 
    $ns_target . $_FILES['ns_pic_detail']['name']); 
} 
+0

+1哇!精彩而徹底。 – 2010-08-23 18:00:25

+0

布蘭登,我會提出一個改變:在'失敗()'使用'死'而不是'回聲'。這樣你就不需要'valid_image()'中的'return'語句,在當前的實現中,即使在前一個失敗的情況下,你也會繼續檢查所有條件。如果在'失敗'中使用'die',你會在第一次異常時退出。 – 2010-08-23 18:11:37

+0

+1這太棒了我還是有點新手,雖然我會嘗試改變我的代碼功能,看起來相當體面和整潔,我很欣賞你通過我的帖子和答覆它的痛苦。 – 2010-08-23 18:12:48

1

我可以提供一些建議:

無需if ... else
您可以通過減少嵌套簡化代碼。

這是

if(cond) { 
    do this; 
    die(); 
} else { 
    do other things 
} 

更改上面:

if(cond) { 
    do this; 
    die(); 
} 
do other things 

如果在上面的代碼,你想要做的是輸出一些文字,您可以進一步簡化爲

if(cond) die('text to output'); 
do other things 

檢查異常,否牛逼的一致性
而不是

if($_FILES["ns_pic_title"]["type"] == "image/jpeg" && ...) { 
    do stuff 
    ... 

使用

if($_FILES["ns_pic_title"]["type"] !== "image/jpeg" || ...) exit; 
do stuff 
... 

使用註釋
即使代碼是用於個人消費,使用盡可能多的意見,你可以,幾乎沒有量評論太多了。

+0

謝謝你的那種幫助,我即將解決我的問題,我使用的是你提出的完全相同的模式。我感謝你的努力。 – 2010-08-23 18:10:26

+0

@Ibrahim很高興幫助。看看Brandon的答案中的'fail'函數,它比每次在'<腳本類型...>中歪曲錯誤信息要好得多。 – 2010-08-23 18:18:15

+0

我無法在PHP中使用fail()?沒有它應該是PHP的功能,?我將不勝感激,如果我從PHP網站獲得任何參考,我無法找到它 – 2010-08-23 18:36:48