У меня есть поле изображения типа BLOB в моей базе данных MySQL, я собираю данные через 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;CREATOR: 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!±áq\0!±áq.
Все указывает на то, что это проблема преобразования кодировки, повреждающая ваши данные,
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...
комментирования вашего текущего кода, чтобы отобразить изображение и скопировать и вставить это:С. Не работает? Убедитесь, что ваше изображение правильно в базе данных.
Ведите меня своим комментарием к ответу @a-cedano. Я собрал тест, и кажется, что проблема в том, что перед сохранением BLOB вы применяете к нему аддслеши, но вы не применяете к нему полоски при получении информации
это мой тестовый код (предполагается действительный файл test.jpg по тому же пути)