cakephpとsql server 2005(日本語)

cakephpSQL Server 2005 Express Editionを使おうとしてはまったのでメモ
cakephpSQL Server 2005 Express Editionが使えるそうなので使うことにした。
まずc:\xampp\apache\binのntwdblib.dllのバージョンをチェックして古い場合は置き換える

  • 2000.2.8.0はNGらしい
  • 落としてくる場所はいくつかあった。自分が落としたところはhttp://webzila.com/?wz=dll

<追記>
c:\xampp\phpの下も置き換える
database.phpの設定

var $default = array('driver' => 'mssql',
                     'connect' => 'mssql_connect',
                     'host' => 'サーバ名称もしくはIP',
                     'login' => '※ユーザID',
                     'password' => '※パスワード',
                     'database' => '※データベース名',
                     'prefix' => '');

cakephpの画面を見てみると

DBにつながったのでテーブルの中身を参照してみたら下記のエラー(エラー?)が出力された

Query: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Warning: SQL Error: データベース コンテキストが 'xxxxx' に変更されました。_
 in C:\xampp\htdocs\cake\cake\libs\model\datasources\dbo_source.php on line 440

なんかエラーっぽくないエラーがでました。
ちなみにこのエラーはモデルが読み込まれるときにでているみたいでした

とりあえずQuery:の後に書いてあるSQL文をコピーしてSQL Serverのクエリ実行をやってみたら正常に実行されました

とゆうことはcakephpの問題っぽいのでソースを追っかける…
結果

  • 上記で出力されたWarningはQueryが実行されたときのWarningではない(モデルを読み込んだときに残ってしまったメッセージ)
  • SQLを実行するときにC:\xampp\htdocs\cake\cake\libs\model\dbo\dbo_mssql.php内のlastError()関数からエラーを拾ってくるがこの関数で特定の文字列が入っていた場合スルーするような処理がありました。

下記cakephp1.1と1.2です

  //cakephp1.1.19.6305
  function lastError() {
    $error = mssql_get_last_message($this->connection);

    if ($error) {                      //↓英語
      if (strpos(strtolower($error), 'changed database') === false) {
        return $error;
      }
    }
    return null;
  }

  //1.2.0.7296 RC2
  function lastError() {
    $error = mssql_get_last_message($this->connection);

    if ($error) {            //↓ドイツ語?     ↓英語
      if (!preg_match('/contesto di database|changed database/i', $error)) {
        return $error;
      }
    }
    return null;
  }

日本語には対応していませんでした
とりあえず「データベース コンテキストが」の文字列をスルーするようにしてみる

  //cakephp1.1のlastError()を下記に変更
  function lastError() {
    $error = mssql_get_last_message($this->connection);

    $wkwkerror  = mb_convert_encoding($error,'UTF-8','SJIS');
    if ($error) {
      if (!preg_match('/contesto di database|changed database/i', $wkwkerror)) {
        if (!preg_match('/データベース コンテキストが(.*)に変更されました/', $wkwkerror)) {
          return $wkwkerror;
        }
      }
    }
    return null;
  }
※注意:このファイル自体がUTF-8の場合です。SJISであれば文字エンコードの処理がいらない。

ちゃんとテーブルの内容を参照する事ができました

まとめ

  • cakephpSQL Server 2005 Express Editionを使う場合は英語のやつを使えば問題ないはず(試してないので断言はできません)
  • 日本語のSQL Server 2005 Express Editionを使うのであればdbo_mssql.phpを編集する必要がある
    • とりあえずやってみたら動いたというレベルなので弊害があるかもです。
  • cakephp1.1系は英語、cakephp1.2系は英語とドイツ語のSQL Server 2005 Express Editionに対応してるっぽい(ちなみに試してません)

当方とりあえず日本語のSQL Server 2005 Express Editionで引き続き開発予定です。