2013-02-27 39 views
0

我已經被分配了修復舊的php網站的任務,因爲它已被移動到一個新的服務器。它現在所在的服務器不允許全球化變量,這幾乎是所有這個網站運行。當試圖上傳圖像時,我的sql語句顯示了所有內容,但是我添加了圖像的列表的id。我希望有人能幫我弄清楚這一點。php文件上傳不能正常工作

這是我上傳功能:

function upload(){ 
global $imagefolder, $id; 
global $tbl_units; 

include "globalizePOSTGET.php"; 

// $uid = uuid(); 
$minsize = 5000;   // 5kb 
$maxsize = 3000000;  // 3mb 
$ext = explode('.',basename($_FILES['userfile']['name'])); 
$ext = $ext[count($ext)-1]; 
$ext = strtolower($ext); 

if ($ext != "jpg" && $ext != "jpeg" && $ext != "png") { 
    echo "<script> alert('Image is not a png or jpeg format'); </script>"; 
    return false; 
} 

$imagename = $_POST['id']."_img".$_FILES['img'].".$ext"; 
$imagename2 = "X_".$imagename; 
$uploadfile = $imagefolder . $imagename; 
$uploadfile2 = $imagefolder . $imagename2; 
$uploadthumb = $imagefolder . "tn_" . $imagename; 

if (file_exists($uploadfile)) unlink($uploadfile); 
if (file_exists($uploadthumb)) unlink($uploadthumb); 

if (file_exists($uploadfile)) { 
    echo "<script> alert('Image already exists!'); </script>"; 
} 
else 
{ 
    if(is_uploaded_file($_FILES['userfile']['tmp_name'])) { 
     // check the file is less than the maximum file size 
     if($_FILES['userfile']['size'] < $maxsize) { 
      $imgData = addslashes(file_get_contents($_FILES['userfile']['tmp_name']));  // prepare the image for insertion 
      $size = getimagesize($_FILES['userfile']['tmp_name']);   // get the image info.. 
      if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile2)) { 
       $Image = @imagecreatefromjpeg($uploadfile2); 
       if ($Image) { 
       $img_height = imagesy($Image); 
       $img_width = imagesx($Image); 
       imagedestroy($Image); 
       } 

       if ($img_height > $img_width) {   // portrait 
        $tempMultiplier = 150/$img_height; 
        $tempMultiplierFull = 600/$img_height; 
       } else { 
        $tempMultiplier = 150/$img_width; 
        $tempMultiplierFull = 600/$img_width; 
       } 

       $imageHeight = $img_height * $tempMultiplier; 
       $imageWidth = $img_width * $tempMultiplier; 
       $fullimageHeight = $img_height * $tempMultiplierFull; 
       $fullimageWidth = $img_width * $tempMultiplierFull; 
       createthumb($imagename2,"tn_".$imagename,$imageWidth,$imageHeight); 

       if($_FILES['userfile']['size'] > $minsize) { 
        createthumb($imagename2,$imagename,$fullimageWidth,$fullimageHeight); 
        if (file_exists($uploadfile2)) unlink($uploadfile2); 
       } else { 
        rename($uploadfile2, $uploadfile); 
       } 

       $sql = "UPDATE $tbl_units SET photo".$_FILES['img']." = \"" . $imagename . "\" WHERE id = " . $_POST['id']; 
       echo $sql; 
       if(!mysql_query($sql)) { 
        echo "<script> alert('Unable to upload file'); </script>"; 
       } else { 
        ?> <script>location.replace('memonly.php?action=edit_record&id=<?php echo $id; ?>');</script> <?php 
       } 
      } 
     } else { 
      // if the file is not less than the maximum allowed, print an error 
      $file_n = basename($_FILES['userfile']['name']); 
      $file_s = $_FILES['userfile']['size']; 
      ?> 
      <script> alert("File exceeds the maximum limit of <?php echo $maxsize; ?>\nFile <?php echo $file_n; ?> is <?php echo $file_s; ?>");</script> 
      <?php 
     } 
    } 
} 
} 

我呼應上是給我的錯誤就行了sql語句,我想。點擊提交後,頁面告訴我Unable to upload file'. Which is why I echoed the sql there. I end up with a sql statement looking like this: UPDATE member_units SET photo =「_img.jpg」WHERE id =`

有人請幫幫我!我對PHP很缺乏經驗,我不知道該怎麼做。

這裏是做上傳的形式:

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 
<input type="hidden" name="_submit_check" value="1" /> 
<input type="hidden" name="id" value="<?php echo $id; ?>" /> 
<input type="hidden" name="img" value="<?php echo $img; ?>" /> 
Image URL: <input type="file" name="userfile" value="" style="font-size: 10px; width: 100%;"> 
<input type="submit" value="Submit" onClick="return validate();">&nbsp; 
<input type="button" value="Cancel" onClick="location.href='/memonly.php?action=edit_record<?php echo "&id=$id&memberid=$memberid"; ?>';"> 
</form> 
+1

這是什麼:$ _FILES ['img']? – Shehabix 2013-02-27 23:30:37

+0

你讓我了!它曾經獲得'$ _POST',但另一位程序員告訴我需要將它改爲'$ _FILES',所以我做了。 – jlg 2013-02-28 14:06:58

回答

2

你需要處理這類問題的第一件事是通過問題似乎發生的地方。所以,把你的迴應聲明...

UPDATE member_units設置照片= 「_img.jpg」 WHERE ID =`

這相當於...

UPDATE $tbl_units SET photo".$_FILES['img']." = \"" . $imagename . "\" WHERE id = " . $_POST['id']; 

我們可以看到通過比較,很明顯$ _FILES ['img']是和空變量,只要將其轉換爲字符串即可。對於$ _POST ['id']也是如此,而$ imagename給出了一個簡短的_img.jpg文件名。

回溯,那麼你可以看到,$ imagename來自...

$_POST['id']."_img".$_FILES['img'].".$ext"; 

這是你的照片= 「_img.jpg」從何而來。再次,$ _FILES ['img']和$ _POST ['id']

您到達echo語句的事實意味着某事正在上傳,但它是通過$ _FILES ['userfile']數組,以及它所有的相關變量,例如$ _FILES ['userfile'] ['name'],它會給你上傳圖片的文件名。

接下來需要問自己的是你期待$ _POST ['id']來自哪裏,因爲它缺少或爲空,以及HTML表單中的哪個字段提供了該變量。然後你需要問自己你想用你的命名系統實現什麼。例如,如果你想讓一個圖像文件看起來像:1_imgLolCat。JPG那麼你的變量需要看起來更像

$imagename = $_POST['id']."_img".$_FILES['userfile']['name']; 

但是我的回答如下的最後一部分讓我覺得,而不是文件名,你要查找的內容實際上是一個POST變量代表某個類別或類型的圖像,在這種情況下,你可能想從工作中......

$imagename = $_POST['id']."_img".$_POST['img'].".$ext"; 

...如果一個HTML字段名爲「IMG」的存在!

最後來看看你的SQL語句...

SET photo".$_FILES['img']." = \"" . $imagename . "\" 

並仔細檢查你的表,因爲你看起來是試圖做的是設置在表中的唯一變量,將取決於什麼從表單中傳遞。我可能在這裏錯了,但我假設(正如我上面所說)你想在那裏$ _POST ['img']。

警告字,您需要... 需要在將這些變量輸入到像這樣的SQL語句之前對這些變量進行清理。有人可以輕鬆拍攝

SET photo".$_POST['img'] 

和刪除自己的表,如果權限被設置爲你的數據庫使用這樣做。關於如何正確地做到這一點,還有很多其他的答案。 :)

+0

我剛發現這是因爲全局變量。因爲這個網站的目的只是在客戶獲得新網站之前掛出去,所以我不得不做出一個快速修復類型的東西。感謝你的幫助! – jlg 2013-02-28 14:54:32

0

好像「ID」字段是不是在HTML形式發送。我想這應該是一個隱藏的輸入?

要小心,您的腳本可以成爲SQL注入的目標:您直接在SQL查詢中使用用戶輸入($ _POST ['id'])。你應該檢查這個輸入是否實際設置和數字。

+0

感謝您的提示,而不是取笑代碼!這個網站實際上是在重新設計的中間,但他們只是希望它能夠正常工作,直到他們完成新網站。 :) – jlg 2013-02-28 14:18:40