Ayas置き場
RSS Feeds
Browsing the archives for the PHP category.
153月

Zend_Gdata_Calendar 公開カレンダーを読み込む

今更。

PHP:
  1. //認証無し
  2. //公開カレンダーを読み込む
  3.  
  4. $service = new Zend_Gdata_Calendar();
  5. $query = $service->newEventQuery();
  6.  
  7. //設定画面で確認できるカレンダーIDをUserにセット
  8. $query->setUser('3p5n1g1bek5o3a881js4tp5flk@group.calendar.google.com');
  9. //公開カレンダーの場合はpublic
  10. $query->setVisibility('public');
  11. //情報はfullで取得
  12. $query->setProjection('full');
  13. //並べ替えの基準を指定
  14. $query->setOrderby('starttime');
  15. //並べ替えの昇順・降順を指定
  16. $query->setSortorder('ascend');
  17.  
  18. //2011-03-11 00:00:00?2011-03-11 23:59:59の予定を取得する場合
  19. $query->setStartMin('2011-03-11');
  20. $query->setStartMax('2011-03-12');//12日は含まれない
  21.  
  22. $eventFeed = $service->getCalendarEventFeed($query);
  23.  
  24. foreach ($eventFeed as $event) {
  25.     $start = $event->when[0]->getStartTime();
  26.     $end   = $event->when[0]->getEndTime()
  27.     print($start . '?' . $end ."\n");
  28. }
  29. //終日の予定は、時間としては00:00:00?00:00:00になる

by Ayas 0 comments Category: PHP Tags:
81月

デストラクタさんとdie()さんと[Ctrl]+[C]様

デストラクタさんはdie()さんは本当にお友達なのだろうか、と疑問に思ったので実験。
(続きを読む...)

by Ayas 0 comments Category: PHP
3112月

俺俺ブロガー様のコメント欄感想をPHPで書いてみる

 俺俺ブロガー様のコメント応対の印象はこんな感じ。

(続きを読む...)

by Ayas 0 comments Category: PHP, ネタ
2612月

PHPでExcelファイル操作のまとめ(途中)

 詳細書くのは問題あるので趣味部分のみ。

PHPExcel

  1. 2007形式に対応している
  2. 読み込みはExcel2007(.xlsx)形式のみ(っぽい)
  3. 書き出しはExcel5(.xls), Excel2007両方出来る

Spreadsheet_Excel_Reader

  1. Excel5形式からデータを読み込める。2007形式は調べていないので不明。

導入に当たって

Warning: require_once(Spreadsheet/Excel/Reader/OLERead.php)

 Google先生で散々引いたけど良く解らない。というか、スペイン語のサイトしか出てこない。読めるかー!*1PEARのSpreadsheet/Excel/Readerの位置なんだけど、そもそもそんなパッケージは無いぞ。同梱のoleread.incをSpreadsheet/Excel/Reader/OLERead.phpとして置いてやれば動くけれども。

 配布しているサイトにも

Starting before version 2i, the oleread.inc file is included with the PHP ExcelReader distribution, so it is no longer necessary to have the OLE package available.

http://sourceforge.net/docman/display_doc.php?docid=22092&group_id=99160

と書いてあるから、動くこと自体は不思議じゃないが、こんな胡散臭い方法が正しいとは思えない。。。Webでうろうろしていても、簡単だった!、このサイト*2の通りでできた!、とはあるけど、エラーが出たとは書いてない。なぜだろう。英語の解釈がどこかで間違ってるのだろう、そうだろう。・・・

 使い方自体は簡単で、

PHP:
  1. <?php
  2. require_once ‘Spreadsheet/Excel/reader.php‘;
  3.  
  4. print("<html><body>");
  5. $xls = new Spreadsheet_Excel_Reader();
  6. $xls->>setUTFEncoder('mb');
  7. $xls->setOutputEncoding('SJIS');
  8. $xls->read("test.xls");
  9. $sheet = 0; //シートの1枚目は0から。
  10. $cols = 1; //セルの1つ目は1から。
  11. $rows = 1;
  12. print($xls->sheets[$sheet]["cells"][$cols][$rows]);
  13. print("</body></html>");
  14. ?>

こうしてやれば、Excelの1番目のシートの、一番左上のセルの内容が読み出せる。

*1:ヒントは無いかと目だけは通したけど撃沈。

*2:閉鎖っぽい。が、一応内容は見た。

1112月

PHPプログラマの技量を知りたい時

 2005年だけど、こんな記事があったので書いてみた。

ちなみに私がPHPプログラマの技量を知りたい時には、ファイル数・構成は無制限で以下のような仕様のスクリプトを書いてもらいます。

* 入力ページ、確認ページ、結果表示ページから成る

* 入力ページでは郵便番号(7桁)の入力欄と送信ボタンを表示

* 入力ページで送信ボタンを押した際、郵便番号欄の値を半角に変換してハイフンを除去

* 郵便番号欄の値が「空文字列」または「7文字の半角数字以外」の場合は「郵便番号欄の値を保持」したまま入力ページを再表示

* 入力ページを再表示する再、郵便番号欄の下に入力値に応じて「入力されていません」または「入力内容が正しくありません」と表示

* 確認ページでは郵便番号、戻るボタン、次へボタンを表示

* 確認ページで戻るボタンが押された場合は「郵便番号欄の値を保持したまま」入力ページを再表示

* 確認ページで次へボタンが押された場合は結果表示ページに「入力された郵便番号はXXX-XXXXです」と表示

* ページデザインは後で差し替えるのでスクリプトとは別ファイルにしておく

* セッションは使わない

Zend PHP Certification - Sooey

一見シンプルな仕様ですが、OOPが身に付いていない人を弾く程度には機能します。実際のところPHPプログラマとして報酬をもらうのであれば、この程度のスクリプトが設計・実装を合わせて一時間以内には書けないとマズいでしょうね(フレームワーク使えば20分くらい?)。

Zend PHP Certification - Sooey

  • 何も調べない・一から書く、の制限で書いてみたら、2時間掛かった
    • もっとまともな正規表現が絶対あるはずだ・・・なんだよ^[0-9][0-9][0-9]\-?[0-9][0-9][0-9][0-9]$って
      • ^[0-9]{3}\-?[0-9]{4}$ こうか・・(調べた)
    • プロは凄い・・って、プロにならんといかんのだが、困ったもんだ
  • オブジェクト指向になれてない辺りも、何とも言えない
  • 大仰になる癖はなんとかならんのか
  • 自分で反省するのは限界があるので、暇な方は適当に貶して頂きたい
  • と思ったら半角に変換してない・・なおさら駄目っぽい
    • before:$this->formString = htmlspecialchars($string);
    • after : $this->formString = mb_convert_kana(htmlspecialchars($string), 'n', 'utf-8');
    • 胡散臭い名前の関数だ

デバッグだけした、書いた当時のコード

./Zipcode.php

PHP:
  1. &#60;?php
  2. require_once(&#39;./lib/Class.php&#39;);
  3. require_once(&#39;./Config.php&#39;);
  4.  
  5. $o_select = new Select_Output($_POST[&#39;input_flg&#39;]);
  6. $o_select-&#62;set_form_string($_POST[&#39;zipcode&#39;]);;
  7. $o_select-&#62;output();
  8. ?&#62;

./Config.php

PHP:
  1. &#60;?php
  2. define(&#39;TEMPLATE_DIR&#39;, &#39;./template/&#39;);
  3. ?&#62;

./lib/Class.php

PHP:
  1. &#60;?php
  2. //テンプレート処理用クラス
  3. class My_Template
  4. {
  5.     private $keyword = &#39;mytmp:&#39;;    //置換用文字列の目印
  6.     private $a_replaceWords;        //置換用文字列
  7.     private $a_template;            //テンプレートファイル
  8.     function set_template($f_file)
  9.     {
  10.         $this-&#62;a_template = file($f_file);
  11.     }
  12.     function set_replace_word($word, $value)
  13.     {
  14.         $this-&#62;a_replaceWords[$word] = $value;
  15.     }
  16.     function output_replaced()
  17.     {
  18.         if(isset($this-&#62;a_replaceWords) ){
  19.             foreach($this-&#62;a_template as $key =&#62; $value) {
  20.                 if(ereg(&#39;{&#39; . $this-&#62;keyword . &#39;.*}&#39;, $value) ) {
  21.                     foreach($this-&#62;a_replaceWords as $k =&#62; $v) {
  22.                         $value = str_replace(&#39;{&#39; . $this-&#62;keyword . $k . &#39;}&#39;, $v, $value);
  23.                     }
  24.                 $this-&#62;a_template[$key] = $value;
  25.                 }
  26.             }
  27.         }
  28.         foreach($this-&#62;a_template as $value) {
  29.             print($value);
  30.         }
  31.     }
  32. }
  33.  
  34. //入力確認
  35. class Input
  36. {
  37.     private $inputString;
  38.     private $inputStringFalse;
  39.  
  40.     function set_string($string)
  41.     {
  42.         if($this-&#62;check_format($string)) {
  43.             $this-&#62;inputString = $string;
  44.             $result = TRUE;
  45.         } else {
  46.             $this-&#62;inputStringFalse = $string;
  47.             $result = FALSE;
  48.         }
  49.         return $result;
  50.     }
  51.  
  52.     function get_string()
  53.     {
  54.         return $this-&#62;inputString;
  55.     }
  56.     function get_string_false()
  57.     {
  58.         return $this-&#62;inputStringFalse;
  59.     }
  60.     function check_format($string)//入力値の確認
  61.     {
  62.         if(ereg(&#39;^[0-9][0-9][0-9]&#92;-?[0-9][0-9][0-9][0-9]$&#39;, $string) ) {
  63.             $string = str_replace(&#39;-&#39;, &#39;&#39;, $string);
  64.             $result = TRUE;
  65.         } else {
  66.             $result = FALSE;
  67.         }
  68.         return $result;
  69.     }
  70. }
  71.  
  72. //POSTされた内容に応じて画面表示 データを自前で持たせてしまって失敗
  73. class Select_Output
  74. {
  75.     private $formString;
  76.     private $mode;
  77.     private $inputFlg;
  78.  
  79.     function __construct($flg)
  80.     {
  81.         $this-&#62;inputFlg = $flg;
  82.     }
  83.     function set_form_string($string)
  84.     {
  85.         $this-&#62;formString = htmlspecialchars($string);
  86.     }
  87.     function output()
  88.     {
  89.         $o_template = new My_Template();
  90.         $o_input = new Input();
  91.  
  92.         switch($this-&#62;inputFlg) {
  93.             case NULL:
  94.                 $this-&#62;mode = 0;
  95.             case &#39;0&#39;:   //入力画面からPOSTされた場合
  96.                 if($o_input-&#62;set_string($this-&#62;formString) ) {
  97.                     $this-&#62;mode = 1;
  98.                 } else {
  99.                     $this-&#62;mode = 999;
  100.                 }
  101.                 break;
  102.             case &#39;1&#39;:   //確認画面から戻った場合
  103.                 $this-&#62;mode = 0;
  104.                 break;
  105.             case &#39;2&#39;:   //確認画面から進んだ場合
  106.                 $this-&#62;mode = 2;
  107.                 break;
  108.         }
  109.         switch($this-&#62;mode) {
  110.             case &#39;0&#39;:
  111.                 $o_template-&#62;set_template(TEMPLATE_DIR . &#39;Input.tpl&#39;);
  112.                 $o_template-&#62;set_replace_word(&#39;code&#39;, $this-&#62;formString);
  113.                 $o_template-&#62;set_replace_word(&#39;message&#39;, &#39;郵便番号を入力してください&#39;);
  114.                 $o_template-&#62;output_replaced();
  115.                 break;
  116.             case &#39;1&#39;:
  117.                 $o_template-&#62;set_template(TEMPLATE_DIR . &#39;Confirm.tpl&#39;);
  118.                 $o_template-&#62;set_replace_word(&#39;code&#39;, $o_input-&#62;get_string());
  119.                 $o_template-&#62;output_replaced();
  120.                 break;
  121.             case &#39;2&#39;:
  122.                 $o_template-&#62;set_template(TEMPLATE_DIR . &#39;Result.tpl&#39;);
  123.                 if(!ereg(&#39;&#92;-&#39;, $this-&#62;formString) ) {
  124.                     $code = substr($this-&#62;formString, 0,3) . &#39;-&#39; . substr($this-&#62;formString, 3, 6);
  125.                 } else {
  126.                     $code = $this-&#62;formString;
  127.                 }
  128.                 $o_template-&#62;set_replace_word(&#39;code&#39;, $code);
  129.                 $o_template-&#62;output_replaced();
  130.                 break;
  131.             default:
  132.                 $o_template-&#62;set_template(TEMPLATE_DIR . &#39;Input.tpl&#39;);
  133.                 if($this-&#62;formString == NULL) {
  134.                     $message = &#39;入力されていません&#39;;
  135.                 } else {
  136.                     $message = &#39;入力内容が正しくありません&#39;;
  137.                 }
  138.                 $o_template-&#62;set_replace_word(&#39;code&#39;, $this-&#62;formString);
  139.                 $o_template-&#62;set_replace_word(&#39;message&#39;, $message);
  140.                 $o_template-&#62;output_replaced();
  141.  
  142.         }
  143.     }
  144. }
  145. ?&#62;

./template/Input.tpl

PHP:
  1. &#60;!DOCTYPE HTML PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34;&#62;
  2. &#60;html&#62;
  3. &#60;head&#62;
  4. &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34;&#62;
  5. &#60;title&#62;郵便番号入力&#60;/title&#62;
  6. &#60;/head&#62;
  7. &#60;body&#62;
  8. &#60;form method=&#34;POST&#34; action=&#34;Zipcode.php&#34;&#62;
  9. &#60;input type=&#34;text&#34; name=&#34;zipcode&#34; value=&#34;{mytmp:code}&#34;&#62;
  10. &#60;input type=&#34;hidden&#34; name=&#34;input_flg&#34; value=&#34;0&#34;&#62;
  11. &#60;input type=&#34;submit&#34; value=&#34;送信&#34;&#62;
  12. &#60;/form&#62;
  13. {mytmp:message}
  14.  
  15. &#60;/body&#62;
  16. &#60;/html&#62;

./template/confirm.tpl

PHP:
  1. &#60;!DOCTYPE HTML PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34;&#62;
  2. &#60;html&#62;
  3. &#60;head&#62;
  4. &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34;&#62;
  5. &#60;title&#62;郵便番号入力&#60;/title&#62;
  6. &#60;/head&#62;
  7. &#60;body&#62;
  8. &#60;form method=&#34;POST&#34; action=&#34;Zipcode.php&#34;&#62;
  9. 入力された値は{mytmp:code}です。
  10. &#60;input type=&#34;hidden&#34; name=&#34;zipcode&#34; value=&#34;{mytmp:code}&#34;&#62;
  11. &#60;input type=&#34;hidden&#34; name=&#34;input_flg&#34; value=&#34;1&#34;&#62;
  12. &#60;input type=&#34;submit&#34; value=&#34;戻る&#34;&#62;
  13. &#60;/form&#62;
  14.  
  15. &#60;form method=&#34;POST&#34; action=&#34;zipcode.php&#34;&#62;
  16. &#60;input type=&#34;hidden&#34; name=&#34;zipcode&#34; value=&#34;{mytmp:code}&#34;&#62;
  17. &#60;input type=&#34;hidden&#34; name=&#34;input_flg&#34; value=&#34;2&#34;&#62;
  18. &#60;input type=&#34;submit&#34; value=&#34;次へ&#34;&#62;
  19. &#60;/form&#62;
  20.  
  21. &#60;/body&#62;
  22. &#60;/html&#62;

./template/Result.tpl

PHP:
  1. &#60;!DOCTYPE HTML PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34;&#62;
  2. &#60;html&#62;
  3. &#60;head&#62;
  4. &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34;&#62;
  5. &#60;title&#62;郵便番号入力&#60;/title&#62;
  6. &#60;/head&#62;
  7. &#60;body&#62;
  8. &#60;form method=&#34;POST&#34; action=&#34;Zipcode.php&#34;&#62;
  9. {mytmp:code}が保存されました。嘘。
  10. &#60;input type=&#34;hidden&#34; name=&#34;input_flg&#34; value=&#34;0&#34;&#62;
  11. &#60;input type=&#34;submit&#34; value=&#34;戻る&#34;&#62;
  12. &#60;/form&#62;
  13.  
  14. &#60;/body&#62;
  15. &#60;/html&#62;

by Ayas 0 comments Category: PHP