PHPソースの意味がわからない!ブラウザの判定とセッションの処理について

このQ&Aのポイント
  • PHPのコミュで質問し、回答をいただきましたが、ソースの意味がわからず困っています。特にget_browser()関数やis_browser_pc()関数、session_url_smart()関数の一部が理解できません。
  • get_browser()関数はブラウザを調べるためのものですが、is_browser_pc()関数はどのような判定を行っているのか分かりません。また、session_url_smart()関数の一部である「$url.= (strpos($url, '?') === false ? '?' : '&') . SID;」の意味も理解できません。
  • 初心者なので、これらのソースの意味や処理について詳しく教えていただけると助かります。
回答を見る
  • ベストアンサー

ソースの意味がわかりません。

先日PHPのコミュで質問して回答をいただいたのですが、その後、その回答に質問したのですが回答がなくて、どうしてもソースの意味がわからず困っています。分かる方どうかご教示ください。 クラスファイルの一部ですが、 ────────────────── function __is_browser_pc() { $browser = __get_browser(); switch ($browser) { case 'docomo': case 'au': case 'softbank': return false; default: return true; } return true; } function session_start_smart() { $is_pc = __is_browser_pc(); if (!$is_pc) ini_set('session.use_trans_sid', '1'); session_start(); } function session_url_smart($url) { $is_pc = __is_browser_pc(); if (!$is_pc) { $url.= (strpos($url, '?') === false ? '?' : '&') . SID; } return $url; } ?> ──────────────────── get_browser(); はブラウザを調べているのだと思います。 is_browser_pc() の下のほうの ///////////////////////////// default: return true; } return true; } ///////////////////////////// 最初の「return true;」 はわかりますが、次の「return true; 」の意味は何でしょうか? あと「session_url_smart」の ///////////////////////////// $url.= (strpos($url, '?') === false ? '?' : '&') . SID; ///////////////////////////// この部分がわかりません。 プログラム自体初心者です。 よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

>$is_pc = __is_browser_pc(); >if (!$is_pc) ini_set('session.use_trans_sid', '1'); __is_browser_pcは、先頭で定義した、「docomo/au/softbankのブラウザ以外」であるかを調べる関数ですね。 if (!$is_pc) は、その値がfalseだったら、「携帯ブラウザ以外で無かった」ら==「携帯ブラウザなら」ということで、その場合、 ini_set('session.use_trans_sid', '1'); で、php.ini に session.use_trans_sid = on と設定したのと同じ効果を出します。 session.use_trans_sid をonにしているのは、docomo携帯だとクッキーが使えないのでURLにセッションIDを含ませるためでしょう。他社はクッキーが使えますが、三社同じ動作にしているわけです。

tama-2009
質問者

お礼

お礼が遅くなって申し訳ないです。 URLにセッションIDを含ませるんですね。 ありがとうございました。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

A ? B : C のような記述を3項演算子といいます。 Aが真の場合はB、Aが偽の場合はCの値を返します。

tama-2009
質問者

お礼

3項演算子だったんですね。 ありがとうございました。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

2つめのreturnの意味はないでしょう。書かなくても動作も意味も同じ。 つぎのは、$url の中に ? の文字が入っているかどうかによって処理を変えています。 $urlが"http://example.com/abc.php"の場合、"?" と SIDを連結。 $urlが"http://example.com/abc.php?parm=xyz"の場合、"&" とSIDを連結。

tama-2009
質問者

補足

ありがとうございます。 やっぱり2つ目のreturnの意味はないのですね。 もうひとつ質問するのを忘れていました。 if (!$is_pc) ini_set('session.use_trans_sid', '1'); の意味はなんでしょうか? 追加の質問で申し訳ないですが、よろしくお願いいたします。

関連するQ&A

  • トークンとCSRF対策

    // 1. トークンの生成 function get_csrf_token(){ // get_random_string()はユーザー定義関数。 $token = get_random_string(30); // set_session()はユーザー定義関数。 // CSRFのトークンを生成してセッションに格納したものを返す set_session('csrf_token', $token); // $_SESSION['csrf_token'] = $token; return $token; } // 2.トークンのチェック function is_valid_csrf_token($token){ if($token === '') { return false; } // 引数に与えられたもの$tokenと$_SESSION[‘csrf_token’]とを比較して // 合っていればtrue、そうでなければfalseを返す return $token === get_session('csrf_token'); // $_SESSION['csrf_token']; } function get_random_string($length = 20){ return substr(base_convert(hash('sha256', uniqid()), 16, 36), 0, $length); } get_csrf_token()とis_valid_csrf_token($token)は修正せずに、「if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['csrf_token'] === $_POST['csrf_token']) {} 」と同じ意味にするには、どのような処理(if文)を追加すればいいですか?

    • ベストアンサー
    • PHP
  • return trueとreturn falseの用途・違いは・・・?

    functionやifなどで「return true」「return false」というのを見かけますが、これの違いを教えてください。あと最近 if(!obj){ return true; } という文を見かけました。 これがifじゃなくてfunctionなら、ブール値が返るのでtrueとfalseの違いがありますが、このifではなぜreturn trueを使っているのか分かりません。「return false」を書くと、ifやfunctionを強制的に抜ける「break」と同じ役割を果たすと聞いた事がありますが、trueは知りません。 ・・・というより、ifでreturnを使う意味もよく分からなくなってきました。 if文は何も返りませんし、返したところで受け取る方法がありませんよね? これもどういう意味なのか、教えてください。 よろしくお願いします。

  • ユーザー定義関数の処理

    エラーメッセージに関する以下の関数はどのような処理をする関数ですか? 自分なりに解釈したものを//で書いています。 // エラーがセットされているときは、$errorsを返す // もしセッション変数にエラーがないときは、空の配列を返す function get_errors(){ // セッション変数にエラーがセットされているときは$errorsを以下のように定義する $errors = get_session('__errors'); if($errors === ''){ return array(); } // もしセッション変数にユーザー名($name)がセットされているなら、セッション情報を返す // セットされていないときは空文字を返す function get_session($name){ if(isset($_SESSION[$name]) === true){ return $_SESSION[$name]; }; return ''; } // $nameと$valueを受け取り、セッション情報(ユーザー名)を$valueと定義する function set_session($name, $value){ $_SESSION[$name] = $value; }

    • ベストアンサー
    • PHP
  • 「404判定のstrpos」の演算子が分からないの

    「404判定のstrpos」の演算子の意味が分からないので、教えてください。 ▽404 Not Found時の対処 | PHPのQ&A【OKWave】   http://okwave.jp/qa/q4783971.html に掲載されていた下記を試したら、期待した動作になったのですが、 if (strpos($hdr[0],'404')!==false){  echo 'Not Found'; } else { しかし、 ▽PHP: strpos - Manual   http://php.net/manual/ja/function.strpos.php を参考に、「===演算子」へ変更したら、 if (strpos($hdr[0],'404')===false){  echo 'Not Found'; } else { 正常なURL(200)も、全てNot Foundになってしまいます。 ちなみに、 if (strpos($hdr[0],'404')==true){ だったら、期待通りの動作になりますが、 if (strpos($hdr[0],'404')===true){ だと、何が来ても同じ結果になります。 なんででしょうか? strpos関数の返り値を調べる際 ===演算子 を 利用しなくても良いのでしょうか?

    • ベストアンサー
    • PHP
  • PHPで定義されるあるクラスの関数について

    お世話になります。自分がいま勉強しているPHP教本の中の、画像ファイルをアップロードするクラスUploadを以下に掲載します。 自分の質問は この中のcheckFile()という関数についてです。 それぞれがtrueまたはfalseを返す3つの関数を続けて実行していますが、すべての戻り値がtrueでなければtrueを返せないはずなのに、ここでは一番最後のcheckType()がtrueであれば前の2つはfalseでも構わないことになってしまいます。それぞれの戻り値である$accept を順次かけ合わせていけば問題ないように思われますが、そうではなくて、それぞれを単純に$accept に代入するだけでよいのでしょうか? 詳しい方、どうかご意見をお聞かせください。 class Upload{ protected $destination; protected $max = 81920; protected $messages = [];// error or success message, to show to the user protected $permitted = ['image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/webp' ]; // to check if the uploaded file is one of these types public function __construct($path){ if(is_dir($path) && is_writable($path)){ $this->destination = rtrim($path, '/\\').DIRECTORY_SEPARATOR; }else{ throw new \Exception("$path must be a valid, writable directory.") } } public function upload($fieldname){ $uploaded = $_FILES[$fieldname]; if($this->checkFile($uploaded)){ // child function 1 $this->moveFile($uploaded); // child function 2 } } protected function checkFile($file){ // child function 1 $accept = $this->getErrorLevel($file); $accept = $this->checkSize($file); $accept = $this->checkType($file); return $accept; } protected function moveFile($file){ // $file is the same as $uploaded in parent function $success = move_uploaded_file($file['tmp_name'], $this->destination.$file['name']); if($success){ $result = $file['name'] .' was uploaded successfully.'; $this->messages[] = $result; }else{ $this->messages[] = 'Could not upload '.$file['name']; } } public function getMessages(){ return $this->messages; } protected function getErrorLevel($file){ switch($file['error']){ case 0: return true; case 1: case 2: $this->messages[] = $file['name'].' is too big. (max: '.$this->getMaxSize().')'; break; case 3: $this->messages[] = $file['name'].' was only partially uploaded.'; break; case 4: $this->messages[] = 'No file was submitted.'; break; default: $this->messages[] = 'Sorry. There was a problem uploading '.$file['name']; } return false; } protected function checkSize($file){ if($file['error'] == 1 || $file['error'] == 2 ){ return false; }else if($file['size'] == 0){ $this->messages[] = $file['name']. " is an empty file."; return false; }else if($file['size']>$this->max){ $this->messages[] = $file['name']." exceeds the maximum size for a file (". $this->getMaxSize().")"; return false; } return true; } protected function checkType($file){ if(!in_array($file['type'], $this->permitted)){ $this->messages[] = $file['name']." is not permitted type of file."; return false; } return true; } public function getMaxSize(){ return number_format($this->max/1024, 1)." KB"; } }

    • ベストアンサー
    • PHP
  • 「checkText3」が処理されない

    とあるHOWTO本を見ながら、独学でPHPを勉強中です。 サンプルプログラムを動作させようとマニュアル通りに記述してみたのですが、一部分だけが上手く処理されません。 付属CDに収められているphpファイル自体がこのような記述になっている為、マニュアル自体に間違いがあるのかな?と思うのですが、 どこがおかしいのか解らずにいます。 お分かりになる方がいれば、ご教授願えませんでしょうか? 上手く処理されないのは「//テキストチェック3.バイバイされたらバイバイを返す」の部分です。 よろしくお願い致します<(_ _)> <?php $res = ""; if(isset($_POST['text1']) == false) {$res = getAisatsu();} else{$text1 = $_POST['text1']; if($text1 == "") {$res = "え? なんていったの?";} else{$flag =false; //まずcheckTextであいさつ文をチェック $str = checkText($text1); if($str != false) {$flag = true; $res = $str; } //続いてcheckText2で悪口の対応 if($flag == false) {$str = checkText2($text1); if($str != false) {$flag = true; $res = $str; } } //最後にcheckText3でさよならの対応 if($flag == false) {$srt = checkText3($text1); if($str != false) {$flag = true; $res = $str; } } //すべてダメならテキストを分解してチェック if($flag == false) {$arr = bunkatsu($text1); foreach($arr as $str) {if(getWordCheck($str) == true) {$flag = true; $res = $str . "って、なぁに?"; break; } } } //それでもダメなら全文で聞き返す if($flag == false) {$res = delTouten($text1) . "って、なぁに?";} } } //時間によって異なるあいさつ文を返す function getAisatsu(){ $arr = array('……ね、眠い','おはよう!','こんにちは~','こんばんわ',); $d = getdate(); $t = $d['hours']; $t2 = (int)($t / 6); return $arr[$t2]; } //テキストチェック。あいさつ文があれば対応する挨拶を返す function checkText($s){ if($s == ""){return false;} $res = false; $data = array('こんにちは','こんにちわ','こんちは','こんちわ'); foreach($data as $str) {if (mb_strpos($s,$str) !== false) {$res = 'どうも、' . $str . '!'; break; } } return $res; } //テキストチェック2.悪口が書かれていたら文句をいう function checkText2($s) {if ($s ==""){return false;} $res = false; $data = array('バカ','馬鹿','あほ','アホ','阿呆'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res =$str . 'じゃないもん!'; break; } } return $res; } //テキストチェック3.バイバイされたらバイバイを返す function checkText3($s) {if ($s == ""){return false;} $res = false; $data = array('ばいばい','バイバイ','じゃあね'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = 'それじゃ' . $str . '!'; break; } } return $res; } //句読点を削除する function delTouten($s) {$res = str_replace('。','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); $res = str_replace('.','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); return $res; } //テキストを句読点で分割し、配列として返す function bunkatsu($s) {mb_regex_encoding("sjis"); $res = mb_ereg_replace('[。、?!,.!?]','',$s); $arr = mb_split(' ',$res); return $arr; } //主語や接続詞が含まれているかを調べる function getWordCheck($s) {if ($s == ""){return false;} $res = $s; $data = array('私','わたし','僕','ぼく','俺','おれ','オレ'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = false; break; } } return $res; } //サニタライズ function getSeftyText($s) {$res = str_replace("<","<",$s); $res = str_replace(">",">",$res); return $res; } ?>

    • ベストアンサー
    • PHP
  • VBのReturnの使い方

    Excel2007のVBで以下のfunctionを定義すると、Returnのところでコンパイルエラーになります。 -------------------------------------- Public Function IsTen(lNumber As Integer) As Boolean If lNumber = 10 Then Return True Else Return False End If End Function -------------------------------------- ググってみるとReturn True とか Return False とかができるように思えるのですが、何が不味いのでしょうか? VBの知識はあまりなく、低レベルな質問かもしれませんが、よろしくお願いします。

  • COOKIEを用いたセッション管理

    PHPでCOOKIEを用いたセッションチェックをしようとしています。 トップページを表示する関数とセッション管理の関数に分けて処理をしています。 function index(){ session_start(); if($this->CheckSession()) ログインのページ else ログオフのページ } function CheckSession(){ if(!$_COOKIE["hoge"]) DBにセッションID(COOKIE["hoge"]の値)を入れる setcookie("hoge",session_id()); return false; else  return true; } このとき更新ボタンを押すたびにCOOKIEの値が変わります。 なぜでしょうか?

    • ベストアンサー
    • PHP
  • ドコモのセッション機能について

    iモードHTMLシュミレータIIを使用して携帯版のサイトを作成しています。 セッションがうまく動いていないような感じがします。 画面遷移した後に”$_SESSION”の中身がないようです。 私の確認方法が悪いのでしょうか? 【環境】 ・iモードHTMLシュミレータII ・XAMPP Windows版Version 1.7.1 ・C:\xampp\php\php.iniの設定 ; This option enables administrators to make their users invulnerable to ; attacks which involve passing session ids in URLs; defaults to 0. session.use_only_cookies = 0 ; trans sid support is disabled by default. ; Use of trans sid may risk your users security. ; Use this option with caution. ; - User may send URL contains active session ID ; to other person via. email/irc/etc. ; - URL that contains active session ID may be stored ; in publically accessible computer. ; - User may access your site with the same session ID ; always using URL stored in browser's history or bookmarks. session.use_trans_sid = 1 【index.php】 <? session_start(); echo 'use_only_cookies = ' . ini_get('use_only_cookies') . "\n"; $_SESSION["xxx"] = "1234567890"; $login_url = "main.php"; header("Location: {$login_url}"); ?> ⇒”use_only_cookies =”のみ表示 【main.php】 <? session_start(); print_r($_SESSION); echo 'sssion.use_trans_sid = ' . ini_get('session.use_trans_sid') . "\n"; ?> ⇒”Array()”のみ表示 ⇒”sssion.use_trans_sid=1”表示 何か設定が悪いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 関数からの関数の呼び出しは

    下記のようなIF文の中で「URL」がカラならsend_check()を実行させたいのですが、→のところにどのように記載したらよいか教えていただけないでしょうか。 また、関数から関数へいくらでも呼び出していけるものですか。質問の仕方もよくわからないのですが、よろしくお願いいたします。 function submitCheck(){ if (document.mail.url.value==""){ →→→→ return false;} else return true; }

専門家に質問してみよう