使用PDO读取数据库BLOB类型存储的图片无法显示该如何解决?
问题原因及修复方案
核心错误点
- 存入图片时多余使用
addslashes()转义:PDO预处理机制会自动处理特殊字符的转义,额外调用addslashes()会在图片二进制内容中插入多余的转义斜杠,导致图片内容损坏无法读取。 - Data URI格式不完整:前端展示时
<img>标签的src属性仅写了data:image;base64,,缺少图片MIME类型声明,浏览器无法正确识别图片格式。 - 查询条件语法错误:搜索语句中
or 'category' LIKE '%$search%'给category加了单引号,会被识别为字符串对比而非字段匹配,可能导致查询不到正确的记录。 - 存在SQL注入风险:直接将
$search、$start、$limit参数拼接进SQL语句,未使用预处理绑定参数,安全风险很高。 - 字段类型不足风险:如果数据库存储图片的
image字段为TINYBLOB类型,最大仅支持255KB的内容,图片超过大小会被截断无法展示。
具体修复步骤
1. 修改存入图片的代码
删除addslashes()调用,直接读取二进制内容即可:
// 原错误写法 // $imageContent= addslashes(file_get_contents($imageName)); // 修正后写法 $imageContent = file_get_contents($imageName);
2. 修改前端图片展示代码
使用你存入的type字段补全Data URI的MIME类型:
// 原错误写法 // <?php echo '<img src="data:image;base64,'.base64_encode($contacts->image).'" alt="Immagine" class="immagine_post">'; ?> // 修正后写法 <?php echo '<img src="data:'.$contacts->type.';base64,'.base64_encode($contacts->image).'" alt="Immagine" class="immagine_post">'; ?>
3. 修正搜索查询语句
把category的单引号改成反引号,同时改成预处理绑定参数的写法避免注入:
// 原错误写法 // $stmt = $pdo->query("SELECT * FROM post WHERE `title` LIKE '%$search%' or 'category' LIKE '%$search%' ORDER BY created DESC LIMIT $start, $limit"); // 修正后预处理写法 $stmt = $pdo->prepare("SELECT * FROM post WHERE `title` LIKE ? or `category` LIKE ? ORDER BY created DESC LIMIT ?, ?"); $stmt->execute(["%$search%", "%$search%", $start, $limit]);
4. 确认数据库字段类型
将post表的image字段类型修改为MEDIUMBLOB(最大支持16MB)或者LONGBLOB(最大支持4GB),避免图片内容被截断。
补充说明
你使用PDO::FETCH_OBJ的循环写法本身没有问题,不是导致图片加载失败的原因。
内容的提问来源于stack exchange,提问作者Arianna parisi
相关产品推荐
相关产品推荐

