Varbinary MaxフィールドとしてSql Server 2016に保存されたPhp PDOを使用して画像が表示されない理由を理解しようと、頭を悩ませてきました。私は 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 タグで機能しない理由がわかりません。表示されるのは壊れた画像のアイコンだけですが、ページのソース コードを見ると、画像の data: タグの後にデータが表示されます。
ここでもこれに対する解決策を探しましたが、何も機能しません。おそらくフェッチが原因だと思いますが、これに関するウェブ上のドキュメントは限られているため、理由はわかりません。
助けていただければ幸いです。ありがとう!