Php 将图像数据插入LongBlob字段时出现问题

Php 将图像数据插入LongBlob字段时出现问题,php,mysql,Php,Mysql,这里完全是新手,请容忍我 建立一个非常小的个人应用程序,上传一些图片和信息。我不明白为什么下面的PHP/MySQL没有将查询中的最后一个insert($file\u data)添加到我的数据库的longblob字段中 查询中的所有其他字段都可以很好地插入,这意味着我一次测试一个字段,添加到查询中,直到最后一个字段插入失败。我能够在插入之前回显$file\u data,并查看数据是否存在,我还发现为$file\u data硬编码字符串值(即$file\u data=“this will inser

这里完全是新手,请容忍我

建立一个非常小的个人应用程序,上传一些图片和信息。我不明白为什么下面的PHP/MySQL没有将查询中的最后一个insert(
$file\u data
)添加到我的数据库的longblob字段中

查询中的所有其他字段都可以很好地插入,这意味着我一次测试一个字段,添加到查询中,直到最后一个字段插入失败。我能够在插入之前回显
$file\u data
,并查看数据是否存在,我还发现为
$file\u data
硬编码字符串值(即
$file\u data=“this will insert”
)可以很好地插入。。。这是令人沮丧的


因此,我猜测在读取文件时有错误(
$fp fread
等),或者我的longblob设置错误。文件大小是的,因为它是二进制文件,它可能包含一些值,这意味着它可能会发出抖动


尝试在file_data变量上使用addslashes,这样它就可以保存它。

因为它是二进制的,所以它可能包含一些值,这意味着它可能会发出抖动


尝试在file\u data变量上使用addslashes,这样它就可以保存它。

我在使用Google时遇到的示例表明,数据是使用addslashes或mysql\u real\u escape\u string进行转义的。因此,我的猜测是,这是一个关键部分,因为$file_数据字符串可能包含各种字符。

我在使用Google时遇到的示例表明,数据是使用addslashes或mysql_real_escape_字符串进行转义的。因此,我认为这是一个关键部分,因为$file_数据字符串可能包含各种字符。

您必须使用mysqli_u函数来创建一个准备好的语句。这里有一个例子

$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,您可以执行以下操作

$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(); 

您必须使用mysqli_uu函数来创建准备好的语句。这里有一个例子

$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,您可以执行以下操作

$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(); 

如果在windows上使用
fopen($tmpName,'rb')
并使用
mysql\u escape\u字符串($file\u data)

如果在windows上使用
fopen($tmpName,'rb')
并使用
mysql\u escape\u string($file\u data)

如果在插入之前先转义数据会发生什么?我从未使用过文件上传到数据库,所以不确定在字段中插入$file_数据时是否需要这样做。显然,我也这么认为,请参见下文。如果在插入之前先转义数据,会发生什么?我从来没有使用过文件上传到数据库,所以不确定在字段中插入$file_数据时是否需要这样做。显然,我也这么认为,见下文。这确实起到了作用,不认为在xxs攻击之外逃逸很重要,但可以肯定的是,db不喜欢二进制文件。谢谢这就成功了,不认为在xxs攻击之外逃逸是重要的,但可以肯定的是,db不喜欢二进制文件。谢谢