すぐに解決したい方はまとめ記事をご覧ください。
はじめに
Dockerfileをのちのち編集したいので、以前の記事【docker】Laravel9でxdebugを導入を終えた状態からスタートします。
SQL Serverとの接続テストをしたいので my-project/routes/web.php を下記のように編集します。
<?php use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\DB; Route::get('/', function () { $pdo = DB::connection()->getPdo(); dd($pdo); // return view('welcome'); });
公式ドキュメントより抜粋、接続インスタンスでgetPdo
メソッドを使用して、接続の基になる素のPDOインスタンスにアクセスできます。
この状態でトップページにアクセスすると以下のようなレスポンスが返ってきます。
PDO {#281 ▼ // routes/web.php:9 inTransaction: false attributes: {▶} }
デフォルトではmysql設定なので問題なくmysqlのDBに接続できています。
次に、$pdo = DB::connection()->getPdo();を$pdo = DB::connection(‘sqlsrv’)->getPdo();に変更します。
すると、「could not find driver」のエラーになります。SQL Server用のdriverが無いエラーです。
SQL Server用のドライバーをインストール
マイクロソフト公式ドキュメントを読みとODBCドライバーが必要とのことなのでMicrosoft ODBC 18のDebianの箇所のコードを順次実行します。
まずは、コンテナに入ります。
docker compose exec myapp bash
次に以下を実行
sudo su curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
すると以下のエラーが発生します。
0E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
翻訳すると、gnupg、gnupg2、gnupg1がインストールされていないようですが、この操作にはそのうちの1つが必要です。
gnupgをインストールします。
apt install -y gnupg
もう一度sudoから実行します。
sudo su curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
OKと表示されたら次のコードを実行します。#Debian 11の下のコードを実行
curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
続けて以下を実行
sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
以上でODBCドライバーのインストールの完了です。
Microsoft Drivers for PHP for SQL Serverのインストール
公式ドキュメントを参考に進めます。
手順 3. Microsoft SQL Server 用 PHP ドライバーをインストールする (Debian)の箇所を実行する
sudo pecl install sqlsrv
ERROR: `make’ failedというエラーが発生します。次のコードで解決です。
apt install -y unixodbc-dev
もう一度 sudo pecl install sqlsrv を実行します。
You should add “extension=sqlsrv.so” to php.iniというコメントが出ていますが、後ほど対応します。
sudo pecl install pdo_sqlsrv
You should add “extension=pdo_sqlsrv.so” to php.iniというコメントも後ほど対応します。
phpenmod sqlsrv pdo_sqlsrv
bash: phpenmod: command not foundというエラーが発生するので次のコマンドを実行します。
apt install -y php-common
もう一度 phpenmod sqlsrv pdo_sqlsrv を実行します。
php.iniファイルへ追記する
php.iniファイルの[Pdo]の下に以下を追記して保存します。
[Pdo] extension=pdo_sqlsrv.so extension=sqlsrv.so
コンテナを再起動します。docker compose down と up を行います。
すると下記エラーが表示されます。
SQLSTATE[HY000]: [Microsoft][ODBC Driver 18 for SQL Server]Protocol error in TDS stream
下記で対応します
my-project/config/database.phpを編集する
'connections' => [ 'sqlite' => [ //省略 ], 'mysql' => [ //省略 ], 'pgsql' => [ //省略 ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST_SECOND', '192.168.0.100'), //SQL ServerのIPアドレス 'port' => env('DB_HOST_SECOND', '1433'), //SQL Serverのポート番号に合わせる 'database' => env('DB_HOST_SECOND', 'my_dbname'), // 編集 'username' => env('DB_HOST_SECOND', 'my_user_name'), // 編集 'password' => env('DB_HOST_SECOND', 'my_password'), // 編集 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, // 'encrypt' => env('DB_ENCRYPT', 'yes'), // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), ],
.envファイルを編集します。DB_HOST_SECONDで設定します
DB_CONNECTION_SECOND=sqlsrv DB_HOST_SECOND=192.168.0.100 DB_PORT_SECOND=1433 DB_DATABASE_SECOND=my_dbname DB_USERNAME_SECOND=my_user_name DB_PASSWORD_SECOND=my_password
database.phpと.envファイルの変数名と変数を一致させます。
もう一度トップページに接続します。
また、エラーが発生しました。
SQLSTATE[08001]: [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate]
下記で対応します
my-project/config/database.phpに追記します
'connections' => [ 'sqlite' => [ //省略 ], 'mysql' => [ //省略 ], 'pgsql' => [ //省略 ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST_SECOND', '192.168.0.100'), 'port' => env('DB_HOST_SECOND', '1433'), 'database' => env('DB_HOST_SECOND', 'my_dbname'), 'username' => env('DB_HOST_SECOND', 'my_user_name'), 'password' => env('DB_HOST_SECOND', 'my_password'), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'trust_server_certificate' => 'true', //追記 ],
SSLプロバイダーエラーを調べると上記の一文を追記でOKでした。
再度トップページを表示します。
PDO {#281 ▼ // routes/web.php:9 inTransaction: false attributes: {▶} }
無事にSQL Serverに接続できていることが確認できました。
長くなったので別記事に一発でできるようにまとめました。
ITスキルを磨きたいなら、Tech Academyがおすすめです。今すぐこちらからチェックして、あなたのスキルを次のレベルへと引き上げましょう!
コメント