問題が発生しているようです。同じマシン上のMSSQL DBに接続しているWindowsマシンで実行されているPHPコードを継承しました。残念ながら、私たちは Linux ハウスなので、このコードを Linux マシンで実行する必要があります。だから私はゆっくりとすべてを調べて、Linuxで正しく動作することを確認するために微調整を行っています. 変更の大部分は、/var/www ではなく C:\ であった構成設定と変数チェックに対応しています。
しかし、私は少しレンガの壁にぶつかりました。このコードは、ページネーションの限定された結果を返すクエリを実行します。
php コードは次のようになります。
if ( $offset !== null ) {
$querystring = "exec SSDEV.dbo.sp_limit '".str_replace("'", "''",$querystring)."', '".intval($offset)."','".intval($limit)."';";
}
クエリ文字列は次のようになります。
exec SSDEV.dbo.sp_limit 'select users.* from users order by users.first_name asc', '0','20';
クエリは、次のコード行で実行されます。
$result = mssql_query($querystring,$this->connection);
sp_limit は次のようになります。
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
ALTER procedure sp_limit (@sql text, @offset int, @limit int)
as
declare @cursor int;
set @offset=@offset+1;
exec sp_cursoropen @cursor output, @sql, 8,8193;
exec sp_cursorfetch @cursor,32,@offset,@limit;
exec sp_cursorclose @cursor;
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
クエリ アナライザーでストアド プロシージャを実行すると、問題なく実行されますが、2 つの結果セットが返されることに気付きました。 .
PHP でストアド プロシージャのクエリ文字列を作成する行をコメント アウトし、「制限」なしで基本的な SQL ステートメントだけを実行すると、コードは正常に実行されます。
ただし、ストアド プロシージャで実行すると、ページが永久にハングし、mssql_query() 関数で失敗します。Apache ログからのエラーは次のとおりです。
[Wed Sep 26 09:26:34 2012] [error] [client 127.0.0.1] PHP Warning: mssql_query(): Query failed in /var/www/mysite/libs/DB.class.php on line 80, referer: http://mysite/
[Wed Sep 26 09:26:34 2012] [error] [client 127.0.0.1] PHP Warning: mssql_query(): Unable to set query in /var/www/mysite/libs/DB.class.php on line 80, referer: http://mysite/
[Wed Sep 26 09:26:34 2012] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception 'Exception' with message 'Query failed: Changed database context to 'SSDEV'.' in /var/www/mysite/libs/DB.class.php:82
Stack trace:
#0 /var/www/mysite/libs/HTML.class.php(22): DB->select('select region_c...', 2, 1)
#1 /var/www/mysite/controllers/SS_Users_Controller.class.php(264): HTML->get_select_query('select region_c...', 'region_code', 'region_name', 'fk_regions', '', ' a Region', Array)
#2 /var/www/mysite/libs/Controller.class.php(72): SS_Users_Controller->index()
#3 /var/www/mysite/index.php(34): Controller->execute()
#4 {main}
thrown in /var/www/sweetspot/libs/DB.class.php on line 82, referer: http://mysite/
[Wed Sep 26 09:26:34 2012] [error] [client 127.0.0.1] PHP Notice: Unknown: Skipping numeric key 0 in Unknown on line 0, referer: http://mysite/
ご覧のとおり、ストアド プロシージャの実行に問題があります。私が知る限り、PHP で複数の結果セットを返し、それを処理することはそれほど問題ではないはずです。結果セットにアクセスしようとしたときにエラーがスローされた場合、結果セットが2つあるという事実を簡単に信じることができますが、グーグルで調べたところ、PHPには問題がないはずです。 mssql_next_result() を使用する必要がある場合を除きます。これは Windows バージョンで問題なく動作しますか? なぜ突然問題が発生し、通常の SQL ステートメントではなくストアド プロシージャのみが問題になるのですか?
どんな助けでも大歓迎です。