这里有新手,请耐心等待。
构建一个非常小的个人应用程序,上传一些图像和信息。我无法弄清楚为什么以下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;
答案 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)
。