質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1545閲覧

PHPにてMySQLデータベース(mysqliからpdo接続変更)へ画像データ登録呼出し表示が出来ない。

duli3041

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/09/15 02:53

編集2021/09/17 03:28

前提・実現したいこと

※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
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/09/15 03:14

ソース提示の際はマークダウンしてください
duli3041

2021/09/17 03:30

テンプレートに併せて見ました。よろしくお願いします。
guest

回答2

0

自己解決

解決できました。
mysqliでもpdoでもどちらでも良かったです。画像データをmediumblob型で
準備して、$imgdat = base64_encode($imgdat);エンコードを掛けて保存。
次にselect文で呼出し(全件でも、where条件付きでも)変数に格納します。
後は下記内容で画像を表示します。
<img src="data:image/png;base64,<?php echo $img; ?>">
注意:PHP内部では表示出来ませんでした。htmlに切り替えて上記をセットし
必要であればPHPに戻してあげれば継続した処理に繋がります。

<こんな感じ>
イメージ説明

<画像データの扱い方>
1.mYsqlデータベースのテーブル型はblobとかmediumblob型にします。
2.ファイルからの取込はformでenctype="multipart/form-data"を使い受渡します。
3.mysqlへ書込みは、画像をbase64エンコード変換します。
$imgdat = base64_encode($image_data);
4.画像の表示は、上記に記載した通りslect文で抽出し変数にセットした後、htmlで、
<img src="data:image/png;base64,<?php echo $img; ?>">を記載するだけで
画像表示が出来ました。

<解決出来なかった事>
はじめは、こんな感じで画像表示出来ないかと悩んでいました。
例) echo '<img src="data:image/png;base64,<?php echo $img; ?>">';
これだとPHP内部でhtmlを呼出し処理する内容で良いと思っていましたが...
この内容だと上手くいきません。
単純に、?>でphpを終了してechoを外したhtml環境で<img scr...を実行するだけで
画像表示できました。

投稿2021/09/18 22:48

duli3041

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

prepareでデータの投入をしてください
できればpdoでやったほうが参考になるサイトも多いと思います

投稿2021/09/15 03:12

編集2021/09/15 03:13
yambejp

総合スコア114968

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

duli3041

2021/09/15 03:26

回答有難うございます。 データベース接続にmysqliとpdoが有りますが、mysqliをずっと使っていて...。 mysqliでprepareを使う参考は無いでしょうか? また何故幾つも手法が有るのか? pdo接続が良いのは参考資料が多いからなのでしょうか? アドバイス有難うございます。
yambejp

2021/09/15 03:34

https://www.php.net/manual/ja/mysqli.prepare.php mysqliは旧mysql_*の手続き型の継承ですから、古いシステムのリストラクションには有効ですが オブジェクト型を使うならPDOのほうがアクセスしやすいしオプションも使いやすいです なによりWEB上で参考サイトが多くてトラブルに強いと言えます
duli3041

2021/09/15 04:03

有難うございます。 pdo接続を勉強します。
yambejp

2021/09/17 03:44

「まだ回答を求めています」設定されたようですが prepareで処理することは諦めたのでしょうか? バイナリデータを扱う限りprepareは避けて通れませんよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問