2012-05-31 92 views
1

我在一個網站上工作,我的任務是從用戶處取得產品圖像並將該圖像存儲在數據庫中..我使用mysql數據庫。 我對HTML表單代碼如下: -在MySQL數據庫中插入圖像時發生mysql錯誤

 <FORM action="testimage1.php" ENCTYPE="multipart/form-data" method="post"> 
       <div style="font:bold 10px arial,serif;" >Product Name*</div> 
       <input type="text" name="myuserName" maxlength="50" /><br /> 
      <div style="font:bold 10px arial,serif;" >Upload a photo</div> 
       <input name="uploadimage" type="file" /></br> 
       <div style="font:bold 10px arial,serif;">Product Description:</div> 
       <input type="text" name="product" value=""></br> 
       <input id="submit" type="submit" value="submit" /><br /> 
    </FORM> 

我對testimage1.php代碼如下: -

  require_once("dbconnect.inc.php");      
    $db_name="thinstrokes";          //for localhost databasename 
    $tbl_name="product"; 
    $db_selected=mysql_select_db("$db_name")or die("cannot select DB"); 

    $myusername=$_POST['myusername']; 
    $mypassword=$_POST['product']; 
    $filename=$_FILES['uploadimage']['tmp_name']; 
    $imgData = file_get_contents($filename); 
    $size = getimagesize($filename); 
    $sql = "INSERT INTO product 
    (productname, image_id , image_type ,image, image_size, image_name, productdesc)VALUES 
    ('$myusername','11', '{$size['mime']}', '{$imgData}', '{$size[3]}', 
    '{$_FILES['userfile']['name']}','$productdesc')"; 
    $result=mysql_query($sql) or die("error in uploading/*"); 

和我收到一個錯誤: - 錯誤的上傳/ * 如何我可以糾正它嗎?

+0

更改此以查看真正的錯誤是$ result = mysql_query($ sql)還是die(mysql_error()); – bumperbox

+0

嘗試在'或die()'中添加'mysql_error()'。其實你不應該使用'或die()',因爲這是不好的做法。它殺死了腳本。使用適當的錯誤處理。 – Tikkes

+0

它打印錯誤爲: - MySQL服務器已消失 – Neeraj

回答

0

嘗試改變這一點:

$sql = "INSERT INTO product 
(productname, image_id , image_type ,image, image_size, image_name, productdesc)VALUES 
('$myusername','11', '{$size['mime']}', '{$imgData}', '{$size[3]}', 
'{$_FILES['userfile']['name']}','$productdesc')"; 

與此:

$size_mime = mysql_real_escape_string($size['mime']); 
$size3 = mysql_real_escape_string($size[3]); 
$filename = mysql_real_escape_string($_FILES['userfile']['name']); 
$sql = "INSERT INTO product 
(productname, image_id , image_type ,image, image_size, image_name, productdesc) VALUES 
('{$myusername}','11', '{$size_mime}', '{$imgData}', '{$size3}', 
'{$filename}','$productdesc')"; 

和編輯此:

$myusername=$_POST['myusername']; 
$mypassword=$_POST['product']; 
$filename=$_FILES['uploadimage']['tmp_name']; 

與此:

$myusername = mysql_real_escape_string($_POST['myusername']); 
$mypassword = mysql_real_escape_string($_POST['product']); 
$filedata = mysql_real_escape_string($_FILES['uploadimage']['tmp_name']); 

你要絕對避免sql注入!

+0

還是它打印錯誤爲:-MySQL服務器已經走了 – Neeraj

+0

我沒有得到錯誤暗示..? – Neeraj

+0

和代碼我打印我的SQL錯誤..它仍然給... MySQL服務器已經消失 – Neeraj

0

你需要把它變成一個查詢之前逃脫$imgData一切mysql_real_escape_string

+0

我得到的錯誤爲:-MySQL服務器已經消失 – Neeraj

+0

天哪,我不知道它去了哪裏。你試圖堅持的圖像有多大? – Okonomiyaki3000

0

您需要使用bound變量。首先你要對SQL injection進行全面攻擊。

假如有人制作的\';DROP product;文件名,並上載...

話雖這麼說,內聯二進制數據到一個查詢恰恰是行不通的99%的時間。

對於綁定參數,您的查詢變成這樣,您可以調用bind_parm將數據附加到每個?

$sql = "INSERT INTO product (productname, image_id , image_type ,image, image_size, image_name, productdesc) VALUES (?,?,?,?,?,?,?)"; 
+0

我收到錯誤消息,如...MySQL服務器已經消失 – Neeraj

+0

嘗試在文本編輯器中打開圖像。這基本上就是你在這裏做的。這只是不會工作。使用綁定變量或者如果您必須這樣做,請在內聯內容之前在圖像數據上使用bin2hex() - > http://php.net/manual/en/function.bin2hex.php。 –

0

首先,我認爲你不應該直接上傳圖像到Mysql。而是使用一個目錄並將所有內容放在那裏因此,隨着中說嘗試是這樣的:

//target to the path of my files 
$target_path = "uploads/product_images/"; 
if(!is_dir($target_path)) mkdir($target_path); 
$uploadfile = $target_path . basename($_FILES['userfile']['name']); 

//Move the uploaded file to $taget_path 
(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)); 

然後你就可以使用到上傳的文件執行以下操作:

echo "<a href=" . $target_path . basename($row['userfile']) . "> 
    {$row['userfile']}</a>"; 
+0

如果你存儲在磁盤上,你需要確保文件名是唯一的,或者一個用戶的上傳可以打開另一個文件。我建議爲磁盤存儲生成文件名,並使用表來存儲從用戶文件名到磁盤文件名的查找。如果你要有很多圖像,製作子目錄也是一個好主意,或者你可以用完目錄inode。 –