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

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

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

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

PHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1450閲覧

もっと見るボタンを押したタイミングで他から投稿された場合の制御方法

ssk

総合スコア332

MySQL

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

PHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2016/06/13 13:00

編集2016/06/13 13:02

実装前なので、コードの情報はありません。
ajaxでパラメータを送って、掲示板を作ろうとしています。

timeline.php
という掲示板のトップページを用意します。

・最初に5件表示
・もっと見るボタンをクリックした時に次の5件を表示(同じ画面で)

とするとき

もっと見るボタンを押したタイミングで他から投稿がされ
DBにレコードが1件追加された場合

最初に表示される5件目の投稿が
もっと見るボタンを押した時の最初の投稿になり
投稿がダブってしまうケースが想定できます。

つまり

ーー最初に表示される5件
投稿1
投稿2
投稿3
投稿4
投稿5

ーーもっと見るボタンを押す(この時に他の人が投稿、レコードが追加される)
投稿5
投稿6
投稿7
投稿8
投稿9

となってしまい、投稿5がダブってしまいます。
これを制御して以下のように表示したいです。

ーーもっと見るボタンを押す(この時に他の人が投稿、レコードが追加される)
投稿6
投稿7
投稿8
投稿9
投稿10

どうすれば良いのでしょうか。

ーサーバサイドー
・timeline_add.php
・timeline_delete.php
・get_timeline.php(初期表示、もっと見る)

パラメータ→limit, offset
init - offset:1 limit:5
more - offset:6 limit:5

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

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

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

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

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

guest

回答1

0

ベストアンサー

少し解りにくかったのですが、例えば投稿日降順などで並べた場合(最新が一番目に来るから)等ということですかね?
上記の例でだと、PHPに5番目のIDも送信してそのIDより投稿日の古いもので絞込み、日付降順でソートして上位5件を取得するなどどうでしょう?

投稿2016/06/13 13:28

編集2016/06/13 13:33
hirohiro

総合スコア2068

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

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

ssk

2016/06/13 13:40

少し解りにくかったのですが、投稿日降順などで並べた場合(最新が一番目に来るから)ということですかね? ↑仰る通りです。 上記の例でだと、PHPに5番目のIDも送信してそのIDより投稿日の古いもので絞込み、日付降順でソートして上位5件を取得するなどどうでしょう? ↑あ、なるほど。たしかにそうすれば解決できそうです。 ありがとうございます。
ssk

2016/06/13 13:50

hirohiro様 申し訳ございません。 上記の例でだと、PHPに5番目のIDも送信してそのIDより投稿日の古いもので絞込み、日付降順でソートして上位5件を取得するなどどうでしょう? ↑こちらでSQL文を発行する時にhirohiro様はどのように書きますか?
hirohiro

2016/06/13 13:58 編集

サブクエリを使って select * from table where datetime < (select datetime from table where id=getvalue) order by datetime desc limit 5 こんな感じでしょうか。 静的なサブクエリなので、負荷はほとんどないと思います。 後注意としては、この方法の場合、投稿日付がユニークでないと問題が出るかも知れません。(時間の最低単位まで一致するレコードが複数あると確定した選択ができないため) でもユニークでなければ、そもそも最初に5件取得する際にその5件でさえ一意にならないということになるので、今回は無視しています。
ssk

2016/06/14 01:58

ありがとうございます。 こちらでやりたいことが実装できそうです。 たしかに時間がユニークでなければ、ダメですね。 その場合は、DBにdatetimeをユニークにと指示するば良いのでしょうか?
hirohiro

2016/06/14 02:40 編集

たとえミリ秒単位で記録しても、バッティングするときはすると思いますし 時間をユニーク指定するとバッティングした際にDBからエラー(警告?)が出て記録できなくなると思います。警告を受けて迂回する(登録を再発行)プログラムにしてもいいですが、時間+IDでユニークレコードを判別するほうが楽かなと思います。 同じ時間に投稿された同じIDの記事は存在しえないと思いますので。 その際のSQLは前回コメントしたものより少し複雑になりますが、その辺りはこの質問の範疇からもずれてくると思いますので考えてみてください。
ssk

2016/06/14 02:20

承知しました。ありがとうございます。 最後にもう1つだけ質問させて下さい。 1-5のレコードの中で削除されたレコードがある場合は、差分が出てしまうかと思うのですが、対処法はありますかね><
hirohiro

2016/06/14 02:52 編集

削除処理がレコードを消滅させる処理の場合は少し複雑になりますね。 上記の例の5番目のIDそのものがなくなっている可能性もあるわけですし。 削除フラグを立てて放置する処理ならば、上記までの方法で対応可能だと思います。 ※もちろんSQLは削除記事を省くように変更する必要はあります ※またいずれレコードごと削除するなら、何ヶ月も表示したまま放置しているブラウザでは問題が出るかも知れません。あまりにも古いならページ更新させるなどしておいた方が良いかも知れませんね。
hirohiro

2016/06/14 02:46 編集

>> 1-5のレコードの中で削除されたレコードがある場合は、差分が これって問題になるのはその時表示中の最後の記事が削除されちゃった場合のみですよね? ※新規に追加記事があっても、表示中の記事がすでに削除されていても、それには頓着せずに表示中のものよりも古い記事を新しいものから5件新たに表示する。といった理解です。
ssk

2016/06/14 02:54

これって問題になるのはその時表示中の最後の記事が削除されちゃった場合のみですよね? →仰る通りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問