やっていること。
下の画像のように掲示板を作っている。
名前、コメント、パスワードを入力し、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>
回答2件
あなたの回答
tips
プレビュー