我的 MySQL 数据库中有一个 BLOB 类型的图像字段,我通过 PDO 收集数据,但是在查看它时它没有显示任何内容,我已经搜索了互联网,并且在任何地方我都得到了相同的东西src="data:image/jpeg;base64
。
这是我的代码:
<?php
require_once './BaseDatos.php';
$id = $_GET['id'];
$bd = new BaseDatos('foro');
$imagen = $bd->SenetenciaSelect("usuarios", ["id"=>$id])[0]["image"];
echo '<img src="data:image/jpeg;base64,'.base64_encode($imagen) .' "/>';
$imagen
如果我显示它,该变量将返回:
ÿØÿà\0JFIF\0\0\0\0\0\0ÿþ\0;创建者:gd-jpeg v1.0(使用 IJG JPEG v62),质量 = 90 ÿÛ\0C\0 %# , #&\')* )-0-(0%()(ÿÛ\0C (((((((((((((((((((()(((((((((((((((((((((((((())) (((((((((()ÿÀ\0@ \0\"\0ÿÄ\0\0\0\0\0\0\0\0\0\0\0\0 ÿÄ\0µ\ 0\ 0\0}\0!1AQa\"q2'¡#B±ÁRÑð$3br‚ %&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„„…†‡ˆ‰Š'“”•–~™š¢£¤¥ ¦§¨©ª²³´µ¶ ¸¹ºÂÃÄÅÇÈÉÊÒÓÔÕÖ×ØÙÚáââãäåæçèééñòóôõö÷øùúÿÄ\0\0\0\0\0\0\0\0 ÿÄ\0µ\0\0w\0!1AQaq\"2B'¡±á等。
一切都表明这是一个字符集转换问题,损坏了您的数据,
BLOB
或者您遇到了一些与使用 PHP 5.5 起已弃用的函数mysql_*
或较差的 SQL 转义有关的问题。字符集相关问题:
如果在建立连接后的任何时候使用
SET CHARACTER SET utf8
,客户端将开始执行字符转换,即使是BLOB
从表所在字符集中的类型字段。如果您改为使用
SET NAMES utf8
,则服务器和客户端都将就所有内容就相同的字符集达成一致,并且不会有客户端转换为损坏的数据。看看这个页面上的数据。
在其中您可以看到它
SET NAMES 'charset_name'
等效于:但是它
SET CHARACTER SET 'charset_name'
相当于:因此,如果表处于其默认值 (
latin1_swedish_ci
),则数据将被损坏。与坏 SQL 转义相关的问题:
要将数据正确插入到数据库中,您应该修改代码并使用
mysql_real_escape_string()
,而不是addslashes()
:这样你就不会遇到奇怪字符的问题。您还应该尝试使用
mysql_set_charset()
.尽管如此,我还是敦促您将代码迁移到mysqli,或者更好的是PDO。这样,您可以使用字段映射进行准备好的查询,而不会遇到字符串转义的问题。
我懂了
编辑:完整的例子
三种可能的解决方案(@deprecated):
A.
$imagen
在你放这个之后 使用你的变量$imagen=$bd...
并注释掉你试图在其中显示图像的实际代码:B.
$imagen
在评论您当前的代码后 使用您的变量$imagen=$bd...
来显示图像并复制并粘贴:C. 不工作?确保您的图像在数据库中是正确的。
通过您对@a-cedano 的回答的评论引导我。我进行了一个测试,似乎问题在于,在保存 BLOB 之前,您对其应用了 addslashes,但在检索信息时您没有对其应用 stripslashes
这是我的测试代码,(假设在同一路径中有一个有效的 test.jpg 文件)