はじめに
SQLServerにあるテーブルをWeb上で閲覧できるようにしたいため、PHPで実装することになった。
環境は以下の通り。ASP.NETのほうがMSの親和性の恩恵で実装しやすい?と思うけど、私の好みで敢えてPHPを選択。
環境
- OS: Windows Server 2019 Standard
- DB: SQL Server 2014 Standard
- Web: IIS, PHP Ver8.2.5
ドライバーインストール、phpinfoでドライバ認識確認まで順調で、いざPDO接続のコードを実装してページを読み込んでみたら
HTTP 500 Error
この Internal Server Error の解決までをここに綴る。
PDOエラー処理
PHP公式マニュアルによるとPDOが提供するエラー処理方法は三通り存在し、アプリケーションの開発形態によって使い分けるとのこと。
https://www.php.net/manual/ja/pdo.error-handling.php
今回はVer8.2.5を使用しているからPDO::ERRMODE_EXCEPTION モードを指定してエラー処理を実装する。
<?php
$serverName = 'SeverName';
$database = 'dbName';
$uid = 'sa';
$pwd = '####SA##PASSWORD';
try {
$conn = new PDO("sqlsrv:server=$serverName;Database = $database", $uid, $pwd);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Error connecting to SQL Server:{$e}");
}
?>
上記実装し、ページを読み込んだところ以下エラーが表示された。
※以下よりコードSampleを参照
https://www.ipentec.com/document/php-mssql-connect
SSL プロバイダー: 信頼されていない機関によって証明書チェーンが発行されました。
またしてもTLSエラー、、😓 ※私の投稿はTLSエラーが多いTT
DSNに"TrustServerCertificate=1"を追加
上記エラーをみると恐らくPHPが証明書ストアのルート証明書を参照できないためかと思われる。強制的にサーバー証明書を信頼させるためには DSNに"TrustServerCertificate"を追加する。
https://www.php.net/manual/ja/ref.pdo-sqlsrv.connection.php
<?php
$serverName = 'SeverName';
$database = 'dbName';
$uid = 'sa';
$pwd = '####SA##PASSWORD';
try {
$conn = new PDO("sqlsrv:server=$serverName;Database= $database;TrustServerCertificate=1;", $uid, $pwd);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Error connecting to SQL Server:{$e}");
}
?>
これで Internal Server Error が解消された😇