我一直在绞尽脑汁试图弄清楚为什么使用 Php PDO 无法显示图像,并将其作为 Varbinary Max 字段存储在 Sql Server 2016 中。我使用 Php 7,并使用相同的代码在 Php 5 上运行,但使用的是 MySql。我想改用 Sql Server。
当我显示它时,我得到的只是一个损坏的图像,但在源代码中它显示了图像数据。它是使用 base64 编码的,我使用 while 循环来获取记录。我的代码如下。
插入效果很好,我可以在数据库中查看图像。
$sql1 = "INSERT INTO weather_stories (filedate, text, imgfile)
VALUES (:filedate, :text, :imgfile)";
$preparedStatement = $conn->prepare($sql1);
$preparedStatement->bindParam(':filedate', $_POST['filedate']);
$preparedStatement->bindParam(':text', $_POST['text']);
$preparedStatement->bindParam(':imgfile', $output, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);
$preparedStatement->execute();
显示图像:
$sql = "SELECT TOP (2) id, filedate, imgfile, text, adddatetime, CONCAT(ROUND(DATALENGTH(imgfile)/1024, 1), 'k') as size
FROM weather_stories
ORDER BY adddatetime DESC";
// use exec() because no results are returned
$preparedStatement = $conn->prepare($sql);
$preparedStatement->execute();
//retrieve records
while ($row = $preparedStatement->fetch()) {
//create table
echo "<tr>";
echo "<td>" . $row['filedate'] . "</td>";
echo "<td>" . $row['text'] . "</td>";
echo "<td>" . $row['adddatetime'] . "</td>";
echo "<td>" . $row['size'] . "</td>";
echo "</tr>";
echo "<tr>";
echo "<td><a href='viewws.php?id=" . $row['id'] . "'>";
echo "<img width='300' height='300' src='data:image/png;base64," . base64_encode($row['imgfile']) . "' />";
echo "</a></td>";
echo "<td><a href='#' id=" . $row['id'] . " class='deletews'>Delete</a></td>";
echo "</tr>";
}
我不明白为什么这在 img 标签中不起作用。它显示的只是损坏的图像图标,但是当您查看页面的源代码时,它会在数据之后显示数据:图像中的标记。
即使在这里,我也已经到处寻找解决方案,但没有任何效果。我怀疑它可能与获取有关,但不知道为什么,因为网络上关于此的文档有限。
帮助将不胜感激。谢谢!