You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP更新MariaDB的MEDIUMBLOB时数据意外被截断

问题根源:错误的占位符引用方式

你遇到的这个问题其实是个典型的PDO使用误区——你把占位符:blobFirma放在了SQL语句的单引号里,导致PDO没有把它当作参数绑定的标记,而是直接把字符串:blobFirma作为值插入到了数据库中。

你看到的十六进制值3A626C6F624669726D61,其实就是字符串:blobFirma的ASCII编码(: 是0x3A,b是0x62,以此类推),这就解释了为什么不管你上传什么图片,数据库里的内容都是固定的这串字符。

修正后的代码

把SQL语句里的单引号去掉,PDO会自动处理参数的类型和转义:

$imgContents = $_POST['imgContents'];
$decodedPNG = base64_decode($imgContents);
// 去掉占位符周围的单引号
$defTest = "UPDATE recogidas SET FirmaProv = :blobFirma WHERE ID=:index";
$preparedpdo = $mypdoObject->prepare($defTest);
// 绑定BLOB参数
$preparedpdo->bindParam(':blobFirma', $decodedPNG, PDO::PARAM_LOB);
// 同时把ID也改成参数绑定(避免SQL注入风险)
$preparedpdo->bindParam(':index', $index, PDO::PARAM_INT);
$preparedpdo->execute();

额外的检查建议

  • 验证POST数据完整性:可以在PHP开头先检查$_POST['imgContents']的长度,确认前端传过来的base64字符串没有被截断:

    var_dump(strlen($_POST['imgContents']));
    

    如果长度异常,需要检查PHP配置中的post_max_size和upload_max_filesize,确保它们的值足够容纳你的100KB数据。

  • 确认字段类型:确保数据库中的FirmaProv字段确实是MEDIUMBLOB类型(它支持最大16MB的数据,完全足够存100KB的PNG),如果是BLOB类型也能存(最大64KB),但MEDIUMBLOB更稳妥。

  • 避免SQL注入:刚才的修正里把ID=$index改成了参数绑定,这很重要——直接把变量拼进SQL语句会带来严重的SQL注入风险,一定要用参数绑定来处理所有用户输入或动态变量。

内容的提问来源于stack exchange,提问作者Juan JuezSarmiento

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:42