前回(先週)PHP MySQL HTML を使ってブログ風のものを作っています。の続きです。
マニュアルを見ながらやっていますが、理解が中々難しくまた、躓いているので質問させていただきます。
質問の答えから教えていただいた
[PHP]ファイルアップロードサンプル(PHP → DB → HTML)
をもとに考えながら行っていましたが、画像をDBに保存できることもあったのに、急にできなくなったり
指摘を受けたコメントを表示させる部分でforループの中でSQLを実行するのはNGということなので、JOINを使って繋いでみましたが、
表示の部分でDBから引っ張ってきて表示をするのに配列を組むべきなんだろうということはなんとなくわかったのですが、まだうまく書けずです。
画像も同じように記事に紐付けでをSQL文で、繋げて表示をするということをするべきということはなんとなくわかりましたが、コメントを表示させるのができないので、わかっていません。
知りたいこと
・なぜ画像がDBに保存できなきなくなるのか。
- DBの紐付けた部分をどのように表示をすれば良いのか。コードも含め。
- 1つの記事に複数のコメント、1つの画像の付け方
初心者で勉強不足なのはわかっており、今は今までのコピペ文を読み解くようなことをしています。
何卒ご質問をお答えいただけると幸いです。
php
1<記事投稿PHP> 2<?php 3 4//ファイルのアップロード部分 5 function file_upload() 6 { 7 // POSTではないとき何もしない 8 if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') { 9 return; 10 } 11 12 13 // アップロードファイル 14 $upfile = $_FILES['upfile']; 15 16 if (!$upfile['error'] > 0) { 17 throw new Exception('ファイルアップロードに失敗しました。'); 18 }else{ 19 20 21 22 $tmp_name = $upfile['tmp_name']; 23 //$tmp_name = $_FILES['upfile']['tmp_name']; 24 25 // ファイルタイプチェック 26 $finfo = finfo_open(FILEINFO_MIME_TYPE); 27 $mimetype = finfo_file($finfo, $tmp_name); 28 29 // 許可するMIMETYPE 30 $allowed_types = [ 31 'jpg' => 'image/jpeg' 32 , 'png' => 'image/png' 33 , 'gif' => 'image/gif' 34 ]; 35 if (!in_array($mimetype, $allowed_types)) { 36 throw new Exception('許可されていないファイルタイプです。'); 37 } 38 39 // ファイル名(ハッシュ値でファイル名を決定するため、同一ファイルは同盟で上書きされる) 40 $filename = sha1_file($tmp_name); 41 42 // 拡張子 43 $ext = array_search($mimetype, $allowed_types); 44 45 46 //画像の新しい名前 テキストに入力する部分 47 $new_name = $_FILES['upfile']['name']; 48 49 // 保存作ファイルパス 50 $destination = sprintf('/%s/%s' 51 , "Users/・・・/Blog/upfiles" 52 , $new_name 53 ); 54 55 56 // アップロードディレクトリに移動 57 if (!move_uploaded_file($tmp_name, $destination)) { 58 throw new Exception('ファイルの保存に失敗しました。'); 59} 60 61 // Exif 情報の削除 62 $imagick = new Imagick($destination); 63 $imagick->stripimage(); 64 $imagick->writeimage($destination); 65 66 67 // データベースに登録 68 $sql = 'INSERT INTO `images` (`id`, `path`) VALUES (NULL, :path) '; 69 $arr = []; 70 $arr[':path'] = $destination; 71 $lastInsertId = insert($sql, $arr); 72 73 // 成功時にページを移動する 74 header(sprintf('Location: User_TopPage.php', $lastInsertId)); 75 76 } 77 78 79 // ファイルアップロード 80 file_upload(); 81} 82} catch (Exception $e) { 83 $error = $e->getMessage(); 84} 85 86 87 88 89//タイトルと本文部分 90if(isset($_POST['submit'])){ 91 echo ''; 92 93 $title = $_POST['title']; 94 $content = $_POST['content']; 95 96 if (!$title) $error .= 'タイトルがありません。<br>'; 97 if (mb_strlen($title) > 80) $error .= 'タイトルが長すぎます。<br>'; 98 if (!$content) $error .= '本文がありません。<br>'; 99 100 if (!$error) { 101 $pdo = new PDO("mysql:dbname=blog", "root","..."); 102 $st = $pdo->query("INSERT INTO post(title,content) VALUES('$title','$content')"); 103 104 105 header('Location: User_TopPage.php'); 106 exit(); 107 } 108 } 109?> 110 111 112<!DOCTYPE html> 113<html lang="ja"> 114 <head> 115 <meta charset="utf-8"> 116 <title>記事投稿</title> 117 <link rel="stylesheet" href="blog.css"> 118 </head> 119<body> 120 <form method="post" action=""enctype="multipart/form-data"> 121 <div class="posting"> 122 <h2>記事投稿</h2> 123 <p>題名</p> 124 <p><input name="title" type="text" size="40"></p> 125 <p>本文</p> 126 <p><textarea name="content" rows="8" cols="40"></textarea></p> 127 <p><label for="upfile">画像ファイル</label> 128 <input type="file" name="upfile" id="upfile" /></p> 129 <input name="submit" type="submit" value="投稿"> 130 </form> 131 <p><input type="button" onclick="window.history.back('http://localhost/Blog/User_TopPage.php');" value="戻る"></p> 132 <p><?php echo $error ?></p> 133 </div> 134</body> 135</html>
PHP
1<User_TopPage> 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6<meta charset="UTF-8"> 7<title>TEST Blog</title> 8<link rel="stylesheet" type="text/css" href="blog.css"> 9</head> 10<body> 11 <a href="User_TopPage.php"><label class="toptest"><h1>TEST Blog</h1></label></a> 12<a href="t_post.php"><label class="contentTop"><h4>記事作成</h4></label></a> 13<a href="Logout.php"><label class="Logout"><h5>ログアウト</h5></label></a> 14 15</body> 16</html> 17 18<?php 19 $pdo = new PDO("mysql:dbname=blog", "root","...",[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); 20 21 22 //tableの全部(*)を記事番号の大きい順、すなわち新しい記事から順番に並び替えられる 23 //fetchAllメソッドは、全てのレコードを配列として返します。$posts[0]に最も新しい記事、$posts[1]に次の記事…と順番に入ります 24 $stmt = $pdo->prepare("SELECT * FROM post ORDER BY no DESC"); 25 $stmt->execute(); 26 $posts = $stmt->fetchAll(); 27 28 29$sql = 30"CREATE VIEW 31 blogview 32 ( 33 no, 34 title, 35 content, 36 time, 37 path, 38 name, 39 comment 40 41 ) 42AS 43 SELECT 44 post.no, 45 post.title, 46 post.content, 47 post.time, 48 images.path, 49 comment.name, 50 comment.comment 51 FROM 52 post AS post 53 LEFT JOIN 54 comment AS comment 55 ON 56 post.no = comment.post_no 57 LEFT JOIN 58 images AS images 59 ON 60 post.time = images.time" 61 ; 62 63 64 65 $blogview['comments'] = $stmt->fetchAll(); 66 $stmt->execute(); 67 68$sql = 'SELECT `no`, `path` FROM `blogview`ORDER BY no DESC'; 69$result = $pdo->query($sql); 70 71 72 //for ループの中でSQLを実行するのはNGです。JOINを使ってテーブルを連結し、SQLの発行回数を一回で住むようにしよう (質問部分) 73 // for ($i = 0; $i < count($posts); $i++) { 74 // $st = $pdo->query("SELECT * FROM comment WHERE post_no={$posts[$i]['no']} ORDER BY no DESC"); 75 // $posts[$i]['comments'] = $st->fetchAll(); 76 // } 77 78 79 require 't_index.php';
PHP
1<表示部分> 2 3<?php 4$pdo = new PDO("mysql:dbname=blog", "root","…",[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); 5 ?> 6 7<!DOCTYPE html> 8<html> 9<head> 10<meta charset="UTF-8"> 11<title>TEST Blog</title> 12<link rel="stylesheet" href="blog.css"> 13</head> 14<body> 15<?php foreach ($posts as $post) { ?> 16 <div class="post"> 17 <h2><?php echo $post['title'] ?></h2> 18 <p><?php echo nl2br($post['content']) ?></p> 19 20<!-- image --> 21 <?php foreach ($result as $row) { ?> 22 <div class="iamges"> 23 <?php echo '<img src="'.$row['path'];?> 24 </div> 25 <?php } ?> 26 27<!-- コメント部分 --> 28 <?php foreach ($blogviews['comments'] as $blogview) { ?> 29 <div class="comment"> 30 <h3><?php echo $blogview['name'] ?></h3> 31 <p><?php echo nl2br($blogview['comment']) ?></p> 32 <!-- <p>>?php echo ($) --> 33 </div> 34 <?php } ?> 35 36 <p class="commment_link"> 37 投稿日:<?php echo $post['time'] ?> 38 <a href="comment.php?no=<?php echo $post['no'] ?>">コメント</a> 39 </p> 40 </div> 41<?php } ?> 42</body> 43 44</html>
変更点
- なぜ画像がDBに保存できなきなくなるのか。 はもう一度書き直したところ、Permissionエラーが出たので、ファイルの権限を変えたらDB内に保存できるようになりました。
###変更点2
CREATE viewで作成したものです。
これを使ってコメントと画像を上手くtitle,conetnt を使って表示させようとしているところです。
User_TopPageの部分に
PHP
1$blogview['comments'] = $stmt->fetchAll(); 2 $stmt->execute(); 3 4$sql = 'SELECT `no`, `path` FROM `blogview`ORDER BY no DESC'; 5$result = $pdo->query($sql); 6
表示部分のところにimgタグを入れました。
PHP
1 <?php foreach ($result as $row) { ?> 2 <div class="iamges"> 3 <?php echo '<img src="'.$row['path'];?> 4 </div> 5 <?php } ?>
- path部分は(pathについて理解はあまりできていません) ```php //画像の新しい名前 テキストに入力する部分 $new_name = $_FILES['upfile']['name']; // 保存作ファイルパス $destination = sprintf('/%s/%s' , "Users/・・・/Blog/upfiles" , $new_name );