1

我好像有问题。我继承了一些在 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 语句?

非常感谢任何帮助。

4

0 回答 0