ダウンロード sample.zip (14.7 KB)
PHPでのセッション管理
PHPでのセッション管理は1)クッキーを使う方式、2)内部リンクのURLの後ろに引数としてセッションIDを付与する方式(URL埋め込み方式)の2通りあります。
前述のとおり、携帯電話の多くはクッキーにまだ対応していませんので2)のURL埋め込み方式をとります。
php.iniに以下の2つのパラメーターを使って2)のURL埋め込み方式を実装します。
| パラメータ名 | 意味 |
| session.use_trans_sid | セッションが有効な場合、セッションIDをURLに自動で付加する |
| session.use_cookies | セッションにクッキーを使用する |
それぞれ有効:1、無効:0の値で設定します。
今回のサンプルは携帯が対象となるシステムなので「session.use_trans_sid」の他に「session.use_cookies」でクッキーにセッションを持たないようにして以下のようにphp.iniに設定します。
session.use_trans_sid = 1 session.use_cookies = 0
レンタルサーバーの制約などでphp.iniの変更ができない場合はApacheの.htaccessで同じ設定ができます。
php_flag session.use_trans_sid On php_flag session.use_cookies Off
上記の設定を行ってPHP内でセッションが開始された場合、リンクの後ろにはには「SESSID=XXXXX」、フォーム内には<input type="hidden" name="SESSID" value="XXXXX" />のようにセッションを遷移先の画面へ引き継げるようなIDと値のペアが自動で付加されます。
サンプル実行用のデータ作成
以下のSQLを実行してテーブルを作成します。
CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL auto_increment COMMENT 'ID', `user_id` varchar(32) NOT NULL COMMENT 'ユーザーID', `password` varchar(32) NOT NULL COMMENT 'パスワード', `user_name` varchar(32) default NULL COMMENT 'ユーザー名', `uid` varchar(48) NOT NULL COMMENT '携帯端末ID', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
次にinsert.phpに携帯電話からアクセスして「user_id」「password」「user_name」を入力してテストデータを作成します。
この際に携帯電話の端末IDも取得してユーザーデータを作成します。携帯端末で端末IDを送出しないように設定している場合は解除してからアクセスします。
DB接続情報はconfig.phpに記述して、データ作成はPDOを用います。
.htaccessを利用してPHPプログラムの文字コードはUTF-8とし、画面出力時の文字コードをSJISにしています。 これはUTF-8に対応していない携帯電話もあるためです。Smartyの使い方は本連載第7回をご確認ください。
define('MYSQL_HOST' , 'MySQLサーバーのアドレス');
define('MYSQL_USER' , 'MySQLユーザー名');
define('MYSQL_PASSWORD' , 'MySQLユーザーのパスワード');
define('MYSQL_DATABASE' , 'データベース名');
define('dbType' , "mysql");
define('str' , '任意の文字列');
function MySmarty(){
$this->Smarty();
$this->template_dir="templates";
$this->compile_dir="templates_c";
$this->default_modifiers = array('escape:"html":"UTF-8"');
}
// テンプレートを出力
function show($template){
// DoCoMoの場合にはxhtml表示ヘッダを送信
if(preg_match("/^DoCoMo/",$_SERVER["HTTP_USER_AGENT"])){
header("Content-Type: application/xhtml+xml; charset=Shift_JIS");
}
$this->display($template);
}
// ユーザーID取得
$user_id = $_POST['user_id'];
// パスワード取得
$password = $_POST['password'];
// ユーザー名取得
$user_name = $_POST['user_name'];
if($user_name){
// 端末IDを取得
$agent = Net_UserAgent_Mobile::singleton();
$uid = $agent->getUID();
// DB接続
$pdo = new PDO(dbType.":host=".MYSQL_HOST."; dbname=".MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD);
$stmt = $pdo->prepare("INSERT INTO user (user_id, password, user_name, uid) VALUES(:USER_ID, :PASSWORD, :USER_NAME, :UID)");
// ユーザーデータ作成
$stmt->bindValue(':USER_ID', $user_id);
$stmt->bindValue(':PASSWORD', md5(str . $password));
$stmt->bindValue(':USER_NAME', $user_name);
$stmt->bindValue(':UID', $uid);
$stmt->execute();
}
XSS(クロスサイトスクリプティング)の虚弱性を回避するためにSmartyのdefault_modifiersに修飾子escapeを設定しています。 サンプルではconfig,phpをinsert.phpと同じディレクトリに配置しておりますが、実際のシステム開発ではドキュメントルートの外に配置して下さい。
パスワードを保存する際にはmd5関数を使って暗号化します。サンプルではそのままではなく、config,php内で設定した任意の文字列を付け足して暗号化しています。 ユーザーごとに文字列を定義するとより安全にパスワードを保存できます。

サンプルではユーザーID「123」、パスワード「abc」、ユーザー名「鳩山」で作成しています。
- 修正履歴
-
- 2010/10/11 22:48 PHP内部文字コードと出力文字コードを分ける処理を追加
- 2010/10/07 17:01 パスワード保存時の処理を変更
- 2010/10/06 14:15 かんたんログイン利用時の注意点を追加
- 2010/10/03 22:44 MySQLへの接続の際の文字コード指定、簡単ログインの際に携帯キャリアのIPアドレスか判定する処理を追加
この記事は参考になりましたか?
- 目的に応じて適材適所で使うPHPライブラリ連載記事一覧
-
- PHPで作成する携帯会員サイトの基本
- PHPUnitでできる単体テスト
- PHPで行う動画変換(後編)
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
