2016-10-03 73 views
-2

我有一個簡單的腳本,可以在我的服務器上傳文件並將詳細信息插入到數據庫中。上傳腳本的問題

有了下面的代碼我得到兩個錯誤..

  1. 「通知:未定義的變量:SEXT在」 .. 我試圖用,如果空語句解決這個問題,但沒有sucess ..

  2. 腳本導入數字(1,2,3 ...)到MySQL,如果提交的上傳是空的.... 我試圖修復與下面的代碼的問題,但也沒有成功..

    「if($ _ FILES ['files'] ['name']!=」「)」。 ..

有什麼建議嗎?

謝謝。

我的代碼:

<?php 

    include_once('db.php'); 

if (isset($_FILES['files'])) { 
    $uploadedFiles = array(); 
    foreach ($_FILES['files']['tmp_name'] as $key => $tmp_name) { 
     $errors = array(); 
     $file_name = md5(uniqid("") . time()); 
     $file_size = $_FILES['files']['size'][$key]; 
     $file_tmp = $_FILES['files']['tmp_name'][$key]; 
     $file_type = $_FILES['files']['type'][$key]; 

     if($file_type == "image/gif"){ 
      $sExt = ".gif"; 
     } elseif($file_type == "image/jpeg" || $file_type == "image/pjpeg"){ 
      $sExt = ".jpg"; 
     } elseif($file_type == "image/png" || $file_type == "image/x-png"){ 
      $sExt = ".png"; 
     } 
     if (!in_array($sExt, array('.gif','.jpg','.png'))) { 
      $errors[] = "Image types alowed are (.gif, .jpg, .png) only!"; 
     } 


     if ($file_size > 2097152000) { 
      $errors[] = 'File size must be less than 2 MB'; 
     } 

     $query = "INSERT into user_pics (`person_id`,`pic_name`,`pic_type`) VALUES('1','$file_name','$sExt')"; 
     $result = mysqli_query($link,$query); 

     $desired_dir = "user_data/"; 
     if (empty($errors)) { 
      if (is_dir($desired_dir) == false) { 
       mkdir("$desired_dir", 0700);  
      } 
      if (move_uploaded_file($file_tmp, "$desired_dir/" . $file_name . $sExt)) { 
       $uploadedFiles[$key] = array($file_name . $sExt, 1); 
      } else { 
       echo "Files Uploaded !" . $_FILES['files']['name'][$key]; 
       $uploadedFiles[$key] = array($_FILES['files']['name'][$key], 0); 
      } 
     } else { 
      print_r($errors); 
     } 
    } 

    foreach ($uploadedFiles as $key => $row) { 
     if (!empty($row[1])) { 
      $codestr = '$file' . ($key+1) . ' = $row[0];'; 
      eval ($codestr); 
     } else { 
      $codestr = '$file' . ($key+1) . ' = NULL;'; 
      eval ($codestr); 
     } 
    } 

} 

?> 


<form action="" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="files[]" accept="image/*"> <br/> 
    <input type="file" name="files[]" accept="image/*"> <br/><br/> 
    <input type="submit"/> 
</form> 
+0

好吧,首先我不會依賴類型設置分機,我把它從文件的真實姓名(即不tmp名稱)。你沒有別的條件來處理'$ sExt',這會導致所有其他的東西被炸。你應該做別的$ errors [] = bla bla。有 – ArtisticPhoenix

回答

1

if($file_type == "image/gif"){ 
     $sExt = ".gif"; 
    } elseif($file_type == "image/jpeg" || $file_type == "image/pjpeg"){ 
     $sExt = ".jpg"; 
    } elseif($file_type == "image/png" || $file_type == "image/x-png"){ 
     $sExt = ".png"; 
    } 
    if (!in_array($sExt, array('.gif','.jpg','.png'))) { 
     $errors[] = "Image types alowed are (.gif, .jpg, .png) only!"; 
    } 

相反,你應該做的

if($file_type == "image/gif"){ 
     $sExt = ".gif"; 
    } elseif($file_type == "image/jpeg" || $file_type == "image/pjpeg"){ 
     $sExt = ".jpg"; 
    } elseif($file_type == "image/png" || $file_type == "image/x-png"){ 
     $sExt = ".png"; 
    }else{ 
     $errors[] = "Image types alowed are (.gif, .jpg, .png) only!"; 
    } 

檢查要設置的擴展是多餘的, 一個nd通過提供缺省值(和其他),避免了當您的變量$sExt未設置時的錯誤。這應該會給你想要的行爲。

我也會將這些線

$query = "INSERT into user_pics (`person_id`,`pic_name`,`pic_type`) VALUES('1','$file_name','$sExt')"; 
    $result = mysqli_query($link,$query); 

    $desired_dir = "user_data/"; 
    if (empty($errors)) { 

要將此代碼塊

if (empty($errors)) { 
     $query = "INSERT into user_pics (`person_id`,`pic_name`,`pic_type`) VALUES('1','$file_name','$sExt')"; 
     $result = mysqli_query($link,$query); 

     $desired_dir = "user_data/"; 

這樣,當你在錯誤的東西你不這樣做的插件內側...

不知道這

foreach ($uploadedFiles as $key => $row) { 
    if (!empty($row[1])) { 
     $codestr = '$file' . ($key+1) . ' = $row[0];'; 
     eval ($codestr); 
    } else { 
     $codestr = '$file' . ($key+1) . ' = NULL;'; 
     eval ($codestr); 
    } 
} 
目的

但eval可能會非常糟糕,我會建議以另一種方式來做這種事情,比如使用數組,但是這可能會在第一個循環中完成。例如,nullfalse值可能位於empty($errors)檢查的其他部分,因此如果出現錯誤,那麼該錯誤會被置於錯誤狀態。

$files = array(); 
    foreach ($uploadedFiles as $key => $row) { 
    if (!empty($row[1])) { 
     $files['$file' . ($key+1)] = $row[0]; 
    } else { 
     $files['$file' . ($key+1)] = false; //id use false instead of null in an array 
    } 
    } 

你也應該小心SQL注入的,雖然它看起來像您正在設置的變量,它仍然是明智以防萬一改變使用準備好的查詢由後者,這可能打開你到SQL注入攻擊。

+0

謝謝..我只是複製和粘貼你的代碼,但我仍然得到相同的錯誤..未定義的變量:sExt在C:\ labs \ upload \ multi1.php 31行 Array([0] =>圖像類型只能是(.gif,.jpg,.png)!) – user2900709

+1

一旦將插入內置於'if(empty($ errors))'語句中,您就不應該遇到這個問題。該變量仍然在引用中被引用並且仍然被調用,並且因爲如果文件不是我們想要的,我們並不想插入它,對吧? – ArtisticPhoenix

+0

快速修復:將'empty($ errors)&&'添加到'if(!in_array($ sExt,array('.gif','。jpg','。png'))){' –

0

和:

           // double slash 
if (move_uploaded_file($file_tmp, "$desired_dir/" . $file_name . $sExt)) { 
    // file was successfuly moved 
    echo "Files Uploaded !" . $_FILES['files']['name'][$key];     
    $uploadedFiles[$key] = array($file_name . $sExt, 1); 
} else {     
    $uploadedFiles[$key] = array($_FILES['files']['name'][$key], 0); 
} 

foreach ($uploadedFiles as $key => $row) { 
    if ($row[1]) { // $row[1] is never empty 
     ${'file' . ($key+1)} = $row[0]; 
    } else { 
     ${'file' . ($key+1)} = NULL; 
    } 
} 

更好的將是:

if (move_uploaded_file($file_tmp, "$desired_dir/" . $file_name . $sExt)) { 
    echo "Files Uploaded !" . $_FILES['files']['name'][$key];     
    $uploadedFiles[] = $file_name . $sExt; 
} 

//instead of variable $file1 etc.. 
foreach($uploadedFiles as $filename){ 

} 
+0

謝謝你的幫助... – user2900709