teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

全投稿取得できました

2021/08/27 08:07

投稿

halu_0366
halu_0366

スコア1

title CHANGED
File without changes
body CHANGED
@@ -19,6 +19,7 @@
19
19
 
20
20
  // 2,これで何も1件も取得できない Qiitaにあったもの
21
21
  $posts = $db->prepare('SELECT m.name, m.picture, p.*, COUNT(l.post_id) AS like_cnt FROM members m, posts p LEFT JOIN likes l ON p.id=l.post_id WHERE m.id=p.member_id GROUP BY l.post_id ORDER BY p.created DESC LIMIT ?, 5');
22
+ // 8/27追記 ↑このGROUP BY をp.idにしたところ”いいね”有り無しの全投稿取得できました!!
22
23
 
23
24
  // 3,これが元のSQL 全件取得できる 
24
25
  $posts = $db->prepare('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT ?,5');
@@ -171,18 +172,6 @@
171
172
 
172
173
  ```
173
174
  今回の質問にはおそらく影響ないPHP部分
174
- // ログイン出来た人だけこのページに来れる処理
175
- if (isset($_SESSION['id']) && $_SESSION['time'] + 60 * 60 > time()) {
176
- $_SESSION['time'] = time();
177
-
178
- $members = $db->prepare('SELECT * FROM members WHERE id=?');
179
- $members->execute(array($_SESSION['id']));
180
- $member = $members->fetch();
181
- } else {
182
- header('Location: login.php');
183
- exit();
184
- }
185
-
186
175
  // メッセージを登録
187
176
  if (!empty($_POST)) {
188
177
  if ($_POST['message'] !== '') {
@@ -214,9 +203,10 @@
214
203
  $maxPage = ceil($cnt['cnt'] / 5);
215
204
  $page = min($page, $maxPage);
216
205
  $start = ($page - 1) * 5;
206
+ ```
217
207
 
218
208
  ```
219
- ```
209
+ サンプルデータ
220
210
  CREATE TABLE `likes` (
221
211
  `id` int(11) NOT NULL,
222
212
  `post_id` int(11) NOT NULL,
@@ -264,17 +254,19 @@
264
254
  ```
265
255
 
266
256
 
257
+
267
258
  ### 試したこと
268
259
 
269
260
  ソースコードの方にも書いていますが、Qiita記事のSQL文ではどの投稿も取得できず、いいね機能を付ける前の元のSQLでは投稿全件取得できています。
270
261
  QiitaにあったSQL文を試しに「__LEFT JOIN__」を「__RIGHT JOIN__」に変更したところ、”いいね”した投稿だけ取得できハートマークの横に数字の「1」も入りましたので、外部結合は出来たようです。ただ __RIGHT__ で likesテーブル を優先したので”いいね”が付いていない投稿は取得されなかった、という理解です。
271
262
 
272
- ほとんど写しのコードになってしまっていますが、「どのコードで何をしようとしているか」は把握しているつもりです。やはりSQL文に問題があるのでしょうか?
263
+ 「どのコードで何をしようとしているか」は把握しているつもりです。やはりSQL文に問題があるのでしょうか?
273
264
 
274
- 8/26 追記
265
+ 8/26 **追記**
275
266
  「$post['id']はforeach内かな」と思い移動したところハートマークに色付きましたが、まだSQL文が間違っているのか”いいね”有り無しの全件取得はできていません。
267
+ 8/27 **追記**
268
+ 全件取得は解決しました(コード参照)、ハートマークに色も付いて横にいいね数も表示できました。とりあえずは解決です、ありがとうございました。
276
269
 
277
270
  ### 補足情報(FW/ツールのバージョンなど)
278
271
 
279
- PHP7.4.1 MAMP PHPMyAdmin Chromeブラウザ VSCode を使っています。
272
+ PHP7.4.1 MAMP PHPMyAdmin Chromeブラウザ VSCode を使っています。
280
- 「ここがおかしいかも」「これを変えてみたら?」「この情報がわかれば答えられるかも」などでも構いません。回答よろしくお願いします。

5

ハートマークに色付きました

2021/08/27 08:06

投稿

halu_0366
halu_0366

スコア1

title CHANGED
File without changes
body CHANGED
@@ -68,39 +68,10 @@
68
68
  }
69
69
  }
70
70
 
71
- //2-1. ログインしている人がいいねしたメッセージをすべて取得
72
- $like = $db->prepare('SELECT post_id FROM likes WHERE member_id=?');
73
- $like->execute(array($_SESSION['id']));
74
- while ($like_record = $like->fetch()) {
75
- $my_like[] = $like_record;
76
- }
77
-
78
- $my_like_cnt = 0;
79
- if (!empty($my_like)) {
80
- foreach ($my_like as $like_post) {
81
- foreach ($like_post as $like_post_id) {
82
- if ($like_post_id == $post['id']) {
83
- $my_like_cnt = 1;
84
- }
85
- }
86
- }
87
- }
88
71
  ?>
89
72
  ```
90
73
 
91
74
  ```ここに言語名を入力
92
- <!DOCTYPE html>
93
- <html lang="ja">
94
-
95
- <head>
96
- <meta charset="UTF-8">
97
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
98
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
99
- <title>PHPで簡単SNS</title>
100
-
101
- <link rel="stylesheet" href="css/style.css" />
102
- </head>
103
-
104
75
  <body>
105
76
  <div id="wrap">
106
77
  <div id="head">
@@ -146,6 +117,24 @@
146
117
 
147
118
  <div class="msg_footer">
148
119
  <!-- いいね機能をここに書いています -->
120
+         <?php
121
+ //2-1. ログインしている人がいいねしたメッセージをすべて取得 この2つ「$like = ~~」と「$my_like_cnt ~~」を上の大枠phpからこのforeach文の中に入れたらハートマークに色が付いた
122
+ $like = $db->prepare('SELECT post_id FROM likes WHERE member_id=?');
123
+ $like->execute(array($_SESSION['id']));
124
+ while ($like_record = $like->fetch()) {
125
+ $my_like[] = $like_record;
126
+ }
127
+
128
+ $my_like_cnt = 0;
129
+ if (!empty($my_like)) {
130
+ foreach ($my_like as $like_post) {
131
+ foreach ($like_post as $like_post_id) {
132
+ if ($like_post_id == $post['id']) {
133
+ $my_like_cnt = 1;
134
+ }
135
+ }
136
+ }
137
+ }
149
138
  <?php if ($my_like_cnt < 1) : ?>
150
139
  <a class="heart" href="index.php?like=<?php echo h($post['id']); ?>&page=<?php echo h($page); ?>">&#9825;</a>
151
140
  <?php else : ?>
@@ -197,7 +186,6 @@
197
186
  // メッセージを登録
198
187
  if (!empty($_POST)) {
199
188
  if ($_POST['message'] !== '') {
200
- // Sec5-85の修正点 返信できると新規できなくなる問題
201
189
  if ($_POST['reply_post_id'] == '') {
202
190
  $_POST['reply_post_id'] = 0;
203
191
  }
@@ -283,6 +271,9 @@
283
271
 
284
272
  ほとんど写しのコードになってしまっていますが、「どのコードで何をしようとしているか」は把握しているつもりです。やはりSQL文に問題があるのでしょうか?
285
273
 
274
+ 8/26 追記
275
+ 「$post['id']はforeach内かな」と思い移動したところハートマークに色付きましたが、まだSQL文が間違っているのか”いいね”有り無しの全件取得はできていません。
276
+
286
277
  ### 補足情報(FW/ツールのバージョンなど)
287
278
 
288
279
  PHP7.4.1 MAMP PHPMyAdmin Chromeブラウザ VSCode を使っています。

4

サンプルデータ追加

2021/08/26 05:37

投稿

halu_0366
halu_0366

スコア1

title CHANGED
File without changes
body CHANGED
@@ -171,29 +171,8 @@
171
171
  </div>
172
172
  <?php endforeach; ?>
173
173
 
174
-
175
- <ul class="paging">
176
- <?php if ($page > 1) : ?>
177
- <li><a href="index.php?page=<?php print($page - 1); ?>">
178
- << </a>
179
- </li>
174
+    -- ここにページネーション
180
- <?php endif; ?>
175
+
181
-
182
- <?php for ($x = 1; $x <= $maxPage; $x++) : ?>
183
- <li>
184
- <?php if ($x == $_REQUEST['page']) : ?>
185
- <a href="index.php?page=<?php print($x); ?>" class="now_page"><?php print $x; ?></a>
186
- <?php else : ?>
187
- <a href="index.php?page=<?php print($x); ?>"><?php print $x; ?></a>
188
- <?php endif; ?>
189
- </li>
190
- <?php endfor; ?>
191
-
192
- <?php if ($page < $maxPage) : ?>
193
- <li><a href="index.php?page=<?php print($page + 1); ?>"> >> </a></li>
194
- <?php endif; ?>
195
- </ul>
196
-
197
176
  </div>
198
177
  </div>
199
178
  </body>
@@ -248,22 +227,55 @@
248
227
  $page = min($page, $maxPage);
249
228
  $start = ($page - 1) * 5;
250
229
 
230
+ ```
231
+ ```
251
- // 返信処理
232
+ CREATE TABLE `likes` (
233
+ `id` int(11) NOT NULL,
234
+ `post_id` int(11) NOT NULL,
235
+ `member_id` int(11) NOT NULL,
236
+ `created` datetime NOT NULL,
237
+ `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
252
- if (isset($_REQUEST['res'])) {
238
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
253
- $response = $db->prepare('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id AND p.id=?');
254
- $response->execute(array($_REQUEST['res']));
255
239
 
256
- $table = $response->fetch();
240
+ INSERT INTO `likes` (`id`, `post_id`, `member_id`, `created`, `modified`) VALUES
241
+ (11, 19, 1, '2021-08-24 23:51:11', '2021-08-24 14:51:11'),
257
- $message = '@' . $table['name'] . ' ' . $table['message'];
242
+ (15, 14, 1, '2021-08-25 09:32:31', '2021-08-25 00:32:31'),
258
- }
259
243
 
244
+
245
+
246
+ CREATE TABLE `members` (
247
+ `id` int(11) NOT NULL,
248
+ `name` varchar(255) NOT NULL,
249
+ `email` varchar(255) NOT NULL,
250
+ `password` varchar(100) NOT NULL,
251
+ `picture` varchar(255) NOT NULL,
252
+ `introduce` varchar(200) NOT NULL,
253
+ `created` datetime NOT NULL,
254
+ `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
255
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
256
+
257
+ INSERT INTO `members` (`id`, `name`, `email`, `password`, `picture`, `introduce`, `created`, `modified`) VALUES
258
+ (1, 'sakura', 'sakura-example@gmail.com', '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', '20210823233156atom.jpg', '初めまして、sakuraです。プログラミング勉強中です。自己紹介文をupdate.phpから編集できるようになりました。日々なんとか成長中', '2021-08-17 13:54:57', '2021-08-23 14:31:56'),
259
+ (2, 'wakaba', 'wakaba-example@yahoo.ne.jp', '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', '20210821103031animals.jpg', 'どうも、神奈川の大学通ってる学生です。趣味は登山です。', '2021-08-17 21:41:43', '2021-08-21 01:30:31'),
260
+
261
+
262
+ CREATE TABLE `posts` (
263
+ `id` int(11) NOT NULL,
264
+ `message` text NOT NULL,
265
+ `member_id` int(11) NOT NULL,
266
+ `reply_message_id` int(11) NOT NULL DEFAULT '0',
267
+ `created` datetime NOT NULL,
268
+ `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
269
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
270
+
271
+ INSERT INTO `posts` (`id`, `message`, `member_id`, `reply_message_id`, `created`, `modified`) VALUES
272
+ (3, '一覧を作りました。', 1, 0, '2021-08-17 16:30:47', '2021-08-17 07:30:47'),
273
+ (4, '初めまして、よろしくお願いします。', 2, 0, '2021-08-17 21:42:13', '2021-08-17 12:42:13'),
274
+ (5, '返信機能のため、投稿', 2, 0, '2021-08-17 21:42:31', '2021-08-17 12:42:31'),
275
+ (6, 'もう一つ増やします', 2, 0, '2021-08-17 21:42:46', '2021-08-17 12:42:46'),
260
276
  ```
261
277
 
262
278
 
263
- ![![イメージ説明](a77929724bd0177e46948832afbb2986.jpeg)(likesテーブル)
264
- ![イメージ説明](31e36750f794de7a41fb92e456ac1f12.jpeg)(membersテーブル)
265
- ![イメージ説明](220d92dfbd4930830908b9efef904cef.jpeg)(postsテーブル)
266
-
267
279
  ### 試したこと
268
280
 
269
281
  ソースコードの方にも書いていますが、Qiita記事のSQL文ではどの投稿も取得できず、いいね機能を付ける前の元のSQLでは投稿全件取得できています。

3

画像を添付

2021/08/26 02:51

投稿

halu_0366
halu_0366

スコア1

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,4 @@
1
- ```ここに言語を入力
2
- コード
3
- ```### 前提・実現したいこと
1
+ ### 前提・実現したいこと
4
2
  PHPでいいね機能を作っています。データベースと連携し、ハートマークをクリックして”いいね”の付け外しまでは既にできていますが、全投稿を取得し”いいね”が付いた投稿にはTwitterのようにハートマーク横に数字を表示する段階で躓いています。
5
3
  Qiitaの[こちらの記事](https://qiita.com/y0shihiro/items/c8530aba3543203a10a0#2-3-%E3%81%84%E3%81%84%E3%81%AD%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%88%E8%A1%A8%E7%A4%BA%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B)を参考に作っていますが、投稿取得のSQLの書き方でうまくいっていないようです。ソースコードの方にその比較を書いています。
6
4
  members,posts,likesの3つのテーブルを使っています。

2

SQLのデータをエクスポートで追加したいが10000字超えは送れない

2021/08/25 13:05

投稿

halu_0366
halu_0366

スコア1

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,6 @@
1
+ ```ここに言語を入力
2
+ コード
1
- ### 前提・実現したいこと
3
+ ```### 前提・実現したいこと
2
4
  PHPでいいね機能を作っています。データベースと連携し、ハートマークをクリックして”いいね”の付け外しまでは既にできていますが、全投稿を取得し”いいね”が付いた投稿にはTwitterのようにハートマーク横に数字を表示する段階で躓いています。
3
5
  Qiitaの[こちらの記事](https://qiita.com/y0shihiro/items/c8530aba3543203a10a0#2-3-%E3%81%84%E3%81%84%E3%81%AD%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%88%E8%A1%A8%E7%A4%BA%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B)を参考に作っていますが、投稿取得のSQLの書き方でうまくいっていないようです。ソースコードの方にその比較を書いています。
4
6
  members,posts,likesの3つのテーブルを使っています。
@@ -14,13 +16,13 @@
14
16
  require('function.php');
15
17
 
16
18
 
17
- // これでいいねが付いてる投稿だけ取得
19
+ // 1,これでいいねが付いてる投稿だけ取得
18
20
  $posts = $db->prepare('SELECT m.name, m.picture, p.*, COUNT(l.post_id) AS like_cnt FROM members m, posts p, likes l WHERE m.id=p.member_id AND p.id=l.post_id GROUP BY l.post_id ORDER BY p.created DESC LIMIT ?, 5');
19
21
 
20
- // これで何も1件も取得できない Qiitaにあったもの
22
+ // 2,これで何も1件も取得できない Qiitaにあったもの
21
23
  $posts = $db->prepare('SELECT m.name, m.picture, p.*, COUNT(l.post_id) AS like_cnt FROM members m, posts p LEFT JOIN likes l ON p.id=l.post_id WHERE m.id=p.member_id GROUP BY l.post_id ORDER BY p.created DESC LIMIT ?, 5');
22
24
 
23
- // これが元のSQL 全件取得できる 
25
+ // 3,これが元のSQL 全件取得できる 
24
26
  $posts = $db->prepare('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT ?,5');
25
27
 
26
28
  $posts->bindParam(1, $start, PDO::PARAM_INT);
@@ -259,6 +261,11 @@
259
261
 
260
262
  ```
261
263
 
264
+
265
+ ![![イメージ説明](a77929724bd0177e46948832afbb2986.jpeg)(likesテーブル)
266
+ ![イメージ説明](31e36750f794de7a41fb92e456ac1f12.jpeg)(membersテーブル)
267
+ ![イメージ説明](220d92dfbd4930830908b9efef904cef.jpeg)(postsテーブル)
268
+
262
269
  ### 試したこと
263
270
 
264
271
  ソースコードの方にも書いていますが、Qiita記事のSQL文ではどの投稿も取得できず、いいね機能を付ける前の元のSQLでは投稿全件取得できています。

1

レンタルサーバーなどの本番環境ではなくローカル環境で実装中です

2021/08/25 13:04

投稿

halu_0366
halu_0366

スコア1

title CHANGED
File without changes
body CHANGED
@@ -268,4 +268,5 @@
268
268
 
269
269
  ### 補足情報(FW/ツールのバージョンなど)
270
270
 
271
- PHP7.4.1 MAMP PHPMyAdmin Chromeブラウザ VSCode を使っています。
271
+ PHP7.4.1 MAMP PHPMyAdmin Chromeブラウザ VSCode を使っています。
272
+ 「ここがおかしいかも」「これを変えてみたら?」「この情報がわかれば答えられるかも」などでも構いません。回答よろしくお願いします。