INFINITY BLUE
msgbartop
ご訪問ありがとうございます。『INFINITY BLUE』は、WEB+DB開発の情報や仕事の実績などを紹介しています。
msgbarbottom

2008年07月24日 21時15分(木) CakePHP: ver1.2 FormHelperの“月”を数字で表示

CakePHP ver1.2.0.7296 RC2で確認しました。

いままで、Formヘルパーを修正しないと表示されませんでしたが、オプションの’monthNames’ => falseで、数値で表示されるようになりました。

使い方 例)

< ?php echo $form->input('fieldName', array('type' => 'datetime', 'dateFormat' => 'YMD', 'timeFormat' => '12', null, 'monthNames' => false, 'label' => false, 'div' => false, 'error' => false)); ?>
< ?php echo $form->month('$fieldName', $selected = null, $attributes = array('monthNames' => false), $showEmpty = true); ?>

Formヘルパーの該当ソース箇所)
cake/lib/views/helper/form.php
P.1658

function __generateOptions($name, $options = array()) {
省略……
case 'month':
if ($options['monthNames']) {
$data['01'] = __('January', true);
$data['02'] = __('February', true);
$data['03'] = __('March', true);
$data['04'] = __('April', true);
$data['05'] = __('May', true);
$data['06'] = __('June', true);
$data['07'] = __('July', true);
$data['08'] = __('August', true);
$data['09'] = __('September', true);
$data['10'] = __('October', true);
$data['11'] = __('November', true);
$data['12'] = __('December', true);
} else {
for ($m = 1; $m < = 12; $m++) {
$data[sprintf("%02s", $m)] = strftime("%m", mktime(1, 1, 1, $m, 1, 1999));
}
}
break;

2008年07月18日 19時49分(金) CakePHP: h()関数がアップデートされていました。

CakePHP 1.2.0.7296-rc2で確認したのですが、h()関数がアップデートされていました。

cake/cake/basics.php

function h($text, $charset = null) {
	if (is_array($text)) {
		return array_map('h', $text);
	}
	if (empty($charset)) {
		$charset = Configure::read('App.encoding');
	}
	if (empty($charset)) {
		$charset = 'UTF-8';
	}
	return htmlspecialchars($text, ENT_QUOTES, $charset);
}

App.encodingは、cake/app/config/core.phpで設定します。

/**
 * Application wide charset encoding
 */
      Configure::write('App.encoding', 'UTF-8');

2008年07月16日 21時49分(水) Windows版PHP5.2.6でPostgreSQL関連ライブラリ読み込み失敗のバグ

ここ最近PHP+PostgreSQLでの開発をしていなかったので、調査に時間がかかってしまった。。。

PHP5.2.6でPostgreSQLに接続で下記のエラーが表示される。

Fatal error: Call to undefined function pg_connect()

PHPINFOでは、PostgreSQL設定関連が表示されていなかった。
php.iniのextension=php_pdo_pgsql.dllのコメントアウトを外していないという凡ミスではなく、Windows版PHP5.2.6自体のバグらしい。

日本PHPユーザ会のメーリングリストで報告されていた。

http://bugs.php.net/にも報告されていた。
Bug #44905 PHP 5.2.6 fails to load PostgreSQL related libraries

2008年07月05日 21時27分(土) 近況: 2008年7月

2008年4月から6月までクライアント先での常駐作業をしていたため(セキュリティ対策上のノートPC持ち込む不可)、更新できず、申し訳御座いませんでした。
今月2008年7月から自分の事務所での作業となります。

常駐作業は、自分のワークスタイルに合わないので当面行わないつもりです。

勤務形態がSOHOでよろしければ、WEBシステム系のお仕事をお受けいたします。

今後も何卒宜しく御願い致します。

P.S.
実績を更新しました。

CakePHP ポケットリファレンス (Pocket Reference)

2008年04月19日 17時19分(土) 雑記: 世界の美しい図書館集めてみた[ニコ動]

WEB+DBシステム系の情報や仕事の実績以外も投稿することにしました。

その第一弾!

ニコニコ動画で興味深い動画を見つけました。

税金の無駄使いとか思っている人がいるみたいだけど、本を大切にしているからこそこんな美しい図書館が建築されるのでしょう。

2008年04月18日 00時16分(金) CakePHP: h()関数のクオート変換モードの続き

CakePHP Users in Japan フォーラムから訪問された方ありがとうございます。

フォーラムでcakePHP: h()関数のクオート変換モードのカスタマイズ
が紹介されていたとは、昨日まで気付きませんでした。

すみません。最近CakePHP関連の記事が少ないです。
上記記事の開発(2007年11月)を最後に、CakePHPを利用した開発案件が先週までなかったせいです。

とはいえ、それでは本当に申し訳ないので大急ぎでネタを用意しました。
先週の開発で行った「htmlspecialchars()関数クオート変換モード」の対応を発表します。

CakePHPのコア部分に手をいれたくなかったので、
app/config/bootstrap.phpに以下のような関数を新たに追加しました。

function h2($text, $quote_style=ENT_QUOTES) {
if (is_array($text)) {
return array_map('h', $text, $quote_style);
}
return htmlspecialchars($text, $quote_style);
}

CakePHP Stable: 1.1.19.6305で動作確認しています。

既存システムとか開発途中ですと、この関数に修正するのは大変ですが。。。

PHPサイバーテロの技法―攻撃と防御の実際

2008年03月21日 12時27分(金) トンデモなセキュリティ対策>>LAMPセキュリティを強化する4つの方法:CodeZine

LAMPセキュリティを強化する4つの方法:CodeZine
CodeZineさん、こんな誤った記事は速やかに削除してください。

「PHP = トラブル」とか「Perl、Python、Rubyのどれかを使う方が良いでしょう」やら、あいた口がふさがりません。
なんというかとトンデモ科学の域に達しています。

PHPのセキュリティ情報配信などで有名なYasuo Ohgaki (大垣 靖男)さんは以下のようにBLOGでおっしゃっています。
言語を替える事はセキュリティ問題の解決策にはなりません。
via 誤解を招く記事 – LAMPセキュリティを強化する4つの方法

そのとおりだと思います。
「Perl、Python、Rubyなら大丈夫」、それは思考停止にほかなりません。

どんな言語でも、セキュリティについて学習し細心の注意を払って対策しない限り、セキュリティホールはなくなりません。


LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠

PHPサイバーテロの技法―攻撃と防御の実際

2008年03月13日 12時14分(木) 備忘録:PDOStatement->fetch()をを2回使用する場合

通常設定で下記のようにPDOStatement->fetch()を2回使用すると、エラーとなります。
コード:

dsn = 'mysql:host=接続先;dbname=データベース名'
$user = 'ユーザ名'
$pass = 'パスワード'
$dbh = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => 1));
// エラーが発生した場合、PDOException を投げるように設定
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// QUERY
$stmt = $dbh->prepare("SELECT * FROM customer ORDER BY id");
$result = $stmt->execute();
while ($rows = $stmt->fetch(PDO::FETCH_ASSOC)) {
// var_dump($rows);
// プリペアドステートメント
$sub_stmt = $dbh->prepare("SELECT * FROM order_summary WHERE id = :id");
// 値をパラメータにバインドする
$sub_stmt->bindParam(":id", $rows["id"]);
// 実行
$result = $sub_stmt->execute();
while ($sub_rows = $sub_stmt->fetch(PDO::FETCH_ASSOC)) {
var_dump($sub_rows);
}
// カーソルを閉じてステートメントを再実行できるようにする
$sub_stmt->closeCursor();
$sub_stmt = null;
}
// カーソルを閉じてステートメントを再実行できるようにする
$stmt->closeCursor();
$stmt = null;
} catch (PDOException $e) {
var_dump($e->getMessage());
}

エラー内容:

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

回避策は、PDOStatement::fetchAll()を使用するか、PDO::MYSQL_ATTR_USE_BUFFERED_QUERYをtrueの設定にすればよいのですが、
PHPのマニュアル::MySQL 関数 (PDO_MYSQL)では、PDOStatement::fetchAll()を推奨しています。
MySQLでしか利用できない、また他データベースと互換性のない設定だからでしょう。
抜粋:
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (integer)
PDOStatement でこの属性を TRUE に設定すると、 MySQL ドライバはバッファ版の MySQL API を使用します。 移植性の高いコードを書くには、代わりに PDOStatement::fetchAll() を使用すべきです。

Example#1 mysql でクエリのバッファリングを強制する

< ?php
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
$stmt = $db->prepare('select * from foo',
array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
} else {
die("このアプリケーションは mysql でしか動作しません。代わりに \$stmt->fetchAll() を使用すべきです");
}
?>

しかし万件単位のデータを扱い場合PDOStatement::fetchAll()ではメモリオーバーフローしてしまう可能性があります。
そう考えると、PDO->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);の方がよいのか……
SQLのLIMIT句で上手く制御すれば良いだけかもしれませんが……
PHP辞典 第2版 (DESKTOP REFERENCE)Pocket詳解 PHP辞典 (Pocket詳解)PHP辞典 (Desktop reference)

2008年02月24日 17時09分(日) 備忘録: PEAR::Archive_Tar

PHPでファイルのtar圧縮・解凍を行う場合、PEARライブラリのArchive_Tarを利用すると良いでしょう。
gz, bz2形式も扱えます。
注意:PHPにzlibのエクステンションが必要です。

圧縮例)

$archiveFile = "archive.tar.gz";
// インスタンス
$Tar = new Archive_Tar($archiveFile, "gz");
$fileList[0] = "file1.txt"; // ファイル
$fileList[1] = "/tmp/work/"; // ディレクトリ
// tar.gzファイル作成
$Tar->create($fileList);
// 追加
$fileList[0] = "/tmp/work1/file2.txt"; // ファイル
$fileList[1] = "/tmp/work2/"; // ディレクトリ
$Tar->add($fileList);

PEAR入門 PHP標準ライブラリを極める!PEAR―PHPライブラリ

2008年02月09日 17時42分(土) CakePHP: 第二回CakePHP勉強会

via Event Entry::第2回CakePHP勉強会
第二回CakePHP勉強会が開催されるそうですが、既に満員みたいです。
自分は多忙なので行けないけど、次回があれば参加したいですね。

CakePHPガイドブックFast CakePHP (LLフレームワークBOOKS # 4)