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

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

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

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

PHP

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Q&A

解決済

3回答

4239閲覧

phpで作るsnsのフォロー機能

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

0グッド

0クリップ

投稿2019/02/20 07:23

編集2019/02/20 07:47

前提・実現したいこと

初投稿です。phpでsnsを作ることを目指して勉強していますが、フォローしたユーザーの投稿だけ表示することを実現したいのですが、ソースコードが分かりません。どうすればいいですか?
ちなみに登録制です。

ちなみに、フォローする時のソースコードは知っています。

該当のソースコード

PHP

1<?php 2session_start(); 3 4 5 6$db_host = 'localhost'; 7$db_name = 'sns'; 8$db_user = 'ユーザー名'; 9$db_pass = 'パスワード'; 10 11// データベースへ接続する 12$link = mysqli_connect( $db_host, $db_user, $db_pass, $db_name ); 13if ( $link !== false ) { 14 15 16 17$tipes = "1"; 18 19 20 21$msg = ''; 22$err_msg = ''; 23 24if ( isset( $_POST['send'] ) === true ) { 25 26$name = $_SESSION["NAME"]; 27$comment = $_POST['comment']; 28$userid = $_SESSION["ID"]; 29 30date_default_timezone_set('Asia/Tokyo'); 31 32$time = date('Y-m-d H:i:s'); 33$tipe = "1"; 34 35if ( $name !== '' && $comment !== '' ) { 36 37 38 39 40//生成する文字数 41$length = 5; 42 43//使用する文字 44$char = '1234567890'; 45 46$charlen = mb_strlen($char); 47$result = ""; 48 49for($i=1;$i<=$length;$i++){ 50 $index = mt_rand(0, $charlen - 1); 51 $result .= mb_substr($char, $index, 1); 52} 53 54echo $result; 55 56 57 58 59//書き込みオリジナルファイル読み込み 60$files=file_get_contents('sample.php'); 61 62//'a'+乱数を生成してファイル名に 63$fileName = "Reply/31".rand(); 64 65//書き込みオリジナルファイルから変更点を置き換える 66$files=str_replace("===1===",$result,$files); 67$files=str_replace("===2===",$name,$files); 68$files=str_replace("===3===",$comment,$files); 69 70//文字コードをUTFに変換 71$files = mb_convert_encoding($files, "UTF-8","AUTO"); 72 73//ファイル名に拡張子を付ける 74$fileName = $fileName. ".php"; 75 76//ファイル生成&書き込み 77$handle = fopen( $fileName, 'w'); 78 79fwrite( $handle, $files); 80fclose( $handle ); 81 82// メッセージ表示 83print $fileName. "を生成しました。<br/>\n"; 84 85 86 87$query = " INSERT INTO board ( " 88. " user_id , " 89. " link , " 90. " type , " 91. " time , " 92. " name , " 93. " comment " 94. " ) VALUES ( " 95. "'" . mysqli_real_escape_string( $link, $userid ) ."', " 96. "'" . mysqli_real_escape_string( $link, $fileName ) ."', " 97. "'" . mysqli_real_escape_string( $link, $tipes ) ."', " 98. "'" . mysqli_real_escape_string( $link, $time ) ."', " 99. "'" . mysqli_real_escape_string( $link, $name ) ."', " 100. "'" . mysqli_real_escape_string( $link, $comment ) . "'" 101." ) "; 102 103$res = mysqli_query( $link, $query ); 104 105if ( $res !== false ) { 106$msg = '書き込みに成功しました'; 107}else{ 108$err_msg = '書き込みに失敗しました'; 109} 110}else{ 111$err_msg = '名前とコメントを記入してください'; 112} 113} 114 115 116 $query = "SELECT id, name, comment, time, link, type, user_icon FROM board WHERE tipe=1"; 117 $res = mysqli_query( $link,$query ); 118 $data = array(); 119 while( $row = mysqli_fetch_assoc( $res ) ) { 120 array_push( $data, $row); 121 } 122 arsort( $data ); 123 124} else { 125 echo "データベースの接続に失敗しました"; 126} 127 128 129 130// データベースへの接続を閉じる 131mysqli_close( $link ); 132 133 134#終了 135$stmt = null; 136$pdo = null; 137 138 139?> 140 141 142<html> 143<head> 144 145<script src="js.js"></script> 146 147<meta name="viewport" content="width=device-width,initial-scale=1.0"> 148<title>書き込み欄</title> 149<link rel="stylesheet" type="text/css" href="./css.css"> 150<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 151</head> 152<body> 153 154 155 156 157 158 159 160<?php 161//ヘッダーのテンプレート 162$foodlink = file_get_contents('./テンプレート/herder.php'); 163echo $foodlink; 164?> 165 166<div id="T1"></div><br><br><br> 167 168 169<div style="padding:10px;border-radius:10px;background:#DBB8FF;"> 170 171 172 <h1>メイン画面</h1> 173 <!-- ユーザーIDにHTMLタグが含まれても良いようにエスケープする --> 174 <p>ようこそ<u><?php 175 176 if (isset($_SESSION["NAME"])) { 177 178 echo htmlspecialchars($_SESSION["NAME"], ENT_QUOTES); 179 180 }else{ 181 echo "ゲスト"; 182 183 } 184 ?></u>さん</p> <!-- ユーザー名をechoで表示 --> 185<?php 186// ログイン状態チェック 187if (isset($_SESSION["NAME"])) { 188 189$foodlink = file_get_contents('./テンプレート/user.php'); 190echo $foodlink; 191 192} 193?> 194</div><br> 195 196<div class="kakomi-box4"> 197 198<?php 199// ログイン状態チェック 200if (isset($_SESSION["NAME"])) { 201 202 203 204//投稿フォームテンプレート 205$foodlink = file_get_contents('./テンプレート/post.php'); 206echo $foodlink; 207 208} 209?> 210<!-- ここに、書き込まれたデータを表示する --> 211 212 213 214<?php 215 216 217 218if ( $msg !== '' ) echo '<p>' . $msg . '</p>'; 219if ( $err_msg !== '' ) echo '<p style="color:#f00;">' . $err_msg . '</p>'; 220foreach( $data as $key => $val ){ 221echo '<fieldset style="background:#add6ff; padding:10px; border:none;"><img src="' . $val['user_icon'] . '" alt="50" width="" height="50"><font size="6">' . $val['name'] . '</font><br>' . $val['comment'] . '<br><br><font size="2">' . $val['time'] . '</font>' . '<br><a href="' . $val['link'] . '" target=_blank">返信</a>' . '</fieldset><br>'; 222} 223?> 224 225</div> 226 227 228</body> 229</html>

mysql

1CREATE TABLE follow ( 2 `from_id` TEXT NULL, 3 `to_id` TEXT NULL 4) 5 6CREATE TABLE board ( 7 `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 8 `user_icon` VARCHAR(50) NULL DEFAULT NULL, 9 `user_id` VARCHAR(50) NULL DEFAULT NULL, 10 `name` VARCHAR(50) NULL DEFAULT NULL, 11 `comment` TEXT NULL, 12 `time` TEXT NULL, 13 `type` DECIMAL(10,0) NULL DEFAULT NULL, 14 `link` TEXT NULL 15) 16 17CREATE TABLE userdata ( 18 `id` INT(11) NOT NULL AUTO_INCREMENT, 19 `name` VARCHAR(20) NULL DEFAULT NULL, 20 `user_icon` VARCHAR(50) NULL DEFAULT NULL, 21 `password` VARCHAR(100) NULL DEFAULT NULL 22)

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

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

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

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

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

m.ts10806

2019/02/20 07:31 編集

rinku、tipeってなんでしょう?
m.ts10806

2019/02/20 07:32

本来はlink,typeですかね。 スペルはきちんと書かないと他の人が見たときに意味が分かりませんので、 半端にするくらいならローマ字読みでいいように思います。
退会済みユーザー

退会済みユーザー

2019/02/20 07:35

修正しました。
m.ts10806

2019/02/20 07:36

反映されていないようです。
退会済みユーザー

退会済みユーザー

2019/02/20 07:39

これで反映されたと思います。
m.ts10806

2019/02/20 07:40

ちなみにboardのCREATE TABLEを実行するとエラーが出ます。
m.ts10806

2019/02/20 07:41

たぶん、AUTO_INCREMENTに指定しているのにPKに指定されてないからですね。
退会済みユーザー

退会済みユーザー

2019/02/20 07:41

どういうエラー内容ですか?
m.ts10806

2019/02/20 07:43

Incorrect table definition; there can be only one auto column and it must be defined as a key idをPrimary Keyに指定するところまでCREATE文に含まれた方が良いです。
Nrkw38

2019/02/20 07:44

私もそう思います。 boardのidのコラムを `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEYにしたらいけると思います。
退会済みユーザー

退会済みユーザー

2019/02/20 07:47

どうやらコピペミスだったようです。修正しました。
m.ts10806

2019/02/20 08:08

細かい指摘で申し訳ないですが、userdata の方もですね。 ※先立ってCREATEできた前提で回答しています。
guest

回答3

0

たぶんこういうSQLになるのではないかなと。

SQL

1SELECT 2 * 3 FROM 4 board 5 WHERE 6 type = 1 and 7 ( 8 user_id in ( 9 select to_id from follow where from_id = {ログインユーザのID} 10 ) 11 or user_id = {ログインユーザのID} 12 )

※勝手に「フォローしているユーザと自分の」という意味合いにしました。

細かい指摘:DBの最適化という意味
NULL DEFAULT NULLに指定されているカラムが多くありますが大丈夫ですか?
箱がそうである以上は、空が何かで送信された際に空で入ってしまいます。
必須なのであればNOT NULLにすべきですね。

time をtextにしていますが、Y-m-d H:i:sで入るならdatetimeか、timestampが妥当ではないでしょうか。
桁数も決まってますし。

boardのname,user_icon
$_SESSION["NAME"]から取得しているということはログインユーザーのnameということですよね?
user_iconの方にいたっては登録されるようになっていませんが、表示するようになっています。
入力があるわけではないのでしたら、userdataから取得しては如何でしょうか?

上記を加味するとこんな感じ

sql

1SELECT 2 b.id, 3 b.comment, 4 b.time, 5 b.link, b.type, 6 ud.name as user_name, 7 ud.user_icon 8FROM 9 board b 10 inner join userdata ud on ud.id=b.user_id 11 WHERE 12 b.type = 1 and 13 ( 14 b.user_id in ( 15 select to_id from follow where from_id = {ログインユーザのID} 16 ) 17 or b.user_id = {ログインユーザのID} 18 )

投稿2019/02/20 07:59

編集2019/02/20 08:11
m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2019/02/20 08:16

$query = "SELECT * FROM `board` WHERE type = 1 and ( user_id in ( select to_id from follow where from_id = '" . $_SESSION["ID"] . "' ) or user_id = '" . $_SESSION["ID"] . "' )"; $res = mysqli_query( $link,$query ); $data = array(); while( $row = mysqli_fetch_assoc( $res ) ) { array_push( $data, $row); } arsort( $data ); こんなかんじにしましたが、Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp2\htdocs\TalkEX\post.php on line 165 と出ました。
m.ts10806

2019/02/20 08:29

SQLとエラーは無関係です。 これは元バグにあたります。 Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given > mysqli_fetch_assoc()はパラメータ1がmysqli_resultであることを想定しています。 http://php.net/manual/ja/mysqli.query.php >失敗した場合に FALSE を返します。 SELECT, SHOW, DESCRIBE あるいは EXPLAIN が成功した場合は、mysqli_query() は mysqli_result オブジェクトを返します。それ以外のクエリが成功した場合は、 mysqli_query() は TRUE を返します。 つまりmysqli_query()の結果がfalseである、ということですね。 $resがfalseでないときだけmysqli_fetch_assoc()を実行するように修正する必要がありますし、 その前に、MySQLに直接ログインして実行されるであろうSQLを実行してみてください。 質問に提示されているCREATE文を修正されたみたいですが、 実際の環境は対応済みですか?もし対応済みで無いなら存在しないカラムを指定していることになります(もともとtypeではなくtipeだった) ついでに、 arsort()でするのではなくSQLでorder by かけたほうがいいですね。それだけでPHPの処理が1個減ります。
退会済みユーザー

退会済みユーザー

2019/02/20 08:32

アドバイス通りにやったら、エラーが解消されました。
m.ts10806

2019/02/20 08:33

データベースの正規化とかSQLにorder byつけるとか 他にも色々書いているので確認して、取り入れてみてください。 SQLで出来ることはデータの整形も含めてSQLでやったほうが処理も速くなることが多いです。 (プログラムでは表示だけ書けばいいという感じで)
guest

0

他の人の意見から、フォローした人の質問だけを表示することができました。自分勝手な質問でしたが、ご回答、ありがとうございました。

投稿2019/02/20 09:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/02/20 09:15

重複してしまいました。すみません...
guest

0

ベストアンサー

他の人の意見から、フォローした人の質問だけを表示することができました。自分勝手な質問でしたが、ご回答、ありがとうございました。

投稿2019/02/20 09:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2019/02/20 09:10

私が低評価つけたわけではないですが、これを「自己解決」とするのは無理があるのではないでしょうか?私は特に質問が自分勝手とは思ってませんが解決が自分勝手では「次も何かあったらアドバイスしてみよう」という気が削がれます。 後から同じような問題を抱えた人が見たときに、最初に見るのは回答の評価数とは関係なく「ベストアンサー」となった回答です。 この回答を見たときに参考になる内容でしょうか? ベストアンサーは取り消しが可能です。 ご一考ください。
退会済みユーザー

退会済みユーザー

2019/02/20 09:15

どうやって取り消しますか?
m.ts10806

2019/02/20 09:25

質問したことがないので分からないですが、実際に取り消し→別回答をベストアンサーに は質問者のみ行えるので、もし取り消されたいのでしたら色々やってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問