2012-05-31 94 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。 –