PHPの最近のブログ記事

新しいサーバー(VPS)にsymfonyを入れている。

schema.ymlを書き換えてsymfony doctrine:insert-sqlを実行したら以下のエラー。

$ symfony doctrine:insert-sql
>> doctrine  creating tables


  Couldn't locate driver named mysql

まぁメッセージの通りドライバーが足りないんだろう。以下のコマンドで確認できる。

php /usr/share/pear/data/symfony/bin/check_configuration.php

結論から言うと、php-mysqlとphp-pdoをインストールすれば解決。

環境:CentOS 5.5

PDO

| コメント(0) | トラックバック(0)

■PHPからMySQLにアクセス

最近PHPを使う時はいつもsymfonyを使ってるので、DBに接続したりSQLを投げるコードを直接書くことはなかったんだけど、つい最近、ほんのお遊びプログラムを作る時に、わざわざsymfonyを使うまでもないと思ったので、プレーンなPHPで書くことにした。

普通のPHPを使うのなんて久しぶりなので、最初はmysql_connectとかの昔ながらのやり方をやってたんだけど、それだとさすがに芸がないので他のやり方をすることにした。

■PDO

どうやら調べてみたら、ここ最近ではPDOを使う人が多いみたいなので自分もそうしてみることにした。CodeZineにPDOの記事が載ってたのでそれを見つつやってみる。PDOにしろ何にしろ、そもそも人間の労力を減らすための物なので、そんなに難しいわけがない。

・文字コード

で、次に引っかかったのが定番の文字コード。色々見てると例の

set names utf8

ってのを実行してる例が多かったけど、これって筋が悪いというかあまり美しくないって個人的には思う。で、調べている途中にこんなページが見付かった。

Shift JISの場合、set namesで文字コードを指定しても、PDOが文字コードを意識した作りになってないから(?)、SQLインジェクションが起こる可能性があるらしい。

 shema.ymlに色々書いてsymfony doctrine:build --modelを実行すると色々なクラスが自動的に生成される。lib/model/doctrine以下には、各モデル毎に[ModelName].class.phpと[ModelName]Table.class.phpという2つのクラスが生成される。

その2つの使い分けは何となくやってたんだけど、最近明快な答が載ったページ(英語)を見つけたのですっきりした。

まぁソースコードを見ればすぐ分かるんだけど、継承関係としては以下の通り。

  • Doctrine_Record > sfDoctrineRecord > [ModelName]
  • Doctrine_Table > [ModelName]Table

てことで、[ModelName]Tableの方は、テーブルからデータを取ってきたりする処理を記載して、取ってきたレコードに対する処理は[ModelName]クラスの方に記載する。

symfonyでコマンドを入力する。例えばsymfony project:deploy --go xxxxとか。で、何かエラーが出るとする。画面に出力されるメッセージから色々判断しなきゃいけないんだけど、出力が長い場合、画面の幅に収まるように、symfonyの内部で勝手に.....とかに省略されてしまい非常に不便。

設定で簡単に変えられないか調べたんだけど、分からなかったので結局ソースを直接修正した。

/lib/command/sfFormatter.class.php の38行目辺り(symfony 1.4.5の場合)。以下の値を大きな値に変更すればOK。

    $maxLineSize = 65;

参考にしたページ(英語)。

DoctrineのfindBy

| コメント(0) | トラックバック(0)

symfony 1.4だとDoctrineが標準になったので必然的に使う事になってる。

もしかしたら世間的には常識なのかもしれないけど、昨日発見して感動した事。

Doctrine::getTable("TableA")->findByField1AndField2("val1", "val2");

ってやると以下のSQLが実行される。

SELECT * FROM TableA WHERE Field1='val1' AND Field2 ='val2'

複数のカラムにまたがる検索も一発で出来るのは非常に便利。当然 findByField1AndField2 なんてメソッドは自分で用意しなくても使える。

最近のORマッパーってこんなもん?

自分用メモ。

symfonyでは、独自の設定項目をapp.ymlに追加していく事が出来る。それの読み込み方は以下の通り。

sfConfig::get('app_foo')

まぁこれはすぐ分かるんだけど、app.ymlの中身が以下のように階層構造になってたらどうすれば良いんだろうと思ってググってみたら、このページが見付かった。実際にまだ試してないけど・・・

all:
  foo:
    bar: "val"

symfonyはご存じの通りwebアプリケーションを作るためのPHPのフレームワークなんだけど、それ以外にも便利なな機能がある。

システムを作るのって、単に表に出てくる機能を作るだけじゃなくて、バックアップだったりデータのメンテナンスだったりってのも含まれるんだけど、バックグラウンドで動くタスク・ジョブを簡単に作れる機能がsymfonyにはある。1.2のリファレンスにcookbookに説明があるので、1.2から出来た機能かも。

 ま、このページの説明で大体間に合ってしまう気もするけど、少し説明。

LimeSurveyを触っていたら以下のようなPHPのNoticeが出た。

Notice: Use of undefined constant auto - assumed 'auto' in C:\xampp\htdocs\limesurvey\common.php on line 4505

autoって定数が定義されていないのか。調べてみたら、該当行ではmb_convert_encoding関数が使われてた。でも、autoって指定すると自動的に文字コードを判別するはずだし、定義されていないはずはないよなぁと思って色々調べたけど、結局以下のように引用符でくくったらエラーが出なくなった。あほらし・・・

auto → "auto"

ちなみに、ほんとに"auto"っていう引数が使えないケースもあるらしく、php.iniの設定を変えたなんていう人もいた()。

別にhiddenタグでなくても良いんだけど、新規レコード作成時などにフォームの初期値を設定する方法。

//actions.class.phpのexecuteNewの中とか
$this->form = new FooForm();
$this->form->setDefault('hidden_field', $value);

DBから取得したレコードをフォームにセットする場合には、自動生成されるexecuteEditの中を参照。

自分用メモ。

pear upgrade symfony/symfony

プロジェクトを 1.2 から 1.3/1.4 にアップグレードする

このブログの作者

名前:kazu
仕事:IT関係の何でも屋
メール:kazu 後幕 kazu どと tv
詳しくはこの辺

このアーカイブについて

このページには、過去に書かれたブログ記事のうちPHPカテゴリに属しているものが含まれています。

前のカテゴリはJavaです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ