语境
我使用 PDO 将图像存储在 MySql DB 中的 BLOB 列中(是的,这是必需的)。
我base64_encoded
通过 AJAX 从客户端的浏览器将 .png 上传到 .php 网络服务,并使用 .php 将其存储在我的数据库中base64_decode()
。
后来,我在客户端的浏览器上取回它。然后再次上传,以此类推,直到时空连续体破裂。
从数据库中检索一个有效的 BLOB(直接在 phpMyAdmin 上导入,所以 100% 确定)很好,我可以在浏览器上很好地打印它。
但是将它存储在MySql上......
问题
设置看起来像这样:
$dbh = new PDO('mysql:host=localhost;dbname=Me', 'My', 'Myself');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec("SET CHARACTER SET utf8"); //I tried playing with charset too
$query = $dbh->prepare("UPDATE i_like_underscores SET `my_blob`=:my_blob WHERE `it`=`:belongs");
$my_blob = base64_decode($_POST['my_blob']);
$query->bindParam(':my_blob', $my_blob, PDO::PARAM_LOB);
//The WHERE clause has really no importance here, so I don't even bind it
$query->execute();
似乎PDO 在此过程中系统地删除了我的 blob 的一些特殊字符(但我无法准确诊断),因为当我稍后取回我的图片(并在 base64 上对其进行编码)时,所有的+和=都从我的 base64 中消失了字符串(虽然/静止)=== 已损坏。
我猜当我绑定它时它会自动转义,但我无法判断,因为base64_decoded
.png 数据是用不可读的奇怪字符集编码的。
我花了很多时间,并尝试:
- 更改编码
PDO::quote()
在 base64_decode() 之后- 在我的 SQL 查询上加上各种引号
- 准备好的陈述和直接
PDO::query
- 在网上浏览我使用的所有 PDO 函数的文档
- 在 StackOverflow 上也找到类似的案例,但没有运气
- 看看它是如何在 phpMyAdmin 中完成的
- 设定类型
PDO::PARAM_STR
- 不考虑仅仅为了那个特殊情况而退出 PDO
- 向后写我所有的代码
- 还有黑魔法
没有运气......有人可以给我一个线索吗?