0

语境

我使用 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
  • 向后写我所有的代码
  • 还有黑魔法

没有运气......有人可以给我一个线索吗?

4

1 回答 1

0

感谢 davidstrachan,我已经解决了删除=using 的问题:

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

然后,我后来又回到那个问题,只是看到我的表单在jQuery中的序列化是错误的。

它转义了所有+as 空格(或%20)而不是%2B.

于 2013-12-12T09:20:40.080 回答