SQL Server

PHP5.4->PDO->SQL Server2012を実現する

PHP5.4からSQL Server 2012 へ接続しようとしたところ、微妙なバージョン間違いやモジュールのインストール不足により、はまったので、残しておきます。
 
 
 

前提

  • PHPは動作している
  • 外部接続可能なSQL Server 2012が用意されている

PDOドライバのダウンロード

http://www.microsoft.com/en-us/download/details.aspx?id=20098
まずは、上記サイトからPDOドライバをダウンロードします。
この時注意しなければならないのが、2つのファイルがダウンロード対象となっている点です。
SQLSRV30.EXE
SQLSRV20.EXE

PHP5.4用およびSQL Server 2012用は「SQLSRV30.EXE」なので、ご注意ください。

PDOドライバの展開

ダウンロードした「SQLSRV30.EXE」をダブルクリックすると展開先のフォルダの確認になりますので、あらかじめ展開先のフォルダを作っておくことをお勧めいたします。

そして、展開したフォルダの中から以下のファイルを取り出します。
php_sqlsrv_54_nts.dll
php_pdo_sqlsrv_54_nts.dll

PDOドライバのインストール

取り出したファイルを「C:\PHP\ext」フォルダに配置します。
*PHPフォルダはあくまで、一般的にPHPのモジュールが格納されているフォルダ名として記載しています。ご利用の環境に合わせて変更をしてください。

php.iniファイルに以下の2行を記載すればドライバのインストールは完了です。
extension=php_sqlsrv_54_nts.dll
extension=php_pdo_sqlsrv_54_nts.dll

エラー

私は、これで設定完了だと思ってしまいましたが、全く接続できずにエラーが発生して、原因究明に時間がかかりました。
最初に躓いたのは、
「An error occurred translating the connection string to UTF-16: Unicode 文字のマッピングがターゲットのマルチバイト コード ページにありません。」
phpファイルの文字コードをShift-JISにしていたために、発生したエラーです。わかれば、大した話ではありませんが、最初は意味が全く分かりませんでした。結局Unicodeで再保存することで、次のエラーに進みました。

「This extension requires the Microsoft SQL Server 2012 Native Client ODBC Driver to communicate with SQL Server.」
これが、問題です。結局PDO接続はできないのか?ODBCドライバーをインストールしなければならないのか?
そんな事を考えて、解決策を調べていると・・・サーバにクライアントモジュールが不足していることに気づきました。
これも、気づけば・・・当たり前かもしれませんが、なかなか・・・。
ということで、クライアントモジュールのインストール手順を整理しておきます。

Microsoft® SQL Server® 2012 Native Clientのインストール

Microsoft® SQL Server® 2012 Feature Pack
上記URLからウィザードに沿ってモジュールをダウンロードしようとするのですが、「SQL Server 2012 Feature Pack Instructions.txt」のテキストファイルがダウンロードされるだけです。よく見てみると・・・「インストール方法」をクリックして、一覧を表示してから、必要なコンポーネントをダウンロードする仕組みになっているのです。

ということで、「Microsoft® SQL Server® 2012 Native Client」を探して、無事にダウンロード・インストールすることで、どうにか「PHP5.4->PDO->SQL Server2012」が実現できました。

参考URL

PHPからSQL Serverへの正しい接続方法
System Requirements (Microsoft Drivers for PHP for SQL Server)
PHP から MS SQL Server を使用する方法
「Microsoft Drivers for PHP for SQL Server」のv2.0とv3.0

-SQL Server