1

以下脚本一直在从 MySQL 中的 BLOB 列输出图像很长时间了:

<?
$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 列替换它;图像不会显示。这与我尝试显示已经存在的图像还是尝试上传新图像无关。

我发现的最接近的问题是here(德语)。为了改变我使用的列

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

显然,如有必要,我愿意提供更多信息。

我在版本 3.5.2.2、PHP 5.3.17 和 mysql 客户端 API 版本(是 mysql 版本吗?) 5.1.63 中使用 phpMyAdmin。

提前致谢!

4

1 回答 1

0

好的,我发现了问题:

对于 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

无论如何感谢大家的努力!

于 2012-11-03T20:52:22.567 回答