Ian Lewis
Ian Lewis is a web developer living in Tokyo Japan. His current interests are in Django, python, alternative databases and rapid web application development. About Me...
  • PHPの empty値の話

    社内チャットで、PHPの NULL、"0"、FALSE、array(), ""の扱い方について、話があった。PHP爆発しろという結論が相変わらず出てきた。

    [14:25:02] key: 互換性維持のため
    [14:25:18] key: 空の比較ならempty使うべし、と思った。<マニュアル読んだ感想文
    [14:25:30] key: http://jp.php.net/empty
    [14:25:37] key: 次のような値は空であると考えられます。:
    
    "" (空文字列)
    0 (0 は整数)
    "0" (0は文字列)
    NULL
    FALSE
    array() (空の配列)
    var $var;(変数が宣言されているが、クラスの中で値が設定されていない)
    [14:27:51] key: アタマが痛くなりそうなbad know howすぎる
    [14:27:52] tokibito: え
    [14:28:17] tokibito: "0"
    [14:28:21] tokibito: trueになんの
    [14:29:27] key: php -r 'var_dump("0" == true);'
    [14:29:30] key: bool(false)
    [14:29:34] key: ならない
    [14:29:39] tokibito: <?php
    $i = "0";
    var_dump(empty($i));
    ?>
    [14:29:40] Ian Lewis: それは仕様なんですよ。
    [14:29:47] tokibito: true
    [14:30:02] Ian Lewis: "0" == false == ""
    [14:30:06] Ian Lewis: なんだけど、
    [14:30:13] Ian Lewis: "0" != ""
    [14:30:21] Ian Lewis: そうなんですよ!
    [14:30:25] key: キモイ!
    [14:31:13] Ian Lewis: transitiveじゃない
    [14:31:31] Ian Lewis: "0" == false == "" == ??? ??????爆発
    

    実は、javascriptと同じく、 === を使わなくちゃだめなんですけど、値を直接に if 文に入れると != trueみたいな一貫性が全然ない処理を行ってしまって、結構バグが出やすい現象だね。

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - PHPの empty値の話
  • モバイルサイトで Google Analytics

    会社のモバイルサイトで、Google Analyticsのトラッキングを導入した。Google Analyticsはブラウザーでいろな情報を集めてGoogleサーバに送るものなので、トラッキングをするには Javascriptが必要な部分がある。しかし、モバイルや、携帯は Javascriptに徐々に対応しようとしてると思うけど、現在はほとんど対応してない。なので、サーバ側でトラッキングするほうが標準。他の携帯向けのサイトもあるけども、そのサイトは大体、そのサイトのurlをお客さんに渡して、それで、お客さんがそのサイトに行ってトラッキングデータを記載して、それから、自分のサイトにリダイレクトするやつだから、嫌な部分がたくさんある。

    一つははお客さんに自分のサイトじゃなくて、別のサイトの変なurlを渡すから、お客さんに嫌な気分をかける。二つ目はサイトに入る後にサイトの中にどんなページを見に行ってるかがトラッキングできない。もっとあるけど、結局はGoogle Analyticsにした。

    具体的に、Peter van der Graffっていう人のブログから、PHPコードを写したけど、Peterさんの目的は僕の目的と違うらしい。彼は RSS とか、ファイルダウンロードのトラッキングをする前提で、コードを書きましたから、携帯機種や、セッションや、ユーザ変数を記載してなかった。なので、Peterさんのコードを以下のコードに書き直した。セッションを渡して、USER_AGENTというHTTPヘーダを送る携帯の機種とかもちゃんと転送するようにした。

    $var_utmac=MOBILE_GOOGLE_ANALYTICS_CODE; //enter the new urchin code
    $var_utmhn=WEB_DOMAIN; //enter your domain
    $var_utmn=rand(1000000000,9999999999);//random request number
    $var_cookie=$session; //cookie number
    $var_random=rand(1000000000,2147483647); //number under 2147483647
    $var_today=time(); //today
    $var_referer=$_SERVER['HTTP_REFERER']; //referer url
    $var_uservar=$storeinfo['storeid']; //enter your own user defined variable
    $var_utmp=$_SERVER['REQUEST_URI']; // request uri

    $urchinUrl='http://www.google-analytics.com/__utm.gif?utmwv=1&utmn='.$var_utmn.'&utmsr=-&utmsc=-&utmul=-&utmje=0&utmfl=-&utmdt=-&utmhn='.$var_utmhn.'&utmr='.$var_referer.'&utmp='.$var_utmp.'&utmac='.$var_utmac.'&utmcc=__utma%3D'.$var_cookie.'.'.$var_random.'.'.$var_today.'.'.$var_today.'.'.$var_today.'.2%3B%2B__utmb%3D'.$var_cookie.'%3B%2B__utmc%3D'.$var_cookie.'%3B%2B__utmz%3D'.$var_cookie.'.'.$var_today.'.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B__utmv%3D'.$var_cookie.'.'.$var_uservar.'%3B';

    $header = '';

    //Set the language to that of the client so analytics can track it.
    if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
      $header = 'Accept-language: '.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'\r\n';
    }
    //Set the user agent to that of the client so analytics can track it.
    if (!empty($_SERVER['HTTP_USER_AGENT'])) {
      $header = 'User-Agent: '.$_SERVER['HTTP_USER_AGENT'].'\r\n';
    }

    $opts = array(
      'http'=>array(
        'method'=>'GET',
        'header'=>$header
      )
    );

    $handle = fopen($urchinUrl, 'r', false, stream_context_create($opts));
    $test = fgets($handle);
    fclose($handle);
    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - モバイルサイトで Google Analytics