SQL Server Driver for PHP で変更行を取得できないときの対処方法

SQL Server Driver for PHP を用いて PHP 上から SQL Server へ接続し、INSERT、UPDATE あるいは DELETE などでデータ操作した後、影響を受けたデータ数を取得しようとしても、うまくいかない場合があります。

そんなときに、ぜひこのページの情報を元にコードをチェックしてみてください。
いろいろと試してみて見つけた方法なので、あなたの開発時間の短縮に役に立つかもしれません。

SQL Server Driver for PHP で変更行数を取得する方法

基本的に、PHP から SQL Server Driver for PHP を用いている時に変更行数を取得するには、 sqlsrv_rows_affected 関数を利用します。

sqlsrv_rows_affected(resource $stmt)

引数の $stmt は sqlsrv_query の返すステートメントオブジェクトです。

通常は、次のようにすると変更行数が取得できます。

$stmt = sqlsrv_query ( 'UPDATE employees SET salary = 1000 WHERE empid = 10' );

$rows_affected = sqlsrv_rows_affected( $stmt );

... 何気にサンプルコードを書いたつもりでしたが、手が自然と「従業員テーブル (employees) の従業員 ID (empid) が 10 の人の給料 (salary) を 1000 円にする」 という、 ちょっと切ないサンプルコードを書いてしまいました・・・。

サンプルコードくらい、「給料を1億円にする」 とか景気のいいコードを書きたいものですが・・・

まぁ、これは気にせず、先へ進みましょう。不景気ですからね(苦笑)

そういうわけで、上のサンプルコードでは ID が 10 の salary を 1,000 に設定しています。該当するレコードが1件あれば、sqlsrv_rows_affected 関数が返すと期待される値は1です。

これは問題ありませんね。

データが変更されているにもかかわらず、sqlsrv_rows_affected が 0 を返す場合

上記のように SQL 文を直接書く場合は特に問題ありません。

しかしながら、ストアドプロシージャを利用する場合に、 データが変更されているにもかかわらず sqlsrv_rows_affected が 0 を返す現象に何度か出会いました。

このときの対処方法を示します。

1. SET NOCOUNT ON をやめる

ストアドプロシージャで SET NOCOUNT ON をしている場合、影響を受けた行数が sqlsrv_rows_affected で取得できません。

この場合、SET NOCOUNT ON を記述しないようにすることで、影響行数を正しく取得できました。

2. 複数のステートメントを実行する場合

単純に SET NOCOUNT ON をやめた場合、ストアドプロシージャ内で複数のステートメントを実施している場合には、やはり、正しい sqlsrv_rows_affected の行が取得できませんでした。

この場合は、変更行数を取得したいステートメントの直前まで SET NOCOUNT ON としておき、 ステートメントの直前で SET NOCOUNT OFF とします。

これによって、変更行数を取得することが出来ました。

以上、話は単純なのですが気付かないとなかなか厄介だと思います。

私の場合はこれで変更行数が取得できましたので、試してみてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説