PHPでSQL Serverのエラーを処理する/MySQLのエラー処理との比較


PHPからSQL Serverへの接続 / MySQLへの接続との比較 | Windows Maniax」でSQL Server Driver for PHPを使用してSQL Serverに接続する方法を紹介しました。今回はエラー処理について紹介したいと思います。

MySQLでのエラー処理

MySQLのエラー処理を行う際に使用されるのが、mysql_errorです。mysql_errorは直近に実行されたMySQL関数のエラー文字列を返します。

ですので、MySQLに接続を試みて失敗したら、メッセージを出力しスクリプトを終了させる以下のようなコーディングに使用されるケールが多いように思います。

 mysql_connect ('ホスト名', 'ユーザ名', 'パスワード') 
or die(mysql_error ()); 

mysql_errorは文字列を返し、dieは文字列を引数にとるので相性良くかけます。クエリを発行してエラーになった場合にもmysql_errorを使用してエラーメッセージを取得することになります。

SQL Serverでのエラー処理

SQL Serverのエラー処理を行う際に使用されるのが、sqlsrv_errorsです。sqlsrv_errorsも最後に実行したsqlsrv操作に関する拡張エラー情報や警告情報を返します。ただし、こちらは文字列ではなく配列を返します。

戻り値の配列は、「SQLSTATE」「code」「message」の3つを含んでいます。「message」がmysql_errorに相当します。最後のsqlsrv関数で複数のエラーが発生した場合は、複数分エラーが格納されるようになっています。

ですので、MySQL用に作成されたプログラムからマイグレーションする際には、単に「mysql_error」を「sqlsrv_errors」に置換するだけでは不十分です。あえて、置換だけで行おうとするならprint_rと組み合わせることになると思います。

 
sqlsrv_connect('ホスト名', array('Database'=>'データベース名'))
or die(print_r(sqlsrv_errors(), true));

ですが、元のコーディング方法によっては微妙な実装になるケースもあります。(たとえば、エラー内容をウィザード形式の画面の一部に埋め込みサイトライを促す画面に、こののまま表示するのは。。。)ケースバイケースな対応になるかと思います。

ちなみに以下のようなものが帰ってきます。

Array
(
    [0] => Array
        (
            [0] => 28000
            [SQLSTATE] => 28000
            [1] => 18456
            [code] => 18456
            [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]ユーザー はログインできませんでした。
            [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]ユーザー はログインできませんでした。
        )

    [1] => Array
        (
            [0] => 42000
            [SQLSTATE] => 42000
            [1] => 4060
            [code] => 4060
            [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]このログインで要求されたデータベースを開けません
            [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]このログインで要求されたデータベース を開けません。        )

    [2] => Array
        (
            [0] => 28000
            [SQLSTATE] => 28000
            [1] => 18456
            [code] => 18456
            [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]ユーザーはログインできませんでした。
            [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]ユーザーはログインできませんでした。
        )

    [3] => Array
        (
            [0] => 42000
            [SQLSTATE] => 42000
            [1] => 4060
            [code] => 4060
            [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]このログインで要求されたデータベースを開けません。
            [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]このログインで要求されたデータベースを開けません。
        )

)

まとめ

以上、MySQLとSQL Serverでのエラー処理の方法についてみてきました。多少の違い(引数が文字列か配列)がありますが、些細な差ですので多少の労力で置き換えることが可能です。

データベースに接続し、使用するデータベースを選択する。失敗したらエラーを表示する。

MySQL

$link = mysql_connect('ホスト名', 'ユーザ名', 'パスワード') 
or die(mysql_error());
mysql_select_db('データベース名',$link) 
or die(mysql_error());


SQL Server

$link = $conn = sqlsrv_connect('ホスト名', array('Database'=>'chl')) 
or die(print_r(sqlsrv?errors(),true));


タグ:


コメントをどうぞ