カテゴリー : PHP

[PHP][PEAR] Column count of mysql.proc is wrong. エラーの解決方法

PHP で PEAR::DB を使って UPDATE 文を発行したら DB Error: unknown error というエラーが発生しました。

getMessage() でのエラー内容

DB Error: unknown error

このエラー内容では何の手掛かりにもならないので、もっと詳しいエラー内容を getDebugInfo() で取得してみました。

  • getMessage() : DB Error: unknown error
  • getDebugInfo() : INSERT INTO テーブル名 (列名1,列名2,列名3) VALUES(値1,値2,値3) [nativecode=1364 ** Field ‘列名4’ doesn’t have a default value]

エラーを getDebugInfo() で取得してみると、自分のエラーは以下の通りでした。
 
続きを読む

[Symfony1.4][Validator] カスタムバリデータを作成する方法

 

Symfony1.4で、カスタムバリデータを作成する方法を調べて、実践したのでメモ。
 

まず、カスタムバリデータを作る前に、自分が使いたいバリデータが既存のものにないか確認します。
 

symfony Forms in Action | 付録 B – バリデータ | symfony | Web PHP Framework
 

使いたいバリデータがない場合は、自分で作ります。
 

カスタムバリデータを作るときに参考になった記事は、Symfony1.4だと以下の通りです。
 

The More with symfony book | カスタムウィジェットとバリデータ | symfony | Web PHP Framework

symfonyでカスタムバリデータを使ってフィルタを実装する – spanstyle::monolog

symfonyのValidatorで全角/半角変換などを行う – ゆっくり*ゆっくり
 

実際に、書籍を特定するための番号であるISBNを入力値の長さと文字の構成を確認するバリデータを作ってみました。
 

ちなみに、ISBNは、ISBN-10だと10桁で、1桁目が 0 ~ 9 、X が使用され、他の桁は数字です。ISBN-13は13桁で、数字のみで構成されています。
 

・参考:ISBN – Wikipedia
 

正規表現の使い方はこちらを参考にしました。
 

正規表現 | PHP Labo

正規表現
 

そして、実際に作ったのが下記のソースになります。
 

■ myValidatorIsbn.class.php
 

(ISBNの形式に合ってるか確認するバリデータ)
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
class validatorIsbn extends sfValidatorBase
{
	protected function doClean($value)
	{
		// 入力値の長さが10文字の場合、そのまま入力値を返す
		// ISBN-10は、1桁目が 0 ~ 9 、X で構成され、他の桁は数字
		if (strlen($value) == 10){
			if (preg_match("/^[0-9]{9}?[0-9X]$/" ,$value)){
				return $value;
			} else {
				throw new sfValidatorError($this, 'ISBN-10は1桁目は 0~9 、X、他の桁は数字で入力して下さい', array('value' => $value));
			}
		}
 
		// 入力値の長さが13文字の場合、そのまま入力値を返す
		if (strlen($value) == 13){
			// ISBN-13は数字のみで構成される
			if (preg_match("/^[0-9]{13}?$/" ,$value))
			{
				return $value;
			} else {
				throw new sfValidatorError($this, 'ISBN-13は数字のみで入力して下さい', array('value' => $value));
			}
		}
		// それ以外の場合、エラー
		throw new sfValidatorError($this, 'ISBNは10文字、または13文字で入力して下さい', array('value' => $value));
	}
}

 

■ IsbnSearchForm.class.php
 

(ISBNの入力フォームを定義しているフォームファイル)
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class IsbnSearchForm extends BaseForm
{
	public function configure()
	{
		$this->setWidgets(array(
			'isbn' => new sfWidgetFormInput(array(), array('size' => 20, 'maxlength' => 13, )),
		));
 
		$this->setValidators(array(
			'isbn' => new myValidatorIsbn(array('required' => true, ),
										  array('required' => '未入力', )),
		));
 
		$this->widgetSchema->setNameFormat('isbn_search[%s]');
 
		$this->widgetSchema->setLabels(array('isbn' => 'ISBN10/13', ));
	}
}

 

以上です。
 

[Symfony1.4] csrf token: Required.

 

Symfony1.4にて、フォームを作成して使ってみたらエラーが発生しました。
 

■ エラー内容

csrf token: Required.
 

■ 解決方法

フォーム内にHiddenフィールドを吐き出してなかったのが原因でした。

以下の内容をフォーム内に書けばOKです。
 

1
<?php echo $form->renderHiddenFields() ?>

 
以上です。
 

【参考】

さぼてん: 【symfony】_csrf_tokenとsetWidgets()

symfonyでCSRFがうまく動かない | OKWave

symfony1.2のCSRF対策について : アシアルブログ

csrf_secretを設定している場合のフォーム生成メモ – 偏った言語信者の垂れ流し
 

PHP の array_key_exists は Ruby では Hash#key? に対応する

 

PHP の array_key_exists みたいな処理を Ruby では Hash#key? を使って実現するみたいです。
 

■ PHP

1
2
3
$a = array('first' => 1, 'second' => 2);
var_dump( array_key_exists('first', $a) );
// => true

 

■ Ruby

1
2
3
animals = {:sheep => 1, :cow => 2};
puts animals.key?(:cow);
# => true

 
 
ハッシュ内にキーが存在するかどうか調べるメソッドは、includeの他にも、key, has_key, memberなどがあるみたいです。
 

【参考】

Convert PHP array_key_exists() to Ruby | PHP to Ruby はてなブックマーク - Convert PHP array_key_exists() to Ruby | PHP to Ruby

逆引きRuby – ハッシュ はてなブックマーク - 逆引きRuby - ハッシュ
 

[PHP] テスト環境 Lime の設定方法

PHPのテスト環境 Lime を使うための設定方法を調べたのでメモ。

lime.php をダウンロード

まず、Lime を使うためには lime.php をダウンロードする必要があります。

Limeというのは、PHPで単体テストを書くためのライブラリです。
ライブラリといってもただのクラスファイルで、lime.phpの1ファイルをインクルードするだけですぐ使えます。
「軽量・シンプル・かんたん」が好きなあなたにはぴったりです。

・引用元:[PHP]Lime.phpの最新バージョンをダウンロードする方法 – DQNEO起業日記 はてなブックマーク - [PHP]Lime.phpの最新バージョンをダウンロードする方法 - DQNEO起業日記

Limeの最新版をダウンロードしました。(最新版 ver 1.0.9: 2011/07/14 時点)

/tools/lime/tags/RELEASE_1_0_9/lib/lime.php – symfony – Trac はてなブックマーク - /tools/lime/tags/RELEASE_1_0_9/lib/lime.php - symfony - Trac

ダウンロードする場所がかなり分かりにくいのですが、ページ下部の

Download in other formats:
Plain Text | Original Format

からダウンロードできます。

また、過去のバージョンも以下のリンクから確認することができます。

/tools/lime/tags – symfony – Trac はてなブックマーク - /tools/lime/tags - symfony - Trac

テストユニット:Lime を使うときに参考になりそうな記事

その他、参考になりそうな記事。

■ 公式

LimeTestingFramework – symfony – Trac はてなブックマーク - LimeTestingFramework - symfony - Trac

Practical symfony | 8日目: ユニットテスト | symfony | Web PHP Framework はてなブックマーク - Practical symfony | 8日目: ユニットテスト | symfony | Web PHP Framework

A Gentle Introduction to symfony | 第15章 – ユニットテストと機能テスト | symfony | Web PHP Framework はてなブックマーク - A Gentle Introduction to symfony | 第15章 - ユニットテストと機能テスト | symfony | Web PHP Framework

■ ブログ記事

新しく採用されたテスティングフレームワークlimeの紹介 – lime without symfony part 1 « symfonyで開発日記 はてなブックマーク - 新しく採用されたテスティングフレームワークlimeの紹介 – lime without symfony part 1 « symfonyで開発日記

limeでなるべく気軽にユニットテストを書く – id:anatooのブログ はてなブックマーク - limeでなるべく気軽にユニットテストを書く - id:anatooのブログ

PHPでTest::MoreするならLimeを使おう – Lism.in * blog – nekoya (id:studio-m) はてなブックマーク - PHPでTest::MoreするならLimeを使おう - Lism.in * blog - nekoya (id:studio-m)

[PHP] limeでTDDを体験する – DQNEO起業日記 はてなブックマーク - [PHP] limeでTDDを体験する - DQNEO起業日記
 

以上です。
 

[PEAR] Amazon API の ItemSearch を使った複数キーワードでの検索方法

 

Amazon API を使える PEAR :: Services_Amazon の ItemSearch を使って、複数キーワードでの検索をしてみました。
 

・参考:Docs For Class Services_Amazon
 

ItemSearch の使い方サンプルは以下のようになっています。
 

1
2
3
4
5
6
7
8
9
10
11
<?php
 
$amazon = new Services_Amazon('[your Access Key ID here]', '[your Secret Access key here]');
 
$options = array();
$options['Keywords'] = 'sushi';
$options['ResponseGroup'] = 'ItemIds,ItemAttributes,Images';
 
$result = $amazon->ItemSearch('Books', $options);
 
 ?>

これの $options[‘Keywords’] の部分を下記のようにすれば、「書籍名」「著者名」「出版社名」と複数のキーワードで検索できます。
 

1
2
3
4
5
$title = '検索したい書籍名';
$author = '検索したい著者名';
$publisher = '検索したい出版社名';
 
$options['Keywords'] = $title . $author . $publisher;

 

このとき、キーワードに含まれる「書籍名」「著者名」「出版社名」は、検索時にAmazon側での区別はされていません。
 

Amazonには、これらの文字列3つを連結した文字列の内容で検索しています。
 

以上です。
 

[PEAR] Services_Amazon をインストールして Amazon API を使ってみました

PEARの Services_Amazon をインストールして Amazon API を使ってみました。

・参考:Amazon APIを使って簡単にランキングを取得する – EC studio 技術ブログ はてなブックマーク - Amazon APIを使って簡単にランキングを取得する - EC studio 技術ブログ
 

1. PEAR HTTP_Request2 のインストール

# pear install -a HTTP_Request2-alpha

※Services_Amazonで使用しているHTTP_Request内で使用しているので、まずこちらをインストール。

※インストールのバージョン(state)は最新のものを指定してください

※インストールする際に、依存するパッケージも合わせてインストールするため、オプションに「-a」を指定しています。

 

2. PEAR Services_Amazon のインストール

# pear install -a Services_Amazon-beta

 

3. ちゃんとインストールされたか確認

# pear list

以下の4つがインストールされていればOKです。(バージョンは、2011/05/17 時点)

Cache            1.5.6    stable
HTTP_Request2    2.0.0RC1 beta
Services_Amazon  0.8.0    beta
XML_Serializer   0.20.2   beta

 

以上です。
 

[Symfony1.4] Strict、Deprecated エラーや Warning を表示させない設定方法

 

Symfony1.4 にて、PEARを使うと、StrictエラーやらDeprecatedエラーやらが大量に出力されました。
 

エラーの出力設定を php.ini で変更したのですが、Symfonyのプログラムでは反映されていませんでした。
 

Symfonyには プロジェクトホーム/apps/frontend/config/settings.yml に error_reporting が書かれているので、php.ini の設定をこれで上書きしてしまっているようです。
 

ちなみに、「error_reporting」というワードが記載されているファイルは以下のように grep コマンドで探します。
 

1
2
3
4
5
# grep -R error_reporting ./
 
./cache/frontend/dev/config/config_settings.yml.php:  'sf_error_reporting' => 32767,
./apps/frontend/config/settings.yml:    error_reporting:        <?php echo (E_ALL | E_STRICT)."\n" ?>
./apps/frontend/config/settings.yml:    error_reporting:        <?php echo ((E_ALL | E_STRICT) ^ E_NOTICE)."\n" ?>

 

該当しそうな部分が見つかりました。
 

cache の config_settings.yml.php に ‘sf_error_reporting’ => 32767, とあり、32767 デフォルトのE_ALL | E_STRICTなので、php.ini の設定がSymfony側に反映されていないことが、ここで確認できます。
 

デフォルトでは settings.yml は以下のようになっています。
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# You can find more information about this file on the symfony website:
# http://www.symfony-project.org/reference/1_4/en/04-Settings

prod:
  .settings:
    no_script_name:         true
    logging_enabled:        false

dev:
  .settings:
    error_reporting:        <?php echo (E_ALL | E_STRICT)."\n" ?>
    web_debug:              true
    cache:                  false
    no_script_name:         false
    etag:                   false

test:
  .settings:
    error_reporting:        <?php echo ((E_ALL | E_STRICT) ^ E_NOTICE)."\n" ?>
    cache:                  false
    web_debug:              false
    no_script_name:         false
    etag:                   false

all:
  .settings:
    # Form security secret (CSRF protection)
    csrf_secret:            ebfxa42b0x90387xd2fx4d24xd00xxx38c1a9x16
 
    # Output escaping settings
    escaping_strategy:      true
    escaping_method:        ESC_SPECIALCHARS
 
    # Enable the database manager
    use_database:           true

 

dev の部分を以下のように変更して、Strict エラーと Deprecated エラーを表示させないようにします。
 

1
2
3
dev:
  .settings:
    error_reporting:        <?php echo (E_ALL & ~E_DEPRECATED)."\n" ?>

 

以上です。
 
 

[Symfony1.4] フォーム(Form)/バリデーター(Validator)関連の参考サイトまとめ

 

Symfony1.4 にて フォームを使うときに読む記事を一覧にしました。
 

色んなページからアクセスするのが面倒なのでまとめてみました。
 

blogチュートリアル(9) 記事の追加 | 日本Symfonyユーザー会 はてなブックマーク - blogチュートリアル(9) 記事の追加 | 日本Symfonyユーザー会

blogチュートリアル(10) データのバリデーション | 日本Symfonyユーザー会 はてなブックマーク - blogチュートリアル(10) データのバリデーション | 日本Symfonyユーザー会
 

A Gentle Introduction to symfony | 第10章 – フォーム | symfony | Web PHP Framework はてなブックマーク - A Gentle Introduction to symfony | 第10章 - フォーム | symfony | Web PHP Framework
 

symfony Forms in Action | symfony | Web PHP Framework はてなブックマーク - symfony Forms in Action | symfony | Web PHP Framework
 
  ・第1章 – フォームの作成

  ・第2章 – フォームのバリデーション

  ・第3章 – Web デザイナのためのフォーム

  ・第4章 – Propel との統合

  ・第8章 – 国際化とローカライゼーション

  ・第11章 – Doctrine との統合

  ・付録 A – ウィジェット

  ・付録 B – バリデータ
 

The More with symfony book | 高度なフォーム | symfony | Web PHP Framework はてなブックマーク - The More with symfony book | 高度なフォーム | symfony | Web PHP Framework
 

直接、フォームとは関係ないですが、セッションは一緒によく使うのでメモ。
 

さぼてん: 【symfony】セッションの利用~アクション~ はてなブックマーク - さぼてん: 【symfony】セッションの利用~アクション~
 

(随時、更新予定です)
 

[Eclipse] PHPのsyntax errorが表示されないときの解決方法

 

Eclipseで、PHPのsyntax errorが表示されないときの解決方法を調べたのでメモ。
 

■ 原因
 
プロジェクトが、PHPプロジェクトになっていませんでした。
 

■ 対処方法
 
「プロジェクト」→右クリック→「構成」→「Add PHP Support」
 

以上です。