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

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

DB作成しました。前回の予定では下記のとおりですが、

<アカウント用のテーブル>
ID(主キー)
パスワード(※要暗号化)
オレ専用RSSのURL
メールアドレス(※要暗号化)
メールを送るかどうかのフラグ
メールを送る時間帯

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


とりあえず、アカウント用のテーブルから作ってみました。
mysql> create database db_webprogrammer;
Query OK, 1 row affected (0.02 sec)

mysql> use db_webprogrammer;
Database changed

mysql> create table tbl_user(
-> ID integer not null auto_increment primary key,
-> PASSWORD text not null default '',
-> MYRSS text default '',
-> MAIL text not null default '',
-> MAILFLAG tinyint default 0,
-> MAILTIME tinyint default 0,
-> NAME varchar(64) not null default '');
Query OK, 0 rows affected, 3 warnings (0.28 sec)

mysql> insert into tbl_user(PASSWORD, MYRSS, MAIL, MAILFLAG, MAILTIME, NAME) values
-> ('NmZjYzA0OTcxMTdlOGI4YzY4MWEzNDUxYzk0YjQ1NDI=',
-> 'http://xxxxxxxxxxxxx.com/webprogramer.rss',
-> 'NjA3ODk2NTEyNDU0ZTMzMjQwM2QwODdlMTIzYzIyZTY=',
-> 0,
-> 13,
-> 'webprogrammer');
Query OK, 1 row affected (0.04 sec)

テーブル名は、「tbl_user」にしました。
NAMEのカラムを追加してます。これは、半角英数のみにして、オレ専用RSSのURLに使いたいと考えてます。

ついでに、テスト用のアカウント作っておきました。

いまのところ、ドメイン取得してないので誰もアクセス出来ないんですが、
動くようになってきたら、ドメイン取得して公開したいと思ってまーす。

PHPセッションの使い方

ログイン機能を作る前に、PHPセッションの使い方です。

使うのは、下記の2つ。たった2つ。
session_start
session_destroy

環境によっては、クッキーも使うのでプラスαで3つ。
ini_get
session_get_cookie_params
setcookie

でわ、それぞれの説明。
1.session_start
セッションデータを初期化します。
セッション変数を作成、または復帰させます。
要は、セッション変数を扱うスクリプトの一番最初に呼び出せってことです。

2.session_destroy
セッションに登録されたデータをすべて破棄します。
すでに作成されたセッション変数を初期化します。
使い終わったら初期化するってことです。
ログアウト処理なんかで使うのが一般的な使い方だと思います。

3.ini_get
PHPの設定ファイルから設定された値を取得します。
下の例でわ、session.use_cookiesの値を取得しています。

4.session_get_cookie_params
セッションクッキーのパラメータを取得します。
取得出来るパラメータは以下のとおり。
lifetime クッキーの有効期限
path 情報が保存されている場所のパス
domain クッキーのドメイン
secure セキュアな接続でのみ送信される。
httponly HTTPを通してのみアクセス可能となる。

secureとhttponlyってなんだかよくわかんないですね・・・

5.setcookie
クッキーを送信する
PHPはsessionを使うとcookieも送信するようです。
そのcookieを設定します。
下の例では、送信するcookieを初期化するために使用しています。
例を見ると cookieが送信されていることがわかります。

でわ、sessionを使ったサンプルです。
<body>
<h1>現在のsession変数一覧</h1>
<?php

$t = time();
session_start();
$_SESSION['hoge'] = $t;

echo $t;
?>
を<font color="red">$_SESSION['hoge']</font>に保存しました。<br />
<br />

<a href="session.php">保存されていることを確認する</a>

</body>

index.php
PHPやります!PHPでスクリプト/CGI作ります!

<body>
<h2>保存されているsession変数一覧</h2>
<?php

session_start();
foreach ($_SESSION as $key => $s)
{
echo "[$key] <font color=\"red\">$s</font>\n";
}
?>

<h2>保存されているcookie変数一覧</h2>
<?php
foreach ($_COOKIE as $key => $c)
{
echo "[$key] <font color=\"blue\">$c</font>\n";
}

?>
<br />
<br />

<a href="close.php">session変数を削除する</a>

</body>

session.php
PHPやります!PHPでスクリプト/CGI作ります!



<body>
<h1>session変数を削除しました</h1>
<?php

session_start();

if (ini_get("session.use_cookies"))
{
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}

session_destroy();

?>

<a href="session.php">削除されていることを確認する</a>

</body>

close.php
PHPやります!PHPでスクリプト/CGI作ります!


session.php
PHPやります!PHPでスクリプト/CGI作ります!


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

んぁ。おはようございます。


寝すぎました。別に昨日そんな遅くまで夜更かししてないんだけどなぁ。


今日は、もう少し細かく機能見てみます。
それから、ログイン機能くらい作りたいと思います。

んーと、まず前回思いついたのがコレ↓


・任意のRSSのURLをブラウザからDBに登録できる。
→ブラウザにRSSのURLを入力して、登録ボタン。
 そのURLをDBに登録



・いろんな人が使うことを想定して、アカウント機能(ログインできるタイプ)
 →ログイン機能は、PHPのsession使ってやってみる。
  session使うので、漏れないように「努力」する。
  漏れる可能性は十分にあるので「努力」する。
  ※後で具体的な方法を書きたいな。



・DBに登録したRSSURLは、エクスポートして一つのRSSを出力できるように。(名付けて、オレ専用RSS)
 定期的にオレ専用RSSを自動でエクスポートすれば、リーダーに登録出来るので便利カモ(これも設定によって自動/手動切り替え
 →登録されたURLを一つに結合する処理が必要なので、DOMの知識が必須になってくると思われる。
  PEARのXML_RSSを使って楽しようと考え中。



・指定した時間になったら、メールでRSSの内容を送る。(タイトル/本文)※メールを送信する設定をしていれば送信
 ブラウザを開かなくても、ブログを確認出来るので便利カモ。
 →メール・・・サーバーいじったりしないとダメかも。
  PEAR::Mail
  mb_send_mail
  どっちかでやってみます。




とりあえず、DBの構成ですけど・・・
<アカウント用のテーブル>
ID(主キー)
パスワード(※要暗号化)
オレ専用RSSのURL
メールアドレス(※要暗号化)
メールを送るかどうかのフラグ
メールを送る時間帯

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

RSSからタイトルは取得出来るようなので、テーブルにデータは必要なさそう。
作ってみて必要なカラムがあったら、追加しよっと。

では、次の記事でsessionを使ってログイン出来る機能を作ってみます。

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

やっとここまで来ました。作っていきたいと思います。

なにを作るかなんですけど、5分くらいで思いついたのがブログを簡単に見るヤツです。

えーと、RSSっていう仕組みを使おうと思ってます。ATOMってヤツもあるみたいですね。

まぁ、どっちもXMLみたいなものかな?

やりたいことは、

・任意のRSSのURLをブラウザからDBに登録できる。
・いろんな人が使うことを想定して、アカウント機能(ログインできるタイプ)
・DBに登録したRSSURLは、エクスポートして一つのRSSを出力できるように。(名付けて、オレ専用RSS)
 定期的にオレ専用RSSを自動でエクスポートすれば、リーダーに登録出来るので便利カモ(これも設定によって自動/手動切り替え
・指定した時間になったら、メールでRSSの内容を送る。(タイトル/本文)※メールを送信する設定をしていれば送信
 ブラウザを開かなくても、ブログを確認出来るので便利カモ。


サーバーは、Linux/Apache2.X
DBは、MySQL
言語は、もちろんPHP

ちょっと実現出来るのかわかんないけど、たぶん出来るんじゃないかな?
適当な思いつき設計で進めてみたいと思います。

明日また詳しく考えます。

制御構造2

残りのbreak switch continueです。

1.break文
break文は、主にforやwhileなどのループを抜ける時に使います。
PHPのbreak文が、C言語と違うところはネストしたループ構造を抜ける数を指定することが出来るというところです。

その場合は、
break 3;
のように書きます。
3重のループを一気に抜けることが出来ます。

が、私はあまりオススメしません。
強制的に、いくつものループを抜けることが出来るので強引なカンジがするからです。
同じ理由で、gotoもイヤです。イヤなので説明しません。

$PHPやります!PHPでスクリプト/CGI作ります!



for ($i = 0; $i < 10; $i++)
{
echo $i;
if ($i == 3)
{
break;
}
}

?>
↑の例では、for文で10回ループする予定ですが、
$i が3の時はbreakします。
このfor文では、4回ループして、ループを抜けます。


2.switch文
switch文は、同じ変数の値によって処理を分ける場合に使うのが便利です。
if文でも同じことが出来ますが、switch文は条件によっては簡潔に書くことができます。

例えば、$iが1の場合は、処理1。$iが2の場合は、処理2。それ以外の場合は、処理3。
といった制御をしたい場合は、if文だと↓のようになります。


if ($i == 1)
{
処理1;
}
else if ($if == 2)
{
処理2;
}
else
{
処理3;
}

?>
これをswitch文で、書くと


switch ($i)
{
case 1;
処理1;
break;

case 2;
処理2;
break;

default:
処理3;
}

?>

$PHPやります!PHPでスクリプト/CGI作ります!

switch文の方が見やすいです。(よね・・・)
if文は、条件を複雑にしたい場合。switch文は、条件が簡単な時。
という使い分けをしたいと思います。。。


気をつけないといけないのは、分岐した後の処理が終わったらbreak文でswitch文を抜けることです。
break文を忘れると、次のcase内の処理も行ってしまいます。
意図的にbreakを入れずに、次のcase内の処理をしたい場合もありますが、他の人がコードを見た時に
あれ?break忘れてるじゃん?ってならないように、コメントを入れてあげるのが親切です。
例えば、
//ここは、あえて、breakを入れていません。
とかですね。。

3.continue文
continue文は、主にループ中に使用することで、continue以降の処理をスキップして、次のループに戻すことができます。
主にループ中と言ったのは、PHPでは、switch文でもcontinueが有効に使うことが出来るからです。
使ったことが無いので、やめておきますw(それに一般的ではないと思います。)
20代後半の人が見たらなんじゃ、コリャ~とキレること間違いありません。


for ($i = 0; $i < 10; $i++)
{
if ($i == 3)
{
continue;
}
echo $i;
}

?>
↑のコードを動かすと、

012456789
のような結果を出力します。

「3」がありませんよね。continueで次以降の処理をスキップしてループの先頭に戻ったからです。
$PHPやります!PHPでスクリプト/CGI作ります!


ちなみに、continue文でもbreak文と同じくスキップするループ構造を回数で指定することができます。
これも、20代後半の人が見たらなんじゃ、コリャ~とキレるので、説明しません。

いちおう、動きだけでも・・・

for ($j = 0; $j < 3; $j++)
{

for ($i = 0; $i < 10; $i++)
{
if ($i == 3)
{
continue 2;
}
echo $i;
}

}

?>
↑のコードの出力は、
012012012

となります。

------------------------------------
一応これで、予定してた制御構造終わりました。
ところで、declareというのもあるみたいですね。
よく分らないので、分ったら書いてみます。

読み込み系の命令も、そのうち書きます。(requireなど)