PHP+SQLiteでTwitterのようなアプリをつくる(1)の続きです。前回はログイン機能を実装したので、今回は投稿してその投稿を表示させる機能を実装します。

投稿されたデータ用のテーブルを定義する

投稿されたデータ用のテーブルを定義する関数を定義します。リツイートや返信ではない投稿の場合、rt_targetとreply_targetはそれぞれ-1を設定します。

functions.php

データベースに投稿を保存する

投稿されたときに、その投稿をデータベースに保存する関数を示します。

テーブルが生成されていないかもしれないのでその場合は生成します。ログインされた状態でない場合やPOSTされたデータのなかに’text’が存在しない場合は、なにもしません。

投稿にアップロードされたファイルがあるかもしれないので、アップロードが成功した場合は画像を表示するためのHTMLタグを生成していっしょにデータベースに保存します。また投稿された文字列のなかにはおかしなスクリプトが混入しているかもしれないのでエスケープ処理をおこないます(世の中、善人ばかりではありません)。

そしてSQLインジェクション攻撃に備えてプリペアドステートメントを使います。繰り返しになりますが、世の中にいる人は善人ばかりではありません。

functions.php

表示するために必要な自作関数

データベースに保存されているリツイート数を更新する関数をしめします。プライマリキーが第二引数のものを変更します。第三引数がtrueなら1増加、falseなら1減少です。

functions.php

GetUserNameFromUserID関数はユーザーIDからユーザー名を返します。

GetUserIDFromArticleID関数は投稿のプライマリキーから投稿者のユーザーIDを取得します。

GetReplyCount関数は投稿のプライマリキーから返信の数を取得します。

GetRowFromArticleID関数は引数で渡された値とプライマリキーが一致する投稿のレコードを返します。

投稿を表示させる

ShowArticle関数は投稿をページ上に表示します。

表示させるのは投稿者名、投稿された文字列、アップロードされた画像ファイル、投稿の種類(「RT」か「返信」か普通の投稿か?)、「いいね」「RT」「返信」「削除」ボタンです。また投稿が「RT」や「返信」の場合はその対象がなにかもわかるようにいっしょに表示させます。

投稿がRTである場合、RT元も表示させます。ただしRT元がすでに投稿者によって削除されている可能性もあるので、対象が存在するかどうかで処理を切り分けています。

ShowReplyTarget関数は投稿が返信である場合、返信元を表示する処理をおこないます。

投稿の下に「いいね」「削除」などのボタンを表示する処理を示します。RTと返信の数もすでに示した関数で取得していっしょに表示させています。

DoesFaborite関数は現在ログインしているユーザーがその記事をいいねしているかどうかを返します(後述)。そしてその結果によってボタンの表示色を変えます。「削除」ボタンは現在ログインしているユーザーによる投稿でないと表示されません。

ボタンをクリックしたらその処理をするページへ遷移したりJavaScriptの関数が呼び出されます。このときの引数も表示させています。

すべてのユーザーのすべての投稿を表示する処理を示します。

特定のユーザーのすべての投稿を表示する処理を示します。

特定の投稿に対するすべての返信を表示する処理を示します。

ShowArticles関数はユーザーが現在アクセスしているページによって適切なかたちで投稿を表示します。

/?user=XX なら新規投稿用のフォームそのユーザーのすべての投稿を
/?article=XX ならその投稿と返信用のフォームとそれに対するすべての返信を
/?rt=XX ならその投稿とRT用のフォームを
/?delete=XX ならその投稿と削除用のボタンを
/ のあとになにもつかない場合は新規投稿用のフォームとすべてのユーザーのすべての投稿を表示させます。

require_once(‘new-form.php’);としていますが、new-form.phpの内容は後述します。

ShowContents関数はページにコンテンツを表示します。

ShowHeader関数はページ上部にログインしているかどうか? ログイン、ログアウト用のリンクを表示させる関数です。

index.php

トップページにアクセスしたら投稿が表示されます。index.phpは以下のようにします。

index.php

style.css

JavaScript部分

画像をアップロードしようとしているときにどんな画像なのか表示する処理と、いいねをクリックしたときの処理をおこなっています。いいねに関する処理の詳細は次回にします。

new-form.php

投稿用のフォームを表示するために必要な部分です。一応、字数制限しています。

new-form.php

投稿ボタンがクリックされたときの処理

投稿ボタンがクリックされたらnew-post.phpへポストされます。引数を適切に処理して

new-post.php