2016-12-23 10 views
0

Varbinary MaxフィールドとしてSql Server 2016に格納されたPhp PDOを使用して画像が表示されない理由を解明しようとしています。私はPHP 7を使用し、これはPHP 5で同じコードを使用していますが、MySqlを使用しています。代わりにSQL Serverに移動したい。Varbinary Maxを使用してPHP PDOを使用してSql Serverから画像を表示できません

私はそれを表示すると、壊れたイメージが表示されますが、ソースコードにはイメージデータが表示されます。これはbase64を使用してコード化されており、whileループを使用してレコードを取得します。私のコードは以下の通りです。

正常に動作し、データベースの画像を見ることができる挿入物。私はimgタグで、なぜこのdoesntの仕事を得ることはありません

$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>"; 
    } 

:画像の表示

$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(); 

。表示されるのは壊れた画像アイコンですが、ページのソースコードを見ると、画像内のdata:タグの後のデータが表示されます。

私はここにもこれに対する解決策を見てきましたが、何も機能しません。私はそれが多分フェッチと疑うが、なぜか分からない、これについてのWeb上の限られたドキュメントがあるので。

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

+0

ステップ1では、1つのレコードを選択し、バイナリイメージデータをページに直接出力して、有効なイメージであるかどうかを確認します。コンテンツタイプを設定するには、 'header()'を適切に呼び出します。 – miken32

+0

また知っておく価値があります:https://msdn.microsoft.com/en-us/library/bb522494.aspx – miken32

答えて

0

私はちょうどアイブ氏が発見いくつかのアイデアで遊んでそれを考え出し、

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

は、画像は、base64でエンコードその後、第一HEX2BINなければならなかったし、今では正常に画像を表示します。私はこれを前に試してみたと思っていましたが、私は何かを逃していない限り、それは仕事をしませんでしたが、もっと簡単な方法があることを望みます。

また、header()メソッドが動作しないと、黒い画面が表示され、画像はFirefoxのエラーの原因には表示されません。私は前と同じ問題を試してみました。私はなぜそれがいくつかではなく、ここでは動作しないのか分からない。

関連する問題