携帯サイトでsession(セッション)を使う方法 

通常、session_start()するとクッキーにセッションIDが発行され、次回アクセスした時にクッキーの中にセッションIDがあれば、セッションを読み込んでデータを保持できる。しかしPCと違い、携帯ではcookie(クッキー)が使えない機種がある。通常の方法では携帯でセッションが使えないのだ。


これを解決する方法としてURLにセッションIDを埋め込むという方法がある。クッキーではなくGETやPOSTでセッションIDを持ちまわすのである。ただ、全てのリンクやフォームタグにセッションIDを埋め込むのは骨が折れるだろう。そういう時はphp.iniのsession.use_trans_sidをOnにすればいい。そうすると自動的に全ての相対リンクにセッションIDが埋め込まれる。


しかし、PCと携帯と同じスクリプトで動かしている場合、PCでもセッションIDが埋め込まれてしまうとセッションIDが丸見えになってしまう。(携帯でも見えてしまうけど、PCほど問題にはならないと思う)そのような場合は以下のようなスクリプトで対応する。



// セッションスタート
session_start();

// セッション名取得
$S_TAG = strip_tags(SID);
list( $S_NAME, $S_ID ) = explode("=",$S_TAG);


// セッションクリア
if (!$_COOKIE[$S_NAME] && !$_POST[$S_NAME] && !$_GET[$S_NAME]) {
   $_SESSION = array();
}






// セッション持ちまわし
if( !$_COOKIE[$S_NAME] ){
   $keitai_html_buf = preg_replace( "/(href=\"[^>\?\":]*)\?([^>\?\"]*\"[^>\?\"]*>)/i", "$1?$S_TAG&$2", $keitai_html_buf );
   $keitai_html_buf = preg_replace( "/(href=\"[^>\?\":]*)(\"[^>\?\"]*>)/i", "$1?$S_TAG$2", $keitai_html_buf );
   $keitai_html_buf = preg_replace( "/<form[^>]*>/i", "$0<input type=\"hidden\" name=\"$S_NAME\" value=\"$S_ID\">", $keitai_html_buf );
}


// 携帯用HTML表示
header("content-type: text/html");
header("Content-Length: ". strlen($keitai_html_buf));
echo $keitai_html_buf;
exit;


-----------------------------------------------------------

DoCoMo(ドコモ)のFOMAでは、上のプログラムでうまく動作しないことが分かった。以下のように修正。

// セッション持ちまわし
if( $_COOKIE[$S_NAME] != $S_ID ){
   $keitai_html_buf = preg_replace( "/(href=\"[^>\?\":]*)\?([^>\?\"]*\"[^>\?\"]*>)/i", "$1?$S_TAG&$2", $keitai_html_buf );
   $keitai_html_buf = preg_replace( "/(href=\"[^>\?\":]*)(\"[^>\?\"]*>)/i", "$1?$S_TAG$2", $keitai_html_buf );
   $keitai_html_buf = preg_replace( "/<form[^>]*>/i", "$0<input type=\"hidden\" name=\"$S_NAME\" value=\"$S_ID\">", $keitai_html_buf );
}

コメント

コメントの投稿















管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://shotets.blog21.fc2.com/tb.php/24-10a6b057