使用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
相关产品推荐
相关产品推荐

