无法将图像数据插入LongBlob字段

时间:2011-05-07 00:07:47

标签: php mysql

这里有新手,请耐心等待。

构建一个非常小的个人应用程序,上传一些图像和信息。我无法弄清楚为什么以下PHP / MySQL不会将查询中的最后一个插入($file_data)添加到我的DB的longblob字段中。

查询中的所有其他字段插入正常,这意味着我一次测试一个,添加到查询,直到我到达最后一个然后插入失败。我能够在插入之前回显$file_data并看到数据存在,我还发现硬编码$file_data的字符串值(即$file_data="this will insert")插入正常...这令人沮丧。

所以我的猜测是在读取文件($fp fread等)时出错或者我的longblob设置错误。文件大小<16kb,所以我确定它也不是php.ini问题。

有什么想法吗?感谢。

$boxtype=$_POST['type'];
$title=$_POST['title'];

if(isset($_POST['submit']) && $_FILES['imgfile']['size'] > 0)
{

    $filename = $_FILES['imgfile']['name'];
    $tmpName = $_FILES['imgfile']['tmp_name'];
    $file_size = $_FILES['imgfile']['size'];
    $mime_type = $_FILES['imgfile']['type'];        

    $fp = fopen($tmpName, 'r');
    $file_data = fread($fp, filesize($tmpName));
    fclose($fp);

    $query = "INSERT INTO table 
         (boxtype,title,filename,mime_type,file_size,file_data) 
         VALUES 
         ('$boxtype','$title','$filename','$mime_type','$file_size','$file_data')
         ";

    $db = db_connect(); 
    $result = $db->query($query) or die('Error, query failed');

    if ($result) 
    {
       echo "<br>Success<br>";
    }
}
else die("No Content");

MySQL表:

CREATE TABLE `port` (
  `id` int(2) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `boxtype` tinytext COLLATE latin1_general_ci NOT NULL,
  `title` varchar(40) CHARACTER SET latin1 NOT NULL,
  `filename` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `mime_type` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `file_size` int(11) NOT NULL,
  `file_data` longblob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

4 个答案:

答案 0 :(得分:0)

因为它是一个二进制文件,它可能包含值,这意味着它可能会抛出一个摆动

尝试在file_data变量上使用addslashes,以便保存它。

答案 1 :(得分:0)

我在使用Google时遇到的示例显示数据是使用addslashes或mysql_real_escape_string转义的。因此我的猜测是,这是一个至关重要的部分,因为$ file_data字符串可能包含各种字符。

答案 2 :(得分:0)

您必须使用mysqli_函数来创建预准备语句。这是一个例子

$sql = 'INSERT INTO Table(boxtype,title,filename,mime_type,file_size,file_data) 
         VALUES (?,?,?,?,?,?)';

$stmt = mysqli_prepare($link, $sql); 
mysqli_stmt_bind_param($stmt, "ssssib", $boxtype,$title,$filename,$mime_type,$file_size,$file_data);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt); 

这也可以防止您的代码可能容易受到的SQL注入攻击。或者,您可以使用PDO libraries创建预准备语句。

使用PDO,您可以执行以下操作。

$sql = 'INSERT INTO Table(boxtype,title,filename,mime_type,file_size,file_data) 
             VALUES (:boxtype,:title,:filename,:mime_type,:file_size,:file_data)';
$statement = $con->prepare($sql); 

$statement->bindParam(':boxtype',$boxtype,PARAM_STR); 
$statement->bindParam(':title',$title,PARAM_STR); 
$statement->bindParam(':filename',$filename,PARAM_STR); 
$statement->bindParam(':mime_type',$mime_type,PARAM_STR); 
$statement->bindParam(':file_size',$file_size,PARAM_INT); 
$statement->bindParam(':file_data',$file_data,PARAM_LOB); 
$statement->execute(); 

答案 3 :(得分:0)

如果在Windows上使用fopen($tmpName, 'rb');并使用mysql_escape_string($file_data)