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;
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');
ここ最近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年4月から6月までクライアント先での常駐作業をしていたため(セキュリティ対策上のノートPC持ち込む不可)、更新できず、申し訳御座いませんでした。
今月2008年7月から自分の事務所での作業となります。
常駐作業は、自分のワークスタイルに合わないので当面行わないつもりです。
勤務形態がSOHOでよろしければ、WEBシステム系のお仕事をお受けいたします。
今後も何卒宜しく御願い致します。
P.S.
実績を更新しました。
WEB+DBシステム系の情報や仕事の実績以外も投稿することにしました。
その第一弾!
ニコニコ動画で興味深い動画を見つけました。
税金の無駄使いとか思っている人がいるみたいだけど、本を大切にしているからこそこんな美しい図書館が建築されるのでしょう。
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で動作確認しています。
既存システムとか開発途中ですと、この関数に修正するのは大変ですが。。。
LAMPセキュリティを強化する4つの方法:CodeZine
CodeZineさん、こんな誤った記事は速やかに削除してください。
「PHP = トラブル」とか「Perl、Python、Rubyのどれかを使う方が良いでしょう」やら、あいた口がふさがりません。
なんというかとトンデモ科学の域に達しています。
PHPのセキュリティ情報配信などで有名なYasuo Ohgaki (大垣 靖男)さんは以下のようにBLOGでおっしゃっています。
言語を替える事はセキュリティ問題の解決策にはなりません。
via 誤解を招く記事 – LAMPセキュリティを強化する4つの方法
そのとおりだと思います。
「Perl、Python、Rubyなら大丈夫」、それは思考停止にほかなりません。
どんな言語でも、セキュリティについて学習し細心の注意を払って対策しない限り、セキュリティホールはなくなりません。
LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠
通常設定で下記のように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でファイルの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);

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