2008-08-25
cakephpとsql server 2005(日本語)
cakephpでSQL Server 2005 Express Editionを使おうとしてはまったのでメモ
cakephpでSQL Server 2005 Express Editionが使えるそうなので使うことにした。
まずc:\xampp\apache\binのntwdblib.dllのバージョンをチェックして古い場合は置き換える
- 2000.2.8.0はNGらしい
- 落としてくる場所はいくつかあった。自分が落としたところはhttp://webzila.com/?wz=dll
<追記>
</追記>
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であれば文字エンコードの処理がいらない。
ちゃんとテーブルの内容を参照する事ができました
まとめ
- cakephpでSQL 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で引き続き開発予定です。
トラックバック - http://d.hatena.ne.jp/domen/20080825/1219643287
リンク元
- 29 http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1385&forum=6&post_id=2988
- 4 http://cccgrp.g.hatena.ne.jp/domen/
- 4 http://www.google.co.jp/search?hl=ja&q=データベース+コンテキスト+変更されました&lr=&aq=2&oq=データ?
- 4 http://www.google.co.jp/search?q=cakePHP+SQLServer&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 2 http://b.hatena.ne.jp/patorash/
- 2 http://cakephp.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=1385&forum=6
- 2 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=php+データベース+コンテキスト+変更されま??%9
- 1 http://b.hatena.ne.jp/add?mode=confirm&title=2008-08-25 - %u8A18%u61B6Log&url=http://d.hatena.ne.jp/domen/20080825
- 1 http://d.hatena.ne.jp/chaichanPaPa/edit?date=20080828
- 1 http://d.hatena.ne.jp/diarylist?of=150&mode=rss&type=public

私がやったのはSQL Server2000だったのですが、
SQL Server2000の場合は、
if (!preg_match(’/データベース コンテキストは ¥’.*¥’ に変更されました。/i’, $wkwkerror)) {
return $wkwkerror;
}
にしたらうまくいきました。「は」と「が」、(.*)が ¥’*.¥’ 、最後に丸がつくなど、若干違いました。
私のところはSQL Server2000も扱っております。
この先参考にさせてもらう機会があるかもしれないのでこういう情報はありがたいです。