PHPとSQLiteでTwitterのようなアプリをつくります。

データベースの設計

つくるものですが、ユーザー登録しなくても投稿されたものを閲覧することはできるようにします。ユーザー登録をした人であれば、短文を投稿する、自分の投稿を削除する、自分または他人の投稿にいいねする、リツイートする、返信する、このようなことができるものにしようと考えています。

そこでデータベースは

テーブル user
id(プライマリキー)
user_id
user_name
password
prof_text(プロフィールの文章)
prof_image_path(プロフィール画像のパス)
favorites (どの投稿にいいねしたか? articleのidの配列)

テーブル article
id(プライマリキー)
user_id (投稿したユーザーのID)
text
create_at
update_at(更新時刻:投稿を変更する機能を追加する予定はないのでいまのところ必要ないが、あとになって気が変わるかもしれないので)
favo_count(いいねの数)
rt_count(リツイートの数)
rt_target(投稿がリツイートの場合、対象の投稿IDは?)
reply_target(投稿が返信の場合、対象の投稿IDは?)

とすることにします。

またurlはトップページを / とし、article_idを投稿のIDとした場合、

ユーザー登録のページ /signup.php
ログインのページ /login-form.php
ログアウトするためのページ /logout.php

各ユーザーの投稿一覧 /?user=user_id
RT投稿用のページ /?rt=article_id
投稿とそれへの返信の一覧 /?article=article_id
投稿削除確認のページ /?delete=article_id

とします。フォームに入力されたデータをどこへPOSTするかは後述します。

ユーザー登録の実装

ユーザーが新規登録をするためのページを作成します。

PHPはなにもかいていないので拡張子を.phpにする必要はないのですが、事情があって拡張子を.phpにしています。またIDがurlにも使われるのでIDに使用できる文字を半角英数に制限しています。

signup.php

フォームに必要なことを入力して登録ボタンをクリックしたらデータベースにユーザー情報を登録します。この処理はregister.phpでおこないますが、よく使う関数はfunctions.phpで定義して他のファイルからでも呼び出せるようにします。

functions.php

register.php

ためしに登録の実験をしてみると同じユーザーIDで登録しようとしたときに’すでに使用されているIDです。別のIDを指定してください。’というエラーメッセージが表示されます。またユーザーIDに使用できない文字を入力した場合、なにも入力しないで登録ボタンをクリックしたときもその旨を伝えるメッセージが表示されます。

ログイン処理の実装

login-form.phpという名前でファイルを作成して、以下のように書きます。

login-form.php

ログインボタンをクリックしたらlogin.phpへポストされます。

$_POST[‘user_id’]や$_POST[‘password’]が渡されていない場合は不正なリクエストなので処理をおこないません。$_POST[‘user_id’]と$_POST[‘password’]が取得できたら$_POST[‘user_id’]がデータベース内に存在するか調べます。存在する場合はパスワードのハッシュが一致するかを調べます。両方ともOKならログイン成功です。そうでない場合はユーザーIDかパスワードが間違っているのでログインできない旨を表示します。

ログインに成功したら DBのユーザー情報をセッションに保存して、そのユーザーの投稿一覧が表示されるページにリダイレクトさせます。ただしいまの段階では該当するページをつくっていないのでエラーになります(続きをお待ちください)。

login.php

ログイン後とログアウトの処理

ログインした状態でsignup.phpやlogin-form.phpにアクセスしてしまうとユーザー登録やログインのページが表示されてしまいます。これはよくないのでログインした状態でsignup.phpやlogin-form.phpにアクセスした場合はログイン後にリダイレクトされるページにリダイレクトさせます。

signup.phpとlogin-form.phpの冒頭に以下を追加します。これでログイン状態のときにアクセスすると自動的にindex.phpにリダイレクトされます。

ログアウトするためのページを作ります。

logout.php

次回はメインのページを作成します。