前提・実現したいこと
※1回目の質問でmysqliよりpdoを使ってくださいと指摘を頂き、
プログラム(3)zu200_select0.phpをpdo接続に変更しました。
然し、 どーしても画像が表示出来なくて...ご教授の程、
よろしくおねがいします。
PHPでMySQLデータベースへ画像データを保存して呼び出すプログラムを
作成しています。
テーブル内容
項# 名前 データ型
1 id int(5) AUTO_INCREMENT
2 imgdat mediumblob
3 mime varchar(15)
4 symd datetime
の構成になっています。画像データは約20KBぐらいを保存します。
プログラムは、
(1)EDIT.PHP ..... ファイルから画像を選びます。
(2)EDIT1.PHP .... データベースへ登録保存します。
(3)zu200_select0.php ... 一覧表示します。
(1)(2)の画像選択登録は出来ていますが、(3)一覧表示で画像が表示出来ません。
■(図-1)画像データの取込データベース保存
■(図-2)一覧表
発生している問題・エラーメッセージ
(図-2)一覧表で画像が表示されない?
画像データ(jpg)を、base64_encode($img)保存して、表示する時にbase64_decode($img)変換し
戻して表示するつもりでした。小さなアイコンの様な表示になってしまいます。
header('Content-Type: image/jpeg')を加えてみましたが、画面全体が真っ黒になってしまい
どの様に解決したら良いかわかりません。 よろしくお願いします。
該当のソースコード
PHP
1//(1)EDIT.PHP ..... ファイルから画像を選びます。 2<form enctype="multipart/form-data" action="./edit1.php" method="POST"> 3 <input type="hidden" name="MAX_FILE_SIZE" value="1500000"> 4 <input name="image" type="file"> 5 <p><input type="submit" name="save" value="Submit" /><p> 6</form>
PHP
1//(2)EDIT1.PHP .... データベースへ登録保存します。 2if (!empty($_POST)) 3{ 4// 画像ファイル 5 $fp = fopen($_FILES["image"]["tmp_name"], "rb"); 6 $imgdat = fread($fp, filesize($_FILES["image"]["tmp_name"])); 7echo '(画像ファイル)$fp-->'.$fp."|"."<br>"; 8fclose($fp); 9} 10// 11//画像処理 12 $fp = fopen($_FILES["image"]["tmp_name"], "rb"); 13 $img = fread($fp, filesize($_FILES["image"]["tmp_name"])); 14 fclose($fp); 15 16//画像をbase64エンコード変換 17$imgdat = base64_encode($imgdat); 18echo "画像をbase64エンコード変換:".$imgdat; 19// 20// 拡張子 21 $dat = pathinfo($_FILES["image"]["name"]); 22 $extension = $dat['extension']; 23// MIMEタイプ 24 if ( $extension == "jpg" || $extension == "jpeg" ) $mime = "image/jpeg"; 25 else if( $extension == "gif" ) $mime = "image/gif"; 26 else if ( $extension == "png" ) $mime = "image/png"; 27// 28//データベース接続定義 29$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8mb4'; 30$user = 'userid'; 31$password = 'userpassword'; 32 33try{ 34 $sql = new PDO($dsn, $user, $password); 35}catch (PDOException $e){ 36 print('データベース接続Error:'.$e->getMessage()); 37 echo "<br>"; 38 echo '<button onclick=location.href="menu.html">'; 39 echo "メニュー戻り"; 40 echo '</button>'; 41 die(); 42} 43echo "データベース接続しました。"."<br>"; 44 45//■insertレコードを挿入する 46$stmt = $sql->prepare("INSERT INTO posts ( 47 imgdat, 48 mime 49 ) VALUES ( 50 :imgdat, 51 :mime 52 )"); 53 54// (4) 登録するデータをセット 55$stmt->bindParam( ':imgdat', $imgdat, PDO::PARAM_STR); 56$stmt->bindParam( ':mime', $mime, PDO::PARAM_STR); 57// 58// (5) SQL実行 59$res = $stmt->execute(); 60// (6) データベースの接続解除 61//$pdo = null; 62//■メニュー戻り 63echo '<button onclick=location.href="menu.html">'; 64echo "メニュー戻り"; 65echo '</button>'; 66 67?> 68<img src="data:image/jpg;base64,<?php echo $imgdat; ?>"> 69 70
PHP
1//(3)zu200_select0.php ... 一覧表示します。 2//■データベース接続 3$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8mb4'; 4$user = 'userid'; 5$password = 'userpassword'; 6 7try{ 8 $pdo = new PDO($dsn, $user, $password); 9}catch (PDOException $e){ 10 print('データベース接続Error:'.$e->getMessage()); 11 echo "<br>"; 12 echo '<button onclick=location.href="menu.html">'; 13 echo "メニュー戻り"; 14 echo '</button>'; 15 die(); 16} 17echo "データベース接続しました。"."<br>"; 18 19//■postsテーブルのselect全てのデータを取得する 20echo "■database(shop)"; 21echo "<br>"; 22echo "■table id(posts)"; 23echo "<br>"; 24echo "[画像データテスト]一覧 (zu200_select0.php)"; 25print "<br>"; 26 27//select文設定 28$sql = 'select ' 29 . 'id, ' 30 . 'imgdat, ' 31 . 'mime, ' 32 . 'symd ' 33 . 'from posts'; 34//クエリー 35$sth = $pdo -> query($sql); 36//配列セット 37$aryItem = $sth -> fetchAll(PDO::FETCH_ASSOC); //$aryItemに配列を代入 38 39//■一覧表作成 40echo '<table>'; 41echo '<table border="1" style="background-color:#98fb98" >'; 42//ヘッダ見出し 43echo '<tr style="background-color:#ff7f50" ><td>'. 44'<font color=#000000>'. 45'番号'.'</td><td><font color=#000000>'. 46'画像データ'.'</td><td><font color=#000000>'. 47'拡張子'.'</td></tr>'; 48 49foreach($aryItem as $row){ 50echo "<td>".$row['id']."</td>"; 51echo "<td>"; 52 53$img = $row['imgdat']; 54$img64 = base64_decode($img); //画像データbase64_encodeからbase64_decode変換処理 55// 56//header('Content-Type: image/jpeg'); 57// jpegファイルの場合 58echo '<img src="data:images/jpeg;base64,$img64 ">'; 59echo "</td>"; 60echo "<td>".$row['mime']."</td>"; 61echo "</tr>"; 62} 63echo "<tr>"; 64echo "<td>"."=合計="."</td>"; 65echo "<td>".""."</td>"; 66echo "<td>".""."</td>"; 67echo "</tr>"; 68echo '</table>'; 69 70//■接続を閉じます 71mysqli_close($sql); 72//■メニュー戻り 73echo '<button onclick=location.href="menu.html">'; 74echo "メニュー戻り"; 75echo '</button>'; 76 77?>
試したこと
画像をbase64エンコード変換してmediumblobに格納しています。
$imgdat = base64_encode($imgdat);
登録されている様に見えていますが、こちらが問題なのか?
また、表示プログラムでは、base64デコード変換をし戻しています。
$img64d = base64_decode($row['imgdat']);
登録の問題か?読込変換の問題か?表示する手法の問題か?
わからなく....よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
MySQL5.7.34
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー