アーカイブ:Webプログラミング

生年月日から年齢を自動で計算するPHP

モデル事務所とかサッカーチームとかホストクラブとか、プロフィールの掲載が必要なサイトで年齢を毎年更新するのは大変なので、自動で年齢を計算してくれるPHPです。


生年月日から年齢を計算する簡単な計算式
http://itpro.nikkeibp.co.jp/article/Watcher/20070822/280097/


↑こちらを参考にしてます。


<?php


//生年月日を設定
//年は4桁、月日は2桁で入力。
$y = "2000";
$m = "01";
$d = "01";
$birth = $y.$m.$d;


//今日の日付を取得
$today_y = date("Y");
$today_m = date("m");
$today_d = date("d");
$today = $today_y.$today_m.$today_d;


//年齢を計算
$age = (int)(($today - $birth)/10000);


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>


<body>
生年月日:<?php echo ($y); ?>年<?php echo ($m); ?>月<?php echo ($d); ?>日<br />
年齢:<?php echo ($age); ?>歳
</body>
</html>


法的な厳密性が必要な際は、もうちょっとちゃんとやらないとダメっぽい。


「生年月日から年齢を計算する簡単な計算式」は使えるとは限らない
http://d.hatena.ne.jp/alittlething/20070827/p1


参考に別の年齢計算式。↓


PHPで年齢計算
http://d.hatena.ne.jp/smilestyle55/20060513


PHPで日付・時刻の計算 - 年齢計算
http://ponk.jp/old/php_time/index.php?page=2

さくらインターネットのサーバでPHPをShift_JISで動かす

さくらインターネットのサーバのPHPの標準文字コードがEUC-JPなので、
Shift_JISで動かしたい場合の方法。携帯サイトをPHPで組む際に。


もちろん、さくらインターネットじゃなくても、
サーバの文字コードがShift_JISではない場合に使える。


ソースコードの先頭に下記のコードを入れる。
ファイル自体の文字コードは、Shift_JISにする。


<?
mb_language("Japanese");
mb_internal_encoding("Shift_JIS");
?>


<?xml version="1.0" encoding="Shift_JIS"?> を入れると、動かないっぽい。


■コピペ用サンプル

<?
mb_language("Japanese");
mb_internal_encoding("Shift_JIS");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" />
    <meta name="language" content="Japanese" />
    <meta name="description" content="" />
    <meta name="keywords" content="" />
    <title></title>
</head>

<body>

</body>
</html>


■参考サイト
euc-jpでしかphpが動かないサーバーでshift-jisでphpを動かしたい - 教えて!goo
http://oshiete1.goo.ne.jp/qa4072109.html

携帯にメールを送る簡単なPHPメールフォーム

携帯電話にメールを送る簡単なメールフォーム。
携帯にサイトURLを送ったりするのに使えるけど、
QRコードが普通になっているから、そんなに最近は使わないかも。


サンプルをみる(実際にメールが届きます)


入力画面(index.html) → 完了画面&送信実行ファイル(mobile_exe.php)にデータを渡す仕組み。


■入力画面(index.html)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
    <title>メール送信 入力画面</title>
</head>


<body>


入力画面<br /><br />


<form method="post" action="./mobile_exe.php">


    <input type='hidden' name='access' value='exe'>


    <input type="text" maxlength="100" name="acount" value="" />


    <select name="carrier">
        <option value="@docomo.ne.jp" selected="selected">@docomo.ne.jp</option>
        <option value="@ezweb.ne.jp">@ezweb.ne.jp</option>
        <option value="@softbank.ne.jp">@softbank.ne.jp</option>
        <option value="@d.vodafone.ne.jp">@d.vodafone.ne.jp</option>
        <option value="@h.vodafone.ne.jp">@h.vodafone.ne.jp</option>
        <option value="@t.vodafone.ne.jp">@t.vodafone.ne.jp</option>
        <option value="@k.vodafone.ne.jp">@k.vodafone.ne.jp</option>
        <option value="@r.vodafone.ne.jp">@r.vodafone.ne.jp</option>
        <option value="@s.vodafone.ne.jp">@s.vodafone.ne.jp</option>
        <option value="@n.vodafone.ne.jp">@n.vodafone.ne.jp</option>
        <option value="@q.vodafone.ne.jp">@q.vodafone.ne.jp</option>
        <option value="@c.vodafone.ne.jp">@c.vodafone.ne.jp</option>
    </select>


    <input type='submit' value='送信する' />


</form>


</body>
</html>


■完了画面&送信実行ファイル(mobile_exe.php)

<?php


//いきなりこのページにアクセスした場合に、index.htmlに自動で飛ぶ設定
if ($_POST['access'] <> "exe") {
    header("Location: ./index.html");
    exit;
}


?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
    <title>メール送信 完了画面</title>
</head>


<body>


完了画面<br /><br />


<?php


if ($_POST['acount'] == "") {
    echo "エラーです<br /><br />\n";
    echo "<div align=\"left\">\n";
    echo "<div style=\"color:#ff0000;\">“アドレス”が入力されていません。</div><br /><br />\n";
    echo "<a href='index.html'>前にもどる</a>";
    echo "</div><br /><br />\n";
}else{


    if (isset($_POST['acount'])) {
        $acount = htmlspecialchars($_POST['acount']);
    }
    if (isset($_POST['carrier'])) {
        $carrier = htmlspecialchars($_POST['carrier']);
    }


    //送信者へのメール送信用の情報
    $to = "$acount"."$carrier";
    $header = "From:sample@sample.com"; //送信元のアドレス
    $subject = "メールの件名をここに書く"; //メールの件名
    $message = "メールの本文をここに書く\n"; //メールの本文 サイトの説明文があればここに書く
    $message .= "http://sample.com\n"; //メールの本文 サイトのアドレスを書く


    //送信者への確認メールの送信
    mb_language("Ja") ;
    mb_internal_encoding("Shift_JIS") ;
    mb_send_mail($to,$subject,$message,$header);


    //完了メッセージ
    echo "<div align=\"left\">\n";
    echo "モバイルへの送信が完了しました。<br /><br />\n";
    echo "しばらくたってもメールが届かない場合は、ご入力いただいたメールアドレスが間違っている可能性がございます。<br />\n";
    echo "その際は大変お手数ではございますが、再度ご送信をお願いいたします。";
    echo "<br /><br />\n";
    echo "<a href=\"index.html\">前にもどる</a></br /><br />\n";
    echo "</div>\n";


}


?>


</body>
</html>

メールフォームの生年月日のプルダウンをPHPで書く

メールフォームを作成する時に、生年月日などで年の項目を大量にコピーしないといけない場合があるので、PHPで簡略化したものをつくってみた。


■1920年〜2020年までを自動生成するプルダウン(サンプル01

<form>

<select>

<?

  $start = 1920; //始まりの年

  $end = 2020; //終わりの年

  for ($i=$start;$i<=$end;$i++){

    echo "<option value=¥"$i¥">$i</option>¥n";

  }

?>

</select> 年

</form>


上のコードでは最初に選択されているのが1920になるので、
2000が最初に選択されている状態にする場合は下記。


■2000年が最初に選択されているプルダウン(サンプル02

<form>

<select>

<?

  $start = 1920; //始まりの年

  $end = 2020; //終わりの年

  $select = 2000; //最初に選択された状態で表示したい年

  for ($i=$start;$i<=$end;$i++){
    if($i==$select){
      echo " <option value=¥"$i¥" selected=¥"selected¥">$i</option>¥n";
    }else{
      echo " <option value=¥"$i¥">$i</option>¥n";
    }
  }

</select> 年

</form>


↓ 年以外に、月も日も自動生成する場合。


■年月日すべてを自動生成するプルダウン(サンプル03

<form>

<select>

<?

  $start = 1920; //始まりの年

  $end = 2020; //終わりの年

  $select = 2000; //最初に選択された状態で表示したい年

  for ($i=$start;$i<=$end;$i++){

    if($i==$select){

      echo "<option value=¥"$i¥" selected=¥"selected¥">$i</option>¥n";

    }else{

      echo "<option value=¥"$i¥">$i</option>¥n";

    }

  }

?>

</select> 年

<select>

<?

  for ($i=1;$i<=12;$i++){

    echo "<option value=¥"$i¥">$i</option>¥n";

  }

?>

</select> 月

<select>

<?

  for ($i=1;$i<=31;$i++){

    echo "<option value=¥"$i¥">$i</option>¥n";

  }

?>

</select> 日

</form>


うるう年を自動で取得するJavaScriptと組み合わせるとさらに便利。
http://d.hatena.ne.jp/hirosemi/searchdiary?word=%2a%5bJavaScript%5d


入力画面のファイルを(X)HTMLでつくらないといけない場合は、ここが便利。
http://tuevin.jugem.jp/?eid=30

Webアプリケーションで使われるプログラミング言語「PHP」と「Java」とか

Webプログラミングといえば、PHPとAjax(つまりJavaScript)が主流ですね。Webデザイナーであれば、FlashのActionScriptも使うかな。しかし、Javaも使われている(JavaSciptではなくJava)。Perl、Ruby、Python、.netもあるようだけど。XMLも書けないと、そろそろまずいかな?


Find Job !などの求人サイトで、Webプログラマで検索すると、Javaエンジニアを募集しているところもけっこう多いような?


PHP、Perl、Ruby、Pythonあたりはスクリプトって感じで似た感じがするけど(僕はプログラマじゃないんでニュアンスしかわからないけど)、Javaはもっと本格的なプログラミング言語だよね。Webでは、どこでJavaが使われているんだろうと、ずっと不思議だった。どういった差があり、メリットとデメリットが、いまだにピンとこない。ネットで調べても、言語仕様的な比較を行っているサイトは見つかるが、もっと根本の差がわからない。(学生時代に、Javaを書いてたことはあるから基本はわかりますが、逆にいえばものすごい基本しか分からないです。クラス変数をうまく使えない低レベルです。JSPはつくったことないけど、Javaアプレットはよくつくったな〜)


本職のプログラマの数人にあって質問してみたけど、けっこう意見バラバラだった。


ある人は、PHPよりもJavaの方が言語的(サーバに設置する環境という意味かな?)にセキュリティが高いから変な話、ある程度のプログラマが作っても一定以上のセキュリティが保てるらしい。そのため大手のセキュリティを重視する企業のWebサイトではよく使われているらしい。JavaScriptやPHP、Perlよりもデータ型や変数の宣言など、かなりしっかりしているのは確かだね。


ある人は、「プログラマだったらJavaだ!」の一言で片付けられた。笑


また、ある人は、PHPでもBasic認証やログイン画面やSSLを使えば、PHPでもセキュリティ的には問題ないって言ってた。


う〜ん、どうなんだろうね。

サイトにアクセスした時に、index.phpを自動で最初に表示させたい

サイトにアクセスした時に、index.phpなどのindex.html以外のファイルを自動で最初に表示させたい場合、次の内容を記述した「 .htaccess 」をそのディレクトリに設置する。


DirectoryIndex index.php index.cgi index.shtml index.html


html、phpなどの順番を変えれば、その拡張子の表示優先順位も変わる。
上の例では、PHP、CGI、SSI、HTMLの順で表示される。


■参考サイト


.htaccess活用法(9)
http://www.shtml.jp/htaccess/directoryindex.html

携帯サイト制作でPHPを使う場合のXML宣言のエラー対処

携帯用サイト製作時にPHPを使うと、「Parse error: syntax error, unexpected T_STRING in ...」というエラーが出るか、画面に何も表示されない場合は、


<?xml version="1.0" encoding="Shift_JIS"?>


などのxml宣言の「 <? 」が、PHPの「 <?php 」の省略タグと解釈されて、そうなる場合がある。
PHPタグを使っていないXHTMLファイルの拡張子を「 .php 」に変えただけでも、同じ症状が出る場合は、ほぼ確実にこれ。


対処方法は次の通り。


A) サーバの「 php.ini 」の「 short_open_tag 」を「 Off 」にする。
※専用サーバではなくレンタルなどの共有サーバでは出来ない場合あり。


B) サーバでPHPファイルを使っているディレクトリに「php_flag short_open_tag Off」を記述した「 .htaccess 」を設置する。
※レンタルサーバなどでは、「 .htaccess 」が設置できないサーバもあり。


C) PHPファイルのxml宣言部分をPHPの「 echo 」や「 print 」で出力する。


D) PHPを利用しない。


E) xml宣言を外してPHPを利用する。


※A)かB)を行った場合は、「 <? 」がPHPの省略タグとして利用できなくなるので注意が必要。



詳しくは次の通り。


A)は、サーバ管理者にお願いしてください。


B)は、「 .htaccess 」が設置できるサーバであれば、次の内容を記述してPHPを使っているディレクトリにFTPでUPすればOK。


<IfModule mod_php4.c>
php_value mbstring.internal_encoding SJIS
php_flag short_open_tag Off
</IfModule>


※1) 「IfModule」はなくても動くっぽい。PHPがバージョン5の場合は「mod_php5.c」とする。
※2) 「php_value mbstring.internal_encoding SJIS」はなくてもOK。携帯用の文字コードが現在ほぼ「 Sift_JIS 」のため、一応入れておくと無難なため入れてある。もちろん、PHPファイルで別の文字コードを指定していれば、ここでもそれを指定する必要がある。


C) PHPファイルのxml 宣言部分をPHPの「 echo 」や「 print 」で出力する。
xml宣言部分を次のように記述する。


<?xml version="1.0" encoding="Shift_JIS"?>



<?php echo "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n"; ?>


D) PHPを利用しないで、XHTMLのみで制作する。


E) xml宣言を外してPHPを利用する。
いくつか見た感じでは最近の機種であれば、表示上や動作でおかしいところはなかったけど、出来るだけやらない方がいい。



■参考サイト


Q43. スキンを xhtml ファイルで自作したら、エラーが表示される or 何も表示されないのですが?
http://popilol.lolipop.jp/NiconicoPHP/faq/body.php?no=42


xhtml と php
http://www.tagindex.com/kakolog/q2bbs/601/810.html


xmlの宣言について
http://lolipoking.lolipop.jp/php/patio.cgi?mode=view&no=2690


「.htaccess」ファイルでの設定
http://www.shigeweb.jp/php/project_p/?section=setup&page=htaccess

PHPでクリックした時にファイルをダウンロードさせる設定

右クリックで「ファイル保存」しなくても、クリックするだけでブラウザのダウンロードウィンドウが開いてダウンロードが始まるようにするPHP。
普通にファイルにリンクを張ると、ブラウザによってはウィンドウ内でファイルを開いてしまうことがあるので・・・。
csvとか、動画とかのダウンロードで使うことが多いかな。


sample.phpを、download.htmlからAタグやフォームのボタンで読み込む。
実際にダウンロードさせるファイルは、sample.phpにパスを記載する。


■ download.html

テキストリンクの場合<br />
<a href="sample.php">sample.csvをダウンロードする</a>
<br /><br />


フォームボタンの場合<br />
<form><input type="button" value="sample.csvをダウンロードする" onClick="location.href='sample.php'"></form>


■ sample.php

<?php
   $file = "sample.csv";
   $file_length = filesize($file);
   header("Content-Disposition: attachment; filename=$file");
   header("Content-Length:$file_length");
   header("Content-Type: application/octet-stream");
   readfile ($file);
?>



■動作環境


Windows:Internet Explorer 6.0、Internet Explorer 7.0、FireFox 2.0

Mac OS:Safari 2.0、FireFox 2.0
※サーバサイドのシステムなので、ブラウザはあまり関係ないかもしれないけど一応・・・。


■参考サイト


PHPでファイルをダウンロードするには?
http://chaichan.web.infoseek.co.jp/qa5500/qa5931.htm


ファイルのダウンロード
http://php.nekosuke.com/000022.html


[PHP]ファイル圧縮とダウンロード
http://blog.fmono.sub.jp/?eid=346000


任意のファイルをダウンロードさせる - readfile()
http://www.spencernetwork.org/memo/tips-5.php


PHPでファイルをダウンロードさせるには
http://jamz.jp/tech/2006/11/how-to-download-after-display-thanks-page.html

PHPで携帯の各キャリアとPCの判別、振り分けをする

PHPで、ユーザーエージェントを取得して各キャリアとPCに振り分ける方法。
前に、メモ程度で書いたエントリーのPHPについてを詳しくまとめてみた。


■キャリア、PC判別

<?php
$agent = $_SERVER['HTTP_USER_AGENT'];
if(preg_match("/^DoCoMo/i", $agent)){
   echo "あなたは、DoCoMoからアクセスしています。<br />";
   echo "ユーザーエージェント:$agent";
}else if(preg_match("/^(J¥-PHONE|Vodafone|MOT¥-[CV]|SoftBank)/i", $agent)){
   echo "あなたは、SoftBankからアクセスしています。<br />";
   echo "ユーザーエージェント:$agent";
}else if(preg_match("/^KDDI¥-/i", $agent) || preg_match("/UP¥.Browser/i", $agent)){
   echo "あなたは、auからアクセスしています。<br />";
   echo "ユーザーエージェント:$agent";
}else{
   echo "あなたは、PCからアクセスしています。<br />";
   echo "ユーザーエージェント:$agent";
}
?>


□ DoCoMo の場合
"DoCoMo" が文字列として含まれているので、これを条件として振り分ける。


□ SoftBank の場合
"J-PHONE"、"Vodafone"、"SoftBank" が文字列として含まれているので、これを条件として振り分ける。Motorolaの702MOと702sMOには、"J-PHONE" や "Vodafone"といった文字列は含まれていないため "MOT-C" と "MOT-V" で判別する。


□ au の場合
WAP2.0 (XHTML)は、「KDDI-」という文字列で振り分けができる。
WAP1.0 (HDML)は、「UP.Browser」という文字列が含まれている場合をauとして振り分ける。しかし、SoftBank(Vodafone)でも、UP.Browserを使っている機種があるので、if文でau よりもSoftBankを先に記述する必要がある。DoCoMoでもUP.Browserを使っている機種があるらしいが、確認できず・・・。


SoftBankでUP.Browserを使っている機種(2007年8月現在)
802N、703SH、703SHf、703N、802SH、902SH、902T、903SH、804SH


□ PC の場合
上記のいずれにも該当しない場合をPCとして振り分ける。
実際は、PC以外にもWILLCOMやゲーム機、PDA、フルブラウザもここに振り分けられることになる。




■各キャリア、PC判別後にページを飛ばす場合(振り分け)

<?php
$agent = $_SERVER['HTTP_USER_AGENT'];
if(preg_match("/^DoCoMo/i", $agent)){
   header("Location: http://サイトURL/docomo/index.html");
   exit;
}else if(preg_match("/^(J¥-PHONE|Vodafone|MOT¥-[CV]|SoftBank)/i", $agent)){
   header("Location: http://サイトURL/softbank/index.html");
   exit;
}else if(preg_match("/^KDDI¥-/i", $agent) || preg_match("/UP¥.Browser/i", $agent)){
   header("Location: http://サイトURL/au/index.html");
   exit;
}else{
   header("Location: http://サイトURL/pc/index.html");
   exit;
}
?>


これを、アクセスしたときに自動で振り分けたいHTMLのファイル内(拡張子はもちろんphpですが)で、一番上に記述しておけばOK。



■各キャリアのユーザーエージェント情報


DoCoMo ユーザーエージェント情報(公式)
http://www.nttdocomo.co.jp/service/imode/make/content/spec/useragent/


au ユーザーエージェント情報(公式)
http://www.au.kddi.com/ezfactory/tec/spec/4_4.html


SoftBank ユーザーエージェント情報(公式)
http://developers.softbankmobile.co.jp/dp/tech_svc/info/useragent.php


■参考サイト


Perlで作るCGI講座 - 環境変数 HTTP_USER_AGENT - futomi's CGI Cafe -
http://www.futomi.com/lecture/env_var/http_user_agent.html


ユーザーエージェント携帯判別
http://www.mt312.com/column/004.php


ユーザーエージェント(UA)について
http://mobile.np-os.net/index.php?p=ua

AjaxとDHTMLのサンプル集サイト

AjaxとDHTMLのサンプル集が載ってるサイト。
リファレンスというよりも、デモやサンプルが見れるものを中心に集めてみた。



mini ajax
http://www.miniajax.com/
おしゃれで、かっこいいAjaxのサンプルを集めたサイト。



DYNAMICDRIVE
http://www.dynamicdrive.com/
じゃっかんデモが見れないものがあるが、ブラウザが対応していないせい?
CSSのライブラリもある。



dhtmlgoodies.com
http://www.dhtmlgoodies.com/
カテゴライズされているのでので、分かりやすい。
数は、DYNAMICDRIVEよりちょっと少ないかな。



JavaScriptist - javascript/ajax/サンプル/入門/リファレンス/ライブラリ
http://javascriptist.net/
ライブラリ活用編で、Ajaxのデモが見れる。

ASH: Ajax Tutorials
http://vyk1.spaces.live.com/Blog/cns!EBE3A761F939F926!1051.entry


Ajax Examples and Demos (XMLHttpRequest)
http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples


Ajax : 勉強用サンプル&解説
http://www.openspc2.org/JavaScript/Ajax/index.html


つゆだくのJavaScript(Ajax)・スタイルシート
http://www.tuyudaku.net/javascript/




2007年8月21日 追記:
mini ajaxに掲載のAjaxの機能の日本語訳の記事。
全部チェックされたのは、すごい。


小気味良い実用的Ajaxスクリプト36個を厳選
http://arasuji.org/snail/?p=548