PHPやります!PHPでスクリプト/CGI作ります! -7ページ目

【コーディング】ブログを簡単に見るヤツ3

RSSの削除処理より先に、ログインしているのかどうかの判断についてにしようと思います。

というのは、ログイン後の処理については一番最初にログインしているのか判断して、

ログインしていなかったら、トップを表示させようと思ったからなのデース。

この処理が無いと、不正なプログラム(連続で、リクエストを送るような)にいたずらされるような気がして。


で、いま思いつくのはSESSIONにIDを設定して、そのIDがアカウント用テーブルに存在するのかどうか。
存在した場合は、ログイン済みと判断する。

という処理をしようと思ってるんです。


1.SESSIONからIDを取得。IDが設定されていない場合は、ログインしていない

2.IDが設定されている場合は、DBに登録されているか調べる。

3.DBに登録されている場合は、ログインしている

4.DBに登録されていない場合は、不正なアクセス。ログインしていない


実際に書いてみると、

if (isset($_SESSION["id"]))
{
$stmt = $mysqli->prepare("select ID, NAME from tbl_user where MAIL = ?");
if ($stmt)
{
$stmt->bind_param("s", $mailid);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($id, $name);
if ($stmt->fetch())
{
if ($stmt->num_rows > 0)
{
//ログインしている
}
else
{
//ログインしていない
}
}
else
{
//ログインしていない
}

$stmt->free_result();
$stmt->close();
}
else
{
//ログインしていない
}

}

【コーディング】ブログを簡単に見るヤツ2

RSSを登録する処理

この処理では、【オレ専用RSS】に追加したいRSSへのURLをDBに登録します。

まず、RSSURLを入力するフォームが必要です。

必要なパラメータが、RSSURLとID(メールアドレスをハッシュ化+BASE64)です。

1.ログインしているか判断。ログインしていない場合は、ログイン画面へ遷移。

2.パラメータチェック(RSSURLが正しいURL形式になっているか)
  パラメータが不正だった場合は、RSS登録画面を再表示。

3.DBに接続。

4.DBに登録。

5.RSS登録画面を表示する。

使用するSQL
<insert into tbl_rss (ID, RSSURL) values (?,?)>

$stmt->bind_param("ss", $id, $rssurl);


RSS登録画面では、↓を表示する。
・ユーザー名
・RSSURL入力フォーム
・登録済RSS一覧(削除可)
・登録メールアドレス(変更可)
・メールの送信フラグ

次は、RSSの削除処理かしら。

【コーディング】ブログを簡単に見るヤツ1

ということで~、ログインの処理。

まず、ログイン用のフォームを準備します。

ログインに必要な情報は、ID(メールアドレス)とパスワードです。
まず、DBからID/パスワードを取得します。

メールアドレスをキーにパスワードをDBから取得します。

使うSQL
select PASSWORD from tbl_user where MAIL = ?

DBに保存しているメールアドレスとパスワードは、md5でハッシュ化したものをさらにBASE64で符号化したものです。
なので、キーにするメールアドレスもmd5してBASE64かけます。
そのメールアドレスをキーにします。

$stmt->bind_param("s", base64_encode(md5($id)));

DBからパスワードを取得することが出来たら、パスワードが一致しているか確認します。
ここでもDBに保存しているパスワードは、md5+BASE64なので↓の用に比較します。
if (base64_encode(md5($password)) == $dbpass)
{
//一致しているので、ログイン成功処理
$_SESSION["status"] = class_code::SUCCESS;
$_SESSION["id"] = base64_encode(md5($id));

}
else
{
//不一致なので、ログイン失敗処理
$_SESSION["status"] = class_code::ERR_AUTH_LOGIN;
}

この【ブログを簡単に見るヤツ】では、現在のログインの状態をセッションに保存していこうと思ってます。
$_SESSION["status"] ← 処理ステータス
$_SESSION["id"]    ← 誰がログインしているか

【設計】ブログを簡単に見るヤツ4

RSS用のテーブルを作っておきます。

<RSS用のテーブル>
ID
RSSID(主キー)
RSSURL

mysql> create table tbl_rss(
-> RSSID integer not null auto_increment primary key,
-> ID integer not null,
-> RSSURL text not null default ''
);

PHPからMySQLに接続(MySQLi)

PHPからMySQLにアクセスするために、MySQLiを使います。

MySQL改良拡張モジュールということですが、簡単に言うとMySQLに簡単にアクセスするためのクラス群ということにしておきます。

今回使うのは、
mysqli::mysqli()
mysqli::prepare()
mysqli::close()

mysqli_stmt::bind_param()
mysqli_stmt::execute()
mysqli_stmt::store_result()
mysqli_stmt::bind_result()
mysqli_stmt::fetch()
mysqli_stmt::free_result()
mysqli_stmt::close()

です。では簡単に説明。

1.mysqli::mysqli
新規にMySQLサーバへの接続をオープンする。

2.mysqli::prepare
実行するためのSQLステートメントを準備する。

3.mysqli::close
事前にオープンしているデータベース接続を閉じる。


4.mysqli_stmt::bind_param
プリペアdステートメントのパラメータに変数をバインドする。

5.mysqli_stmt::execute
プリペアドクエリを実行する。

6.mysqli_stmt::store_result
プリペアドステートメントから結果を転送する。

7.mysqli_stmt::bind_result
結果を保存するため、プリペアドステートメントに変数をバインドする。

8.mysqli_stmt::fetch
プリペアドステートメントから結果を取得し、バインド変数に格納する。

9.mysqli_stmt::free_result
指定したステートメントハンドルの結果を格納したメモリを開放する。

10.mysqli_stmt::close
プリペアドステートメントを閉じる。


使い方の例

$mysqli = new mysqli("localhost", "ID", "PASSWORD", "db_webprogrammer");
if ($mysqli->connect_error)
{
exit();
}

$stmt = $mysqli->prepare("select NAME from tbl_user where MAIL = ?");
if ($stmt)
{
$stmt->bind_param("s", $mail);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($name);
$stmt->fetch();
$stmt->free_result();
$stmt->close();
}

$mysqli->close();

?>
ほぼ使い方は変わりません。このコードの意味が分かればDBにアクセスするのも難しくないハズです。

次は、セッションと一緒にログイン機能を作ってみます。