0

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: タグの後にデータが表示されます。

ここでもこれに対する解決策を探しましたが、何も機能しません。おそらくフェッチが原因だと思いますが、これに関するウェブ上のドキュメントは限られているため、理由はわかりません。

助けていただければ幸いです。ありがとう!

4

1 に答える 1

0

見つけたいくつかのアイデアをいじってみました。

echo '<img src="data:image/png;base64,' . base64_encode(hex2bin($row['imgfile']))  . '" >';

画像は最初にhex2binでエンコードし、次にbase64でエンコードする必要があり、画像が正しく表示されるようになりました。以前にこれを試したことがあると思っていましたが、何かを見落としていない限りうまくいきませんでしたが、もっと簡単な方法があればいいのにと思います。

また、header() メソッドが機能せず、黒い画面が表示され、Firefox でエラーが発生して画像が表示されません。私は前にそれを試しましたが、同じ問題です。ここではなく一部で機能する理由がわかりません。

于 2016-12-23T20:30:36.767 に答える