PHP Archive

PDOをサポートした、SQL Server Driver for PHP 2.0のCTP版が出たようです

  • 2010-04-20 (火)
  • DB | PHP

SQL Server Driver for PHP 2.0 CTP adds PHP’s PDO style data access for SQL Server

ということで、ようやく待ちに待ったPDO対応のSQL Server Driver for PHPが出た様子。
CTP版はダウンロードセンターからダウンロードできます

Drupal7をこのSQL Server Driver for PHP 2.0を利用して動かすデモもDrupal Con SFで行われるようですね。

PHPにおいてのSQL Server利用はなかなか難しいところがありましたが、これでまた有力な選択肢に戻ってきたかもしれません。

SQL Server Driver for PHP 1.1 がリリースされたようです。

  • 2009-10-08 (木)
  • PHP

Microsoft SQL Server Driver for PHP Team Blogより
SQL Server Driver for PHP 1.1が正式にリリースされたようです。

SQL Server Driver for PHP 1.1 is now available

内容は、以前から告知されていたようにPHP5.3への対応と、UTF-8への対応、scrollable result setsへの対応。それと、Windows AzureのSQL Azure databasesへも対応した様子。

あとはPDOドライバをリリースしてくれれば言うこと無しなんですがね・・・。出ないのかなあ・・・

関連エントリー
SQL Server Driver for PHP 1.1でUTF-8に対応するみたい

CakePHPを使い始めた。

  • 2009-09-02 (水)
  • PHP

今度の案件に利用するフレームワークを選定していました。

今までさわったことあるのは、SymfonyとZend Framework。
ただ、Symfonyは日本語の資料がまだまだ少なく、うちのような零細にとっては多少コストがかかってしまいそうなことがネック。
Zend FrameworkはZend自身が作っていることもあって、バージョンアップも頻繁ですし資料もそれなりに揃っているんですが、フレームワーク自体があまり束縛してこない、ゆるい仕様なのでどうしても書かなければいけないコード量が多くなってしまう。

ということで、日本語の資料もそこそこ揃っていて、かつコード量も少ないCakePHPを使おうと思った次第。

とりあえずチュートリアルでもこなしてみましょうかね。

Zend_FormでValueが飛ぶ

なぜだ。

Zend_Formを使ってフォーム要素を作ってるんですが、なぜか呼び出したときにValueが消えます。

$elements['submit'] = new Zend_Form_Element_Submit('submit');
$elements['submit']->setValue('検索');

こんな感じにsetValueしてるんですが、たまにセットされずに真っ白なボタンができあがってしまうという。うーん、困る。

Zend_Paginatorが分かりづらい

Zend Frameworkでページングを実装したかったので、Zend_Paginatorを使ってみようかと調べていたわけですが・・・

ドキュメントが酷く分かりづらい。
http://framework.zend.com/manual/ja/zend.paginator.html

これは酷い。
充実してるように見えて全然中身がない・・・。

もうちょっと試行錯誤してみる予定。

あ、ちなみに不調だったScribeFireのバージョンを落としたら問題なく投稿できました。

PDO(Zend_Db)+SQL Server(ODBC)でStatement使うと型が無視られてTextになる

どうやらまた地雷を踏んだようだ。

Zend_Db(内部的にはPDO)のプリペアドステートメントを使っていると不可思議な現象に遭遇。SQL Serverから、型が違うと怒られるのだ。

こんな感じ

$query = "SELECT :test, :test2 FROM Table1 as si WHERE Name = :test3";
$stmt = $db->prepare($query);
$stmt->bindValue(":test","Name");
$stmt->bindValue(":test2","Mail");
$stmt->bindValue(":test3","jaco");
$stmt->execute();

こんな感じに書いて表示させようとすると、

The data types varchar and text are incompatible in the equal to operator.

と怒られる。ちなみにNameカラムはVarchar型。textとは比較できないよ、というエラーだけども、そもそも何でtext型になってんねん。

SQL Server Profilerで見てみると

declare @p1 int
set @p1=NULL
exec sp_prepare @p1 output,N’@P1 text,@P2 text,@P3 text’,N’SELECT @P1 as test1, @P2 as test2 FROM tblWebStayInformation as si WHERE CompanyCode = @P3′,1
select @p1

見事にすべてtext。勝手に変なことしないでください・・・。

ここでちょっとSQL文を変えてみると

$query = "SELECT * FROM Table1  WHERE Name = :test AND Sequence = :test2";
$stmt = $db->prepare($query);
$stmt->bindValue(":test","Name");
$stmt->bindValue(":test2","Mail");
$stmt->execute();

declare @p1 int
set @p1=NULL
exec sp_prepare @p1 output,N’@P1 varchar(50),@P2 varchar(50)’,N’SELECT * FROM Table1 WHERE Name = @P1, Mail = @P2′,1
select @p1

あぁ、Varcharになった。
つまり、Select句の中にプレースホルダを入れると、なぜか型が全無視されてTextになってしまうと。

調べてみるとここで報告されてました。
Bug #44643 bound parameters ignore explicit type definitions

今回試したのはPHP5.2.8なんですが、未だに直ってないのね・・・。

Zend_Validate_Regexで日本語を使うときの注意

Zend FrameworkのZend_Validate_Regexでは、正規表現を書いてバリデーションを行うことができます。
Zend_ValidateにはAlnum(アルファベットや数字)、Alpha、Digits、Dateのような使う頻度が多そうなものから、Barcodeなど変わり種のものまで、さまざまなバリデーションクラスが用意されていますが、日本語に対応するものは用意されていないので、自分でバリデーションクラスを作ってしまうか、もしくはZend_Validate_Regexを使う必要があります。

頻繁に使うのならば、可読性を高めるためにもバリデーションクラスを自作してしまうほうがいいのですが、ちょっとした処理をするのならばZend_Validate_Regexを使ってしまうのもいいかと。

そんなわけでZend_Validate_Regexを使って半角カナの処理をしていたわけですが、どうも思ったような挙動になってくれない。

  new Zend_Validate_Regex('/^[。-゚]+$/')

こんな感じで書いても、
「アイウエオ」にはマッチするが「タカハシ」にはマッチしてくれない。

なぜだー!と思いZend_Validate_Regexのソースを読んでみると、

        $this->_setValue($valueString);

        $status = @preg_match($this->_pattern, $valueString);
        if (false === $status) {
            /**
             * @see Zend_Validate_Exception
             */
            require_once 'Zend/Validate/Exception.php';
            throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$valueString'");
        }

こんな感じで単にpreg_matchで処理しているだけの様子。
もうすこし調べていると、こんなものを発見。

パターン修飾子

u (PCRE_UTF8)
この修正子は、Perl 非互換な PCRE の機能を有効にします。パターン 文字列は、UTF-8 エンコードされた文字列として処理されます。 この修正子は、UNIX では PHP 4.1.0 以降、Win32 では PHP 4.2.3 以降で 使用可能です。 また、PHP 4.3.5 以降では、パターンの UTF-8 としての妥当性も確認されます。

・・・なるほど、/uオプションを付ける必要があったのね。

  new Zend_Validate_Regex('/^[。-゚]+$/u')

このような感じに変更したところ、意図したとおりの動作に。
半角カナに限らず、UTF-8を利用するときは必ずuオプションを付けるようにしたほうがいいかも。

ホーム > PHP

Search
Feeds
Meta

Return to page top