PHP будет генерировать изображения jpg из BLOB, но не из LONGBLOB в таблице MySQL.

Следующий скрипт уже давно выводит изображения из столбца BLOB в MySQL:

<?
$dbname="usr_web5_1";
$db = new mysqli($dbhost, $dbuser, $dbpwd, $dbname);
$sql = "SELECT foto, fototype, modified FROM `Komplettverzeichnis_extras` WHERE `WPID`= ?";
$stmt = $db->prepare($sql);
$stmt->bind_param("s",$_GET['id']);
if (!$stmt->execute()) $error=true;
$stmt->bind_result($file,$filetype,$modified);
$stmt->fetch();
if (!isset($filetype)) $filetype = "image/jpeg";
if (!$error) {
    header("Content-type: $filetype;");
    header("Last-Modified: $modified;");
} else {
    echo "Error";
    echo $db->error;
}
echo $file;
$stmt->close();
$db->close();
}
?>

Я пробовал как изменить столбец на LONGBLOB, так и заменить его новым столбцом LONGBLOB; изображения не будут отображаться. Это независимо от того, пытаюсь ли я показать уже существующие изображения или пытаюсь загрузить новые.

Самая близкая проблема, которую я нашел, находится здесь (Немецкий). Для изменения столбца, который я использовал

ALTER TABLE `Komplettverzeichnis_extras` CHANGE `foto` `foto` LONGBLOB DEFAULT NULL

Очевидно, я готов предоставить больше информации, если это необходимо.

Я использую phpMyAdmin версии 3.5.2.2, PHP 5.3.17 и версию клиентского API mysql (это версия mysql?) 5.1.63.

Заранее спасибо!


person user1770422    schedule 24.10.2012    source источник
comment
данные в LONGBLOB могут быть слишком большими для вашего клиентского соединения сервера mysql по умолчанию и требуют некоторой настройки, чтобы вы могли отправлять большие объемы данных (maxpackets или что-то подобное). Сначала сравните двоичные длины, потому что, если они различаются, вы уже знаете, что данные были усечены, что часто является признаком какого-то ограничения.   -  person hakre    schedule 24.10.2012
comment
Спасибо. Однако это не работает, когда я использую файлы, которые отлично работали в версии BLOB. Таким образом, ничего не усекается.   -  person user1770422    schedule 04.11.2012
comment
Пожалуйста, добавьте исходное определение таблицы к вашему вопросу, чтобы было видно, из какого состояния вы изменяете таблицу.   -  person hakre    schedule 04.11.2012


Ответы (1)


Хорошо, я понял проблему:

Для BLOB будут работать методы mySQLi для строк, которые используются в моем коде, как вы можете видеть выше. Это не относится к Longblob. После execute() и перед bind_result() необходим store_result(). Кроме того, при сохранении я не могу просто использовать bind_param(). Вместо этого необходимо использовать следующую конструкцию с использованием NULL:

if (!$stmt = $db->prepare($sql)) printf($db->error);
$null = NULL;
$stmt->bind_param("bsi",$null,$type,$id);
$stmt->send_long_data(0,$data);
if (!$stmt->execute()) printf($db->error);
$stmt->close();

Короче говоря, мне помог следующий ресурс: Oswald@Work

В любом случае спасибо всем за ваши усилия!

person user1770422    schedule 03.11.2012