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

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

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

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

Q&A

解決済

3回答

740閲覧

テーブルに.jpg形式の画像をアップロードすると中身が文字化けしており確認が取れない

Ms.yy

総合スコア83

PHP

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

0グッド

0クリップ

投稿2020/01/05 23:04

発生している問題・エラーメッセージ

DBのテーブルに.jpg形式の画像をアップロードするとテーブルの中身が文字化けとなるのですが、どなたか解決方法分かる方がいらっしゃればご教授お願いしたいです。

###エラーメッセージ

イメージ説明
イメージ説明
イメージ説明

###作成したテーブル

mysql> CREATE TABLE IF NOT EXISTS `posts` ( -> `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, -> `imgdat` blob NOT NULL, -> `mime` VARCHAR(64) NOT NULL, -> PRIMARY KEY (`ID`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
### edit.php ```ここに言語名を入力 <form enctype="multipart/form-data" action="login" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="300000" /> <input name="image" type="file" /> <p><input type="submit" name="save" value="Submit" /><p> {{ csrf_field() }} </form> <?php $url = "localhost"; $user = "root"; $pass = ""; $db = "myblog"; if (!empty($_POST)) { // バイナリデータ $fp = fopen($_FILES["image"]["tmp_name"], "rb"); $imgdat = fread($fp, filesize($_FILES["image"]["tmp_name"])); fclose($fp); $imgdat = addslashes($imgdat); // 拡張子 $dat = pathinfo($_FILES["image"]["name"]); $extension = $dat['extension']; // MIMEタイプ if ( $extension == "jpg" || $extension == "jpeg" ) $mime = "image/jpeg"; else if( $extension == "gif" ) $mime = "image/gif"; else if ( $extension == "png" ) $mime = "image/png"; // MySQL登録 $link = mysqli_connect( $url, $user, $pass ) or die("MySQLへの接続に失敗しました。"); $sdb = mysqli_select_db( $link,$db) or die("データベースの選択に失敗しました。"); $sql = "INSERT INTO `myblog`.`posts` (`imgdat`, `mime`) VALUES ('".$imgdat."', '".$mime."')"; $result = mysqli_query( $link,$sql) or die("クエリの送信に失敗しました。"); mysqli_close($link) or die("MySQL切断に失敗しました。"); } ?>

view.php

<?php $url = "localhost"; $user = "root"; $pass = ""; $db = "myblog"; $link = mysql_connect( $url, $user, $pass ) or die("MySQLへの接続に失敗しました。"); $sdb = mysql_select_db( $db, $link ) or die("データベースの選択に失敗しました。"); $sql = "SELECT * FROM myblog.posts"; $result = mysql_query( $sql, $link ) or die("クエリの送信に失敗しました。"); $rows = mysql_num_rows( $result ); mysql_close( $link ) or die("MySQL切断に失敗しました。"); if($rows){ while($row = mysql_fetch_array($result)) { echo '<img src="posts/edit?id='.$row["ID"].'" />'; } } ?>

create_mage.php

<?php $url = "localhost"; $user = "root"; $pass = ""; $db = "myblog"; $id = $_GET['id']; $link = mysqli_connect( $url, $user, $pass ) or die("MySQLへの接続に失敗しました。"); $sdb = mysqli_select_db( $db, $link ) or die("データベースの選択に失敗しました。"); $sql = "SELECT * FROM myblog.posts WHERE ID = '".$id."'"; $result = mysqli_query( $sql, $link ) or die("クエリの送信に失敗しました。"); $rows = mysqli_num_rows( $result ); mysqli_close( $link ) or die("MySQL切断に失敗しました。"); if( $rows ){ while($row = mysqli_fetch_array($result)) { header( "Content-Type: ".$row['mime'] ); echo $row['imgdat']; } } ?>

補足情報(FW/ツールのバージョンなど)

OS:mac
php ver:7.1
mysql ver:5.6

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

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

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

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

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

m.ts10806

2020/01/06 00:11

create_mage.php にて出力したものに問題がありますか?
guest

回答3

0

DBのテーブルに.jpg形式の画像をアップロードするとテーブルの中身が文字化けとなるのですが

これで問題ありません。JPEG画像はバイナリファイルですので、文字として表示しても意味のある表示にはなりません。

投稿2020/01/06 00:09

maisumakun

総合スコア145184

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

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

Ms.yy

2020/01/06 09:56

なるほどです。 とりあえずエラーではないとみなさんから回答頂いたので安心しました^^
guest

0

ベストアンサー

既に出ている回答の通り、問題は起きていません。画像をPCのビューワーなどでなく、テキストエディタなどで開いてみるとその理由がわかります。

ご自身でもちゃんとfreadでバイナリデータ化して保存されているのできちんと組んだ通りに処理されています。

ただ、
そもそも「画像をDBに保存すべきか否か」も検討いただきたく。

投稿2020/01/06 00:35

m.ts10806

総合スコア80850

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

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

Ms.yy

2020/01/06 09:59

とりあえずエラーではないと安心しました。 本来は画像のパスで保存がいいみたいですね、直接保存ではなくその方向で調べてみます!
m.ts10806

2020/01/06 10:03

ネットから拾い集めたコードはバグだらけと思ってください。 自身で理解できないのに使っていると結局身につきません。(デバッグ依頼のような内容になっています)
guest

0

view.phpのmysql_関数はすでにメインバージョンでは削除された関数です
自力でなんとかできないなら使わないでください

投稿2020/01/06 00:26

編集2020/01/06 00:27
yambejp

総合スコア114837

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

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

yambejp

2020/01/06 00:37 編集

teratailの仕様がかわったのかほんとに調子悪いです (以下追記) できればpdoの利用を検討ください edit.phpで、バイナリデータを中途半端なエスケープ処理で テーブルに投入していますがNGです。 かならずprepareで処理してください create_mage.php(create_image.php??)では header('Content-Type: image/jpeg'); を出力するように
m.ts10806

2020/01/06 00:37 編集

質問者のコードに混在してますね。 mysqlとi
Ms.yy

2020/01/06 09:57

参考にしたサイトはmysqlだったのでそれだとエラーとなったのでmysqliに変更しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問