ページ: << 1 ... 3 4 5 6 7 8 9 10 11 12 13 ... 24 >>

CakePHPでSQLにExplainをかけるコンポーネント(PostgreSQL用)

パーマリンク 2009/03/10 17:01:38 著者: あつ メール
カテゴリ: PHP, CakePHP

cakephperさんが作ってくれた開発環境で自動でSQLにExplainをかけるコンポーネント バージョンアップ(1.0)を早速使ってみましたが、

??

表示されるけど、なんか物足りない。。。。

cakephperさんの記事に紹介されているのは、MySQLのExplainなので、あのように色んな情報がでるんですね。

PostgreSQLでは項目がQUERY PLANしかない。
それも$db->queryの結果で配列で返してくれて、その配列の2番目以降はこのコンポーネントでは無視されるようなので、ちょっと物足りない情報しか出ていなかったんですね。

ということで、無理やり配列をくっつけてみました。

foreach( $db->_queriesLog as $key => $value ){

    if( preg_match( '/^SELECT /i', $value['query'] ) && $value['took'] >= $slowQueryThreshold ){

        $reesults = null;
        $results = $db->query( "Explain ". $value['query'] );

        $results[0][0]['query'] =  $value['query'];
        $results[0][0]['id'] = $count;

        $query_plan = null;
        foreach ($results as $result_value) {
            $query_plan .= $result_value[0]['QUERY PLAN'] . "<br>\n";
        }
        $results[0][0]['QUERY PLAN'] = $query_plan;

        $explain_results[] = $results[0][0];
        $count++;
    }
}

※showExplainSQLの該当部分のみ

すごく便利です。

[追記] 
トラックバックしたら、早速対応して頂きました。
最新バージョンは下記からどうぞ。
開発環境で自動でSQLにExplainをかけるコンポーネント バージョンアップ(1.1) PostgreSQL対応

CakePHPポケットリファレンス

CakePHPのDebug Kitが便利そう

パーマリンク 2009/03/01 12:59:33 著者: あつ メール
カテゴリ: PHP, CakePHP

CakePHPのDebug Kitをちょっとだけ使ってみました。

導入方法。

gitでプログラムをコピー。


コピーしたファイルをCakeのapp/pluginsに設置。

そして、デバッグを行いたいControllerで

var $components = array('DebugKit.Toolbar');


で導入完了。

画面左上にCakePHPのアイコンが表示表示されるので、それをクリックすると、"History"や"Timer"などの項目が表示されます。
それぞれをクリックすると、色々な情報を見ることができます。

"Timer"の画面はこんな感じ。
CakePHPのDebug Kitが便利そう

なかなか便利そう。

まるごとPHP!(vol.2)

CakePHPのSet::Combineでグループ化が便利

パーマリンク 2009/02/19 14:01:58 著者: あつ メール
カテゴリ: PHP, CakePHP

selectボックスを作るときに使うSet::Combineですが、グループ指定を初めて使ってみました。

使い方は簡単。
第4パラメータにグループ化させたい項目を指定するだけです。

$list = Set::Combine($data, '{n}.Sample.id', '{n}.Sample.name', '{n}.Sample.perf');

こんな感じになります。
CakePHPのSet::Combineでグループ化が便利
セレクトボックスの内容がとても見やすくなります。

関連記事
Selectボックスの作り方

CakePHPポケットリファレンス

CakePHPの情報がより分かりやすくなった

パーマリンク 2009/02/07 16:26:58 著者: あつ メール
カテゴリ: PHP, CakePHP

CakePHPの情報がより分かりやすくなった

CakePHPの本家は英語のサイトですが、それが日本語で読めるようになりました。
http://cakephp.jp/

CakePHPがより身近になるのではないでしょうか。

CakePHPのことならCakePHPクッキングもどうぞ。

CakePHPによる実践Webアプリケーション開発

第17回高蔵寺SE勉強会をやりました

パーマリンク 2008/11/16 23:30:41 著者: あつ メール
カテゴリ: PHP, CakePHP, 勉強会・セミナー

第17回高蔵寺SE勉強会をやりました

第17回高蔵寺SE勉強会をやりました。

今回は社外から7名の方が参加してくださりました。
本当にありがとうございます。

まずはいつも通り、宿題から。

今回は、「カレンダーヘルパー」を作ろうです。
作ったのは、以下の内容。
・カウントダウンヘルパー
 特定の日までのカウントダウン
・カウントアップヘルパー
 特定の日からのカウントアップ
・Googleカレンダーヘルパー
 Googleカレンダーで公開されている情報の表示
実際のサンプルはこちら
ソースはこちら。
[Controller]

<?php
class CalendarController extends AppController
{
    var $uses = array();
    var $helpers = array('Calendar');

    function index()
    {
    }
}


[View]

<h2>カレンダーヘルパー</h2>
<br />
<br />
<b>カウントダウン</b><br />

誕生日まであと<?php e(number_format($calendar->countDown('2009-11-13'))); ?>日<br />
誕生日まであと<?php e($calendar->countDown('2009-11-13', 'Y')); ?>年<?php e($calendar->countDown('2009-11-13', 'm')); ?>ヶ月<?php e($calendar->countDown('2009-11-13', 'd')); ?>日<br />

<br />
<br />
<b>カウントダウン</b><br />
2020年まであと<?php e(number_format($calendar->countDown('2020-01-01'))); ?>日<br />
2020年まであと<?php e($calendar->countDown('2020-01-01', 'Y')); ?>年<?php e($calendar->countDown('2020-01-01', 'm')); ?>ヶ月<?php e($calendar->countDown('2020-01-01', 'd')); ?>日<br />

<br />
<br />
<b>カウントアップ</b><br />
今日で生まれてから<?php e(number_format($calendar->countUp('1979-11-13'))); ?>日<br />
今日で生まれてから<?php e($calendar->countUp('1979-11-13', 'Y')); ?>年<?php e($calendar->countUp('1979-11-13', 'm')); ?>ヶ月<?php e($calendar->countUp('1979-11-13', 'd')); ?>日<br />

<br />
<br />
<b>カレンダー</b><br />
<?php e($calendar->googleCalendar('2008', '11', 'http://www.google.com/calendar/feeds/fvijvohm91uifvd9hratehf65k%40group.calendar.google.com/public/basic')); ?>


[Helper]

<?php
/**
 * Calendar Helper
 *
 * @package		cake
 * @subpackage	cake.cake.libs.view.helpers
 *
 * @modifiedby      $LastChangedBy: あつ $
 * @lastmodified    $Date: 2008-11-08 20:40 $
 */
class CalendarHelper extends AppHelper
{
    /**
     * 指定日までの日数を返す
     *
     * @param   string  $date       指定日(2006-12-27 or 06-12-27 separators can be a space, period, dash, forward slash)
     * @param   string  $format     返り値のフォーマット(null:日、Y:年月日の年、m:年月日の月、d:年月日の日)
     * @return  integer or false    指定日までの日数
     */
    function countDown($date, $format = null)
    {
        // 日付の妥当性チェック
        $validation = & new Validation();
        if (!$validation->date($date)) {
            return false;
        }

        // separatorsがperiodなどの場合、strtotimeが正常に機能しないので、無理やりslash+年を4桁に変換
        if (!preg_match('%^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\\\\/|-|\\\\.|\\\\x20)(?:0?2\\\\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\\\\d)?\\\\d{2})(\\\\/|-|\\\\.|\\\\x20)(?:(?:(?:0?[13578]|1[02])\\\\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\\\\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\\\\2(?:0?[1-9]|1\\\\d|2[0-8]))))$%', $date, $matches)) {
            return false;
        }
        $date_array = explode($matches[2], $matches[0]);
        if (strlen($date_array[0]) == 2) {
            $date_array[0] = '20' . $date_array[0];
        }
        $date = $date_array[0] . '/' . $date_array[1] . '/' . $date_array[2];

        // 日付の妥当性チェック2
        if ($date < date('Y/m/d')) {
            return false;
        }

        // カウントダウン算出
        switch ($format) {
            case 'Y':
                $cowntdown = date('Y', strtotime($date) - strtotime(date('Y-m-d'))) - 1970;
                if ($cowntdown < 0) {
                    return false;
                }
                break;
            case 'm':
                $cowntdown = date('m', strtotime($date) - strtotime(date('Y-m-d'))) - 1;
                if ($cowntdown < 0) {
                    return false;
                }
                break;
            case 'd':
                $cowntdown = date('d', strtotime($date) - strtotime(date('Y-m-d'))) - 1;
                if ($cowntdown < 0) {
                    return false;
                }
                break;
            default:
                $cowntdown = (strtotime($date) - strtotime(date('Y-m-d'))) / (24 * 60 * 60);
                if ($cowntdown < 0) {
                    return false;
                }
                break;
        }

        return $cowntdown;
    }

    /**
     * 指定日からの日数を返す
     *
     * @param   string  $date       指定日(2006-12-27 or 06-12-27 separators can be a space, period, dash, forward slash)
     * @param   string  $format     返り値のフォーマット(null:日、Y:年月日の年、m:年月日の月、d:年月日の日)
     * @return  integer or false    指定日からの日数
     */
    function countUp($date, $format = null)
    {
        // 日付の妥当性チェック
        $validation = & new Validation();
        if (!$validation->date($date)) {
            return false;
        }

        // separatorsがperiodなどの場合、strtotimeが正常に機能しないので、無理やりslash+年を4桁に変換
        if (!preg_match('%^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\\\\/|-|\\\\.|\\\\x20)(?:0?2\\\\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\\\\d)?\\\\d{2})(\\\\/|-|\\\\.|\\\\x20)(?:(?:(?:0?[13578]|1[02])\\\\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\\\\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\\\\2(?:0?[1-9]|1\\\\d|2[0-8]))))$%', $date, $matches)) {
            return false;
        }
        $date_array = explode($matches[2], $matches[0]);
        if (strlen($date_array[0]) == 2) {
            $date_array[0] = '20' . $date_array[0];
        }
        $date = $date_array[0] . '/' . $date_array[1] . '/' . $date_array[2];

        // 日付の妥当性チェック2
        if ($date > date('Y/m/d')) {
            return false;
        }

        // カウントアップ算出
        switch ($format) {
            case 'Y':
                $cowntup = date('Y', strtotime(date('Y-m-d')) - strtotime($date)) - 1970;
                if ($cowntup < 0) {
                    return false;
                }
                break;
            case 'm':
                $cowntup = date('m', strtotime(date('Y-m-d')) - strtotime($date)) - 1;
                if ($cowntup < 0) {
                    return false;
                }
                break;
            case 'd':
                $cowntup = date('d', strtotime(date('Y-m-d')) - strtotime($date)) - 1;
                if ($cowntup < 0) {
                    return false;
                }
                break;
            default:
                $cowntup = (strtotime(date('Y-m-d')) - strtotime($date)) / (24 * 60 * 60);
                if ($cowntup < 0) {
                    return false;
                }
                break;
        }

        return $cowntup;
    }

	/**
	 * Googleカレンダーを表示
	 *
     * @param   integer $year       表示する年
     * @param   integer $month      表示する月
     * @param   string  $url        GoogleカレンダーのURL
     * @return  string              カレンダー
	 */
	function googleCalendar($year, $month, $url)
    {
        // Googleカレンダーの情報取得
        $events = $this->getEvents($year, $month, $url);

        $weekday_j = array('日', '月', '火', '水', '木', '金', '土');
        $line_feed = "\\n";

        // 月の最終日を取得
        $last_day = $this->getLastDay($year, $month);

        // カレンダー生成
        $calendar  = '<table border="1">' . $line_feed;
        for ($day = 1; $day <= $last_day; $day++) {
            // 曜日を取得
            $weekday = $this->getWeekday($year, $month, $day);

            $calendar .= '<tr>' . $line_feed;
            $calendar .= '<td>' . $weekday_j[$weekday] . '</td>' . $line_feed;
            $calendar .= '<td>' . $day . '</td>' . $line_feed;
            $calendar .= '<td>';
            if (isset($events[$year][$month][$day])) {
                foreach ($events[$year][$month][$day] as $value) {
                    $calendar .= $value . '<br />';
                }
            } else {
                $calendar .= '&nbsp;';
            }
            $calendar .= '</td>' . $line_feed;
            $calendar .= '</tr>' . $line_feed;
        }
        $calendar .= '</table>' . $line_feed;

        return $calendar;
	}

	/**
	 * イベント情報を返す
	 *
     * @param   integer $year       年
     * @param   integer $month      月
     * @param   string  $url        GoogleカレンダーのURL
     * @return  array               イベント情報
	 */
	function getEvents($year, $month, $url)
    {
        uses('Xml');
        $startmin = $year . '-' . $month . '-01';
        $startmax = date('Y-m-d', strtotime('1 month', strtotime($startmin)));
        $url .= '?start-min=' . $startmin . '&start-max=' . $startmax . '&max-results=5000&orderby=starttime';
        $xml = new Xml($url);
        $data = Set::reverse($xml);
        $events = array();
        if (isset($data['Feed']['Entry'])) {
            foreach ($data['Feed']['Entry'] as $value) {
                // 詳細URL取得
                $detail_url = '';
                // 正規表現参考:http://phpspot.net/php/pg%90%B3%8BK%95%5C%8C%BB%81F%90%B3%82%B5%82%A2%82t%82q%82k%82%A9%82%C7%82%A4%82%A9%92%B2%82%D7%82%E9.html
                if (preg_match("/(https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)/", $value['content']['value'], $matches)) {
                    $detail_url = $matches[0];
                }

                if (preg_match("/((\\d{4})\\/(\\d{2})\\/(\\d{2})).+((\\d{4})\\/(\\d{2})\\/(\\d{2}))/", $value['summary']['value'], $matches)) {
                    // 複数期間の場合は、期間全ての日に表示
                    $date = $matches[1];
                    $period = (strtotime($matches[5]) - strtotime($matches[1])) / (24 * 60 * 60);
                    for($i = 0; $i <= $period; $i++) {
                        $date_array = explode('/', $date);
                        if (!empty($detail_url)) {
                            $events[$date_array[0]][(int)$date_array[1]][(int)$date_array[2]][] = '<a href="' . $detail_url. '">' . $value['title']['value'] . '</a>';
                        } else {
                            $events[$date_array[0]][(int)$date_array[1]][(int)$date_array[2]][] = $value['title']['value'];
                        }
                        $date = date('Y/m/d', strtotime('1 day' ,strtotime($date)));
                    }
                } elseif (preg_match("/((\\d{4})\\/(\\d{2})\\/(\\d{2}))/", $value['summary']['value'], $matches)) {
                    if (!empty($detail_url)) {
                        $events[$matches[2]][(int)$matches[3]][(int)$matches[4]][] = '<a href="' . $detail_url. '">' . $value['title']['value'] . '</a>';
                    } else {
                        $events[$matches[2]][(int)$matches[3]][(int)$matches[4]][] = $value['title']['value'];
                    }
                } 
            }
        }

		return $events;
	}

	/**
	 * 月の最終日を返す
	 *
     * @param   integer $year       年
     * @param   integer $month      月
     * @return  integer             月の最終日
	 */
	function getLastDay($year, $month)
    {
		$result = date('t', mktime(0, 0, 0, $month, 1, $year));
		return $result;
	}

	/**
	 * 曜日を返す
	 *
     * @param   integer $year       年
     * @param   integer $month      月
     * @param   integer $day        日
     * @return  integer             1日の曜日
	 */
	function getWeekday($year, $month, $day)
    {
		$result = date('w', mktime(0, 0, 0, $month, $day, $year));
		return $result;
	}
}
?>

Googleカレンダーについては、表示のパターンがいくつかありそうなので、このロジックでうまくいかないケースもあると思います。
参加者の方に意見も頂きましたので、今後に生かしていきたいと思います。

昼からは発表で、僕は「CakePHP開発事例の紹介」と「CakePHP簡単問合せフォームの作り方」を発表しました。
発表資料は高蔵寺SE勉強会ブログに書いてありますので、そちらをご覧ください。

他の方の発表は大変参考になる内容で、今後の開発に十分生かしていけそうです。

最後に全体の感想ですが、今回は初心者・入門者向けということでやりましたが、完全にその期待に沿えるものではなかったような気がしています。
色々なご意見を頂きましたので、今後の勉強会の運営に役立てていきたいと思います。
今回お越し下さった皆様、本当にありがとうございます。

<< 1 ... 3 4 5 6 7 8 9 10 11 12 13 ... 24 >>

あつ

Facebookやってます

愛知県名古屋市在住のWEBシステム屋(SE・プログラマ)。株式会社一六社(いちろくしゃ)所属。PHP、 CakePHPを利用して日々開発中。WEBで地域活性化を目指します。好き:フットサル/GTD/Mac/ 住んだことのある場所:一宮(愛知)、豊田(愛知)、浜松(静岡)、浦添(沖縄)、中津川(岐阜)、名古屋(愛知)

検索

タグクラウド

勉強会

欲しい物リストの全て

レコメンデーションエンジン

16ブログ     powered by b2evolution