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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

HTML

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

Q&A

1回答

1881閲覧

続き:PHP、MySQL、HTMLを使って、画像、テキストを同時にDB保存とトップページで表示できるブログ風のようなものを作りたい。

mumumoon

総合スコア16

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

HTML

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

0グッド

2クリップ

投稿2018/07/29 10:02

編集2018/08/07 09:04

前回(先週)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>

変更点

imagesのテーブル構造です。

  • なぜ画像が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 } ?>

この2つを追加したところ

このような地獄絵図になりました。


- path部分は(pathについて理解はあまりできていません) ```php //画像の新しい名前 テキストに入力する部分 $new_name = $_FILES['upfile']['name']; // 保存作ファイルパス  $destination = sprintf('/%s/%s' , "Users/・・・/Blog/upfiles" , $new_name );

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

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

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

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

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

k-fukuda

2018/07/30 07:07

データーベース(テーブル)の構造も載せたほうが良いかと思います。おそらくカラムの制約に引っかかる値をinsertしようとしています。
namda

2018/08/02 07:13

$row['path']には具体的にどんなpathが入っていますか?保存場所と公開場所があってないと表示できません。
mumumoon

2018/08/02 09:52

$row['path']には、 $destination = sprintf("/%s/%s", "Users/…/Blog/upfiles", $new_name ); が出力されます。ただ、日本語のファイル名.pngは表示されない状態です。
guest

回答1

0

php

1 <?php echo '<img src="'.$row['path'];?> 2// ↑が足りない

php

1 <?php foreach ($result as $row) { ?> 2 <div class="iamges"> 3 <img src="<?php echo str_replace(’Users/.../, ’’, $row['path']);?>" /> 4 </div> 5 <?php } ?> 6

タグがオカシイですね。下のように直せば動くと思います。
ただ乗せてるスクリーンショットからは挙動が異なるようにおもいます。
それでも駄目な場合は $row['path'] の出力値を実装コードでは無く具体値(パスの途中はぼかしていいので)をお願いします。

投稿2018/08/02 10:18

編集2018/08/07 13:53
namda

総合スコア705

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

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

mumumoon

2018/08/03 02:39

具体値というのがこれであっているのかわかりませんが、DB上に入っている値は/Users/.../Blog/upfiles/Gomi.pngという感じになっています。
namda

2018/08/07 09:22

その場合、画像をがhttp://サイトのドメイン/Users/.../Blog/upfiles/Gomi.pngで見れないと表示できません。 表示できますか?
mumumoon

2018/08/07 09:50

表示できませんでした。 この部分がどうなっていると表示ができるのでしょうか。
namda

2018/08/07 10:03

画像のあるパスとphpを公開しているパスはどこまで共通のパスですか? 例えば /Users/.../Blog/blog.php であり URLはhttp://サイトのドメイン/Blog/blog.php なら 画像のsrcは/Blog/upfiles/Gomi.pngになければなりません。
namda

2018/08/07 13:51

であれば表示するときにDBから取得した値( `$row['path']` )から `Users/.../` を削除するようにすると動くと思います。 この場合 `str_replace(’Users/.../’, ’’, $row['path'])` で動きそうな気がします。 だめなら出力されたソースを見て微調整してください。
退会済みユーザー

退会済みユーザー

2018/08/07 13:54

参考サイトと同じように保存しておけば、何の苦労もしないはずですけど。
m.ts10806

2018/08/07 22:23

「画像がBlog/upfiles/配下にある」というルール付けであればDBにはファイル名だけ保存された方が無駄なリソース使わずに済むと思います。 保存場所変えたときにDBの情報まで変えなきゃいけなくなりますし。
namda

2018/08/08 03:18

それ言い始めるとDB管理じゃなくてディレクトリ一覧でよくね?なりますよ…
退会済みユーザー

退会済みユーザー

2018/08/08 03:22 編集

namda さん 参考サイト自分が書いた記事なんだけど、質問者さん、自ら改悪して自分でハマってるんですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問