質問編集履歴
6
全投稿取得できました
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
|
-
|
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
ハートマークに色付きました
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); ?>">♡</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
サンプルデータ追加
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
|
-
|
174
|
+
-- ここにページネーション
|
180
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
(likesテーブル)
|
264
|
-
(membersテーブル)
|
265
|
-
(postsテーブル)
|
266
|
-
|
267
279
|
### 試したこと
|
268
280
|
|
269
281
|
ソースコードの方にも書いていますが、Qiita記事のSQL文ではどの投稿も取得できず、いいね機能を付ける前の元のSQLでは投稿全件取得できています。
|
3
画像を添付
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字超えは送れない
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
|
+
(likesテーブル)
|
266
|
+
(membersテーブル)
|
267
|
+
(postsテーブル)
|
268
|
+
|
262
269
|
### 試したこと
|
263
270
|
|
264
271
|
ソースコードの方にも書いていますが、Qiita記事のSQL文ではどの投稿も取得できず、いいね機能を付ける前の元のSQLでは投稿全件取得できています。
|
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
|
+
「ここがおかしいかも」「これを変えてみたら?」「この情報がわかれば答えられるかも」などでも構いません。回答よろしくお願いします。
|