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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1898閲覧

php簡易掲示板の画像・動画アップロードについて

hellommm

総合スコア49

MySQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/06/04 01:08

編集2018/06/04 04:23

やっていること。

下の画像のように掲示板を作っている。
名前、コメント、パスワードを入力し、htmlのtableタグで
番号、名前、コメント、時間、動画、画像を表示する。
画像・動画は$_FILESを使い拡張子を見て判断する。
画像・動画をmysqlのデータベースに登録し、selectして取り出す。

できないこと。

画像・動画はinsertでデータベースに登録できているのだが、取り出しても下の画像
のような表示になり、クリックすることもできない。

やりたいこと。

掲示板に画像・動画を表示したい。
データベースを見てみたのですが、$raw_dataが200行くらいあったのですが正常でしょうか?

汚いコードやと思いますが、よろしくお願いします。
以下コード

Main.php

php

1<?php 2 3/* 4 * To change this license header, choose License Headers in Project Properties. 5 * To change this template file, choose Tools | Templates 6 * and open the template in the editor. 7 */ 8//セッション開始 9session_start(); 10//エラーメッセージの初期化 11$errorMessage = ""; 12//データベース処理読み込み 13require_once("logindb.php"); 14require_once("func.php"); 15//インスタンス化 16$pdo = db_connect(); 17 18//ファイルアップロードがあったとき 19if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error']) && isset($_FILES["upfile"]) && $_FILES["upfile"]["name"] !== ""){ 20 //エラーチェック 21 switch ($_FILES['upfile']['error']) { 22 23 case UPLOAD_ERR_OK: // OK 24 break; 25 case UPLOAD_ERR_NO_FILE: // 未選択 26 $errorMessage = "ファイルが無い。"; 27 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 28 $errorMessage = "ファイルのサイズが大きすぎる。"; 29 default: 30 $errorMessage = "error。"; 31 } 32 33 //画像・動画をバイナリデータにする. 34 $raw_data = file_get_contents($_FILES['upfile']['tmp_name']); 35 36 $tmp = pathinfo($_FILES['upfile']['name']); 37 //拡張子代入 38 $extension = $tmp["extension"]; 39 //拡張子確認 40 if($extension == "jpg" || $extension == "JPG" || $extension == "jpeg"){ 41 $extension = "jpeg"; 42 }else if($extension == "png" || $extension == "PNG"){ 43 $extension = "png"; 44 }else if($extension == "gif" || $extension == " GIF"){ 45 $extension = "gif"; 46 }else if($extension == "mp4" || $extension == "MP4"){ 47 $extension = "mp4"; 48 }else{ 49 $errorMessage = "非対応ファイルです"; 50 exit(1); 51 } 52 53 //DBに格納するファイルネーム設定 54 //サーバー側の一時的なファイルネームと取得時刻を結合した文字列にsha256をかける(暗号化する). 55 //$date = getdate(); 56 //$fname = $_FILES["upfile"]["tmp_name"].$date["year"].$date["mon"].$date["mday"].$date["hours"].$date["minutes"].$date["seconds"]; 57 //$fname = hash("sha256", $fname); 58 $fname = $_FILES["upfile"]["tmp_name"]; 59 60 try{ 61 //トランザクション開始 62 $pdo->beginTransaction(); 63 //プリペアドステートメント 64 $sql = "INSERT INTO board (bd_name, bd_com, bd_date, bd_pass, fname, extension, raw_data) VALUES ( 65 :bd_name, :bd_com, :bd_date, :bd_pass, :fname, :extension, :raw_data)"; 66 $stmh = $pdo->prepare($sql); 67 $stmh->bindValue(':bd_name', $_POST['bdname'], PDO::PARAM_STR); 68 $stmh->bindValue(':bd_com', $_POST['bdcom'], PDO::PARAM_STR); 69 $stmh->bindValue(':bd_date', date('H:i:s'), PDO::PARAM_INT); 70 $stmh->bindValue(':bd_pass', $_POST['bdpass'], PDO::PARAM_INT); 71 $stmh->bindValue(':fname', $fname, PDO::PARAM_STR); 72 $stmh->bindValue(':extension', $extension, PDO::PARAM_STR); 73 $stmh->bindValue(':raw_data', $raw_data, PDO::PARAM_STR); 74 $stmh->execute(); 75 //終了 76 $pdo->commit(); 77 //print"データを".$stmh->rowCount()."件、挿入しました。<br>"; 78 79 } catch (PDOException $Exception) { 80 //トランザクションをロールバック(元に戻す) 81 $pdo->rollBack(); 82 print"err:".$Exception->getMessage(); 83 } 84 85 86} 87 88 89//新規投稿処理 90if(isset($_POST['insert']) && $_FILES["upfile"]["name"] == ""){ 91 92 if(!empty($_POST['bdname']) && !empty($_POST['bdcom']) && !empty($_POST['bdpass'])){ 93 try{ 94 //トランザクション開始 95 $pdo->beginTransaction(); 96 //プリペアドステートメント 97 $sql = "INSERT INTO board (bd_name, bd_com, bd_date, bd_pass) VALUES ( 98 :bd_name, :bd_com, :bd_date, :bd_pass)"; 99 $stmh = $pdo->prepare($sql); 100 $stmh->bindValue(':bd_name', $_POST['bdname'], PDO::PARAM_STR); 101 $stmh->bindValue(':bd_com', $_POST['bdcom'], PDO::PARAM_STR); 102 $stmh->bindValue(':bd_date', date('H:i:s'), PDO::PARAM_INT); 103 $stmh->bindValue(':bd_pass', $_POST['bdpass'], PDO::PARAM_INT); 104 $stmh->execute(); 105 //終了 106 $pdo->commit(); 107 //print"データを".$stmh->rowCount()."件、挿入しました。<br>"; 108 109 } catch (PDOException $Exception) { 110 //トランザクションをロールバック(元に戻す) 111 $pdo->rollBack(); 112 print"err:".$Exception->getMessage(); 113 } 114 115 }else{ 116 $errorMessage = "入力されてないフォームがあります。"; 117 } 118} 119 120 121?> 122 123<!--html開始--> 124<!DOCTYPE html> 125<html lang="ja"> 126 <head> 127 <title>簡昜掲示板</title> 128 <meta charset="UTF-8"> 129 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 130 </head> 131 <body> 132 <hr> 133 簡昜掲示板 134 <hr> 135 <div><font color="#0000ff"><?php echo htmlspecialchars($_SESSION["NAME"], ENT_QUOTES); ?>さんようこそ!</font></div> 136 <br> 137 <form method="post" action="" enctype="multipart/form-data"> 138 <hr> 139 新しく投稿する 140 <hr> 141 <div><font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font></div> 142 <div>名前:<br></div> 143 <input type="text" name="bdname" required="required" value="<?php echo htmlspecialchars($_SESSION["NAME"], ENT_QUOTES); ?>"><br> 144 <div>コメント:<br></div> 145 <textarea name="bdcom" required></textarea><br> 146 <div>画像、動画アップロード:<br></div> 147 <input type="file" name="upfile"><br> 148 <div>※画像はjpeg方式,png方式,gif方式に対応。動画はmp4方式のみ対応。<br></div> 149 <br> 150 パスワード:<br> 151 <input type="password" name="bdpass" required="required" maxlength='8' placeholder='8字以内'><br> 152 <br> 153 <input type="hidden" name="insert"> 154 <input type="submit" value="投稿する"><br> 155 </form> 156 <table border="1"> 157 <tbody> 158 <tr> 159 <th>番号</th><th>名前</th><th>コメント</th><th>時間</th><th>画像・動画</th> 160 </tr> 161 <?php 162 $sql="SELECT*FROM board"; 163 $stmh = $pdo->query($sql); 164 while ($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 165 //動画と画像で場合分け 166 $target = $row["fname"]; 167 ?> 168 <tr> 169 170 <td><?= nl2br(h($row['bd_id']));?></td> 171 <td><?= nl2br(h($row['bd_name']));?></td> 172 <td><?= nl2br(h($row['bd_com']));?></td> 173 <td><?= nl2br(h($row['bd_date']));?></td> 174 <td> 175 <?php 176 //画像か動画か判断して取り出す。 177 if($row["extension"] == "mp4"){ 178 echo ("<video src=\"import_media.php?target=$target\" width=\"426\" height=\"240\" controls></video>"); 179 } 180 elseif($row["extension"] == "jpeg" || $row["extension"] == "png" || $row["extension"] == "gif"){ 181 echo ("<img src='import_media.php?target=$target'>"); 182 } 183 ?> 184 </td> 185 </tr> 186 <?php 187 } 188 189 ?> 190 </tbody> 191 </table> 192 193 <br> 194 [<a href="login.php">ログインフォームへ</a>]<br> 195 [<a href="logout.php">ログアウトする</a>]<br> 196 </body> 197</html> 198

import_media.php

php

1<?php 2 3/* 4 * To change this license header, choose License Headers in Project Properties. 5 * To change this template file, choose Tools | Templates 6 * and open the template in the editor. 7 */ 8 9//セッション開始 10session_start(); 11//データベース処理読み込み 12require_once("logindb.php"); 13//インスタンス化 14$pdo = db_connect(); 15 16if(isset($_GET["target"]) && $_GET["target"] !== ""){ 17 $target = $_GET["target"]; 18} 19else{ 20 header("Location: Main.php"); 21} 22$MIMETypes = array( 23 'png' => 'image/png', 24 'jpeg' => 'image/jpeg', 25 'gif' => 'image/gif', 26 'mp4' => 'video/mp4' 27); 28try { 29 $pass = ""; 30 $sql = "SELECT * FROM board WHERE fname like :fname"; 31 $stmh = $pdo->prepare($sql); 32 $stmh->bindValue(':fname', $_GET["target"], PDO::PARAM_STR); 33 $stmh->execute(); 34 $row = $stmt -> fetch(PDO::FETCH_ASSOC); 35 header("Content-Type: ".$MIMETypes[$row["extension"]]); 36 echo ($row["raw_data"]); 37} 38catch (PDOException $e) { 39 echo("<p>500 Inertnal Server Error</p>"); 40 exit($e->getMessage()); 41} 42 43?>

イメージ説明

 61番はhtmlではこのようになってました。

html

1<tr> 2 3 <td>61</td> 4 <td>img</td> 5 <td>hogehoge</td> 6 <td>09:49:49</td> 7 <td> 8 <img src='import_media.php?target=/Applications/XAMPP/xamppfiles/temp/php2G6pJn'> </td> 9 </tr>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/04 01:44

(phpソースも大事だけど)画像表示している箇所のナマのhtmlソースを掲載してくれればわかりそうな気がします。
hellommm

2018/06/04 02:31

回答ありがとうございます!Main.phpの下にhtmlのコードがあります!一応そこのtableタグで画像を表示してます。それとは別のhtmlソースでしょうか?
退会済みユーザー

退会済みユーザー

2018/06/04 03:59

webブラウザ上で該当箇所を選択状態にして、右クリックメニューなどからソースを表示とかやれば、なぜリンク切れ状態なのかがわかるはず。そういう意味で、webブラウザが受け取ったhtmlコードを確認して質問文に追加してくれると良いと思います。
hellommm

2018/06/04 04:17

なるほど!わかりました!ありがとうございます!
guest

回答2

0

ベストアンサー

バイナリデータならわざわざリクエスト投げなくても表示できそうなものですが。

php

1echo ("<img src='data:image/{$row["extension"]};base64,{$row["raw_data"]}'>");

もちろん、正しく変換できていたらの話です。
こっちの方が良いかもしれません。

それか、いっそのこと画像バイナリデータを保存せずにアップロードだけにして、
ファイル名やIDと紐付けて通常の画像を表示させるように引っ張ってくるか、ですね。

投稿2018/06/04 02:01

m.ts10806

総合スコア80842

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

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

hellommm

2018/06/19 15:34

ありがとうございます!! $row["raw_data"] = base64_encode($row["raw_data"]); という文を付け、 echo ("<img src='data:image/{$row["extension"]};base64,{$row["raw_data"]}'>"); で表示することができました!
m.ts10806

2018/06/20 04:00

ただ、バイナリデータは見ての通り大量の文字情報をそのままhtmlに放り込むことになるので、沢山画像を表示するような場面には向いていません。 状況次第で使い分けてください。
guest

0

import_media.php?target=xxxを参照していますが、リンクになっていませんよね?
クリックして反応させるならアンカータグをつけて開くようにしてください
またとりあえず見せるならサムネイルをつくっておくとよいでしょう

投稿2018/06/04 01:26

yambejp

総合スコア114740

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問