我好像有问题。我继承了一些在 Windows 机器上运行的 PHP 代码,它连接到同一台机器上的 MSSQL DB。不幸的是,我们是一家 Linux 公司,我们现在需要让这段代码在 linux 机器上运行。所以我正在慢慢经历这一切并进行调整以确保它在 Linux 中正确运行。大多数更改是针对 C:\ 而不是 /var/www 和变量检查的配置设置。
不过,我碰到了一点砖墙。该代码运行一个查询,该查询返回有限的分页结果。
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 个结果集,一个为 sp_cursoropen 的空白(虽然带有列字段),一个来自 sp_cursorfetch,其中包含我正在寻找的数据.
如果我注释掉在 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 中返回多个结果集并进行处理应该不是什么大问题。如果它在尝试访问结果集时抛出错误,那么我会更容易相信这是有两个结果集的事实,但从我的谷歌搜索来看,我知道 PHP 不应该有问题,除了你需要使用 mssql_next_result()。什么让我烦恼,这在 Windows 版本上可以正常工作吗,为什么突然出现问题,为什么只有存储过程而不是正常的 SQL 语句?
非常感谢任何帮助。