Linux+Apache+PHPからWindows+MSSQLServerへ接続=>値取得
昨日は疲れ果てて書けなかったので、今日は適当にがんばります!適当に!w PHPのPDOを使って接続したのですが、freetdsがPDO_DBLIBにしか対応していない関係で、ストアドプロシージャが呼べません・・・orz ということで方向転換で、PDOを使ってSQLを投げるのではなく、MSSQL~関数を使用してストアドプロシージャを呼ぶことにしました。 接続については前回説明したとおりです。 今回のコアであるストアドプロシージャの呼び出しですが、こんな感じでいけました。//$spNameはストアドプロシージャ名$sp = mssql_init($spName);mssql_bind($sp, $key, $val,$type);$result = mssql_execute($sp); これであっさりストアドプロシージャを呼べました。 何だ楽勝ジャ~ンと浮かれてresultからfetchで値を取ってみると・・・ も、文字化け(゚ロ゚;) データの中にあったGUIDが見事に化けてました。 GUIDは一見英数字の並びで、DBではVARCHARっぽく見え、プログラム上ではstringと思いがちですが、本当はバイナリデータだった罠。( ´△`)アァ- fetch_allとかで連想配列に入れると、自動でstring型に無理やり入れるので、そこで化けてしまいます。 が、そこはPHP。ちゃんと対応できる関数がありました。 mssql_guid_string()関数です。 バイナリデータのGUIDをstringに変換してくれるという優れもの! ただ、fetch系でデータを取得後に使っても、既に無理やりstring型に突っ込んで化けた後なので効果がありません。 使い方としてはこんな感じ(mssql_resultのオプションについては公式サイトを参照下さい。)mssql_guid_string(mssql_result($result,$row,$field)); あとは上手い具合に型を見て判断し、必要なものだけmssql_guid_stringを通すようにしてください。 さて~これでいいだろう~と思って動作確認! ・・・ぇ?化けてるwwwww 何故だぁ!と思ったら、どうやらfreetdsが無理やりstring型に突っ込んでくれちゃって、化けてるみたいです。 こればかりはどうにもならない・・・ PHP側で対応はほぼ無理なのですが、MSSQLServerでSQLを発行する際にちょっと手を加えてやると、mssql_guid_string何かいらないし、そもそもバイナリが化けるとか言う心配もありません。 んで、こんな感じ SELECT CAST(test_guid as VARCHAR(36)) FROM test_table; そう、CASTでVARCHARに変換してやるんです! これを行うと、mssql_field_type()でblobと判別されていたGUIDが、stringとして返ってきました。 ちゃんとした検証を行っていないので怪しいですが、来週にでもきちんと動作確認してきます。 今日も疲れた~