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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 00:45:07