Php 将文件\u get\u内容($variable)作为blob插入数据库

Php 将文件\u get\u内容($variable)作为blob插入数据库,php,mysql,Php,Mysql,我对PHP和SQL相当陌生,面临着一个无法找到解决方案的问题 我正在尝试使用以下PHP代码将图像上传到mysql数据库: $fileName = $_FILES['file']['name']; $fileTmpName = $_FILES['file']['tmp_name']; include 'dbh.php'; $fileData = file_get_contents($fileTmpName); $sql = "INSERT INTO images (name, data) VALU

我对PHP和SQL相当陌生,面临着一个无法找到解决方案的问题

我正在尝试使用以下PHP代码将图像上传到mysql数据库:

$fileName = $_FILES['file']['name'];
$fileTmpName = $_FILES['file']['tmp_name'];
include 'dbh.php';
$fileData = file_get_contents($fileTmpName);
$sql = "INSERT INTO images (name, data) VALUES ('$fileName', '$fileData')";
mysqli_query($conn, $sql);
mysqli_close($conn);
结果是数据库根本没有改变。 如果我不是插入$fileData,而是插入一个随机值(例如,
“插入图像(名称、数据)值(“$fileName”,“test”)”
),它会将值插入数据库,因此问题一定是$fileData是猜测

列数据的类型是blob,我还尝试了longblob、varchar和text


感谢您的帮助。

将数据插入BLOB字段时,您可以仅使用十六进制表示法,如:

INSERT INTO table (myblobfield) VALUES (0x123456789...etc...)";
您可以先使用bin2hex()将$fileData数据转换为十六进制:

$sql = "INSERT INTO images (name, data) VALUES ('$fileName', 0x".bin2hex($fileData).")";
请记住,在BLOB字段中存储二进制数据通常不是一个好主意。从长远来看,在大多数情况下,它的性能往往很差,尤其是在频繁访问数据的情况下

很多人尝试使用PHP将图像数据提取出来并流式传输到浏览器。但这意味着必须首先查询图像数据并从MySQL发回(MySQL会占用一些数据库I/O),然后临时占用PHP内存,最后PHP必须将其推送到最终收件人。因此,如果您有一个100k映像,那么它将向数据库添加100k负载,并向PHP内存使用量添加另一个100k,并且可能会占用另一个web服务器插槽更长的时间。所以这只是一个很大的开销


如果它是静态内容,比如标准JPG图像或其他什么,那么允许web服务器直接提供它几乎总是更好的。在此过程中,有各种各样的优化可以让场景快速发生(并且可以与未来的解决方案很好地扩展)。

文件中有什么?使用PDO而不是mysqli,并将数据作为对象而不是字符串传递。或者你可以在插入东西之前对它们进行base64_编码,在取出它们时对它们进行base64_解码。@Jay Blanchard我测试了各种.jpg文件,“我无法找到解决方案”。。。认真地有一个类似的问题,在右边的“相关”问题的第一行。。。数据库不会更改,因为您在创建查询时没有正确地转义变量,所以出现了错误(顺便说一下,您没有检查错误)。我总是看到base64的解决方案。。。我喜欢
bin2hex
这是个好主意(如果可行的话)!非常感谢你的帮助,这就是问题所在。base64真是个坏主意。它不仅使原始大小增加了33%左右,还意味着每次数据可用之前都必须解码(除非您试图在内联图像中使用base64版本)。