从PHP调用的SQL Server SP返回空结果;在工作室和其他地方,返回多行
问题描述:
我有一个SQL Server存储过程。当我在SSMS中运行它时,它返回312行;同样,当我从Visual FoxPro代码运行它时。但是当我在我的PHP代码中使用相同的调用时,我得到一个空的结果。空,我的意思是用empty()函数测试它返回true; sqlsrv_has_rows()也返回true,但是当我试图循环结果时,我从不进入循环。从PHP调用的SQL Server SP返回空结果;在工作室和其他地方,返回多行
我使用相同的调用结构来设置和执行与其他几个SP的调用,他们的工作。事实上,如果我修改正在处理的页面,以便它调用不同的SP,我会得到结果。
我什至不知道在这里展示一下代码,但这里是从包含调用页面关键代码:
<?php
$articles = getdata("GetArticles","'','',''");
while($obj = sqlsrv_fetch_object($articles)) {
?>
这是其次是HTML和PHP的组合,以形成一个表。
这里的的GetData功能:
function getdata($spname, $params, $errorstring = 'Unable to retrieve requested data') {
$conn = connect2db();
$query = "EXECUTE ".$spname;
if (!$params == '') {
$query .= " ".$params;
}
//echo "query = ".$query."\r\n";
$result = sqlsrv_query($conn, $query);
//echo "result = ".$result."\r\n";
if ($result == false) {
$errors = sqlsrv_errors();
foreach ($errors as $error) {
echo $error['message'];
}
die(print_r(sqlsrv_errors(), true));
}
return $result;
}
connecttodb是另一个函数,实际上使数据库连接。这绝对有用。
SP是一个查询。
ALTER PROCEDURE [XXXXXX].[GetArticles]
-- Add the parameters for the stored procedure here
@Pubs char(400) = '',
@Types char(400) = '',
@Years char(400) = ''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT Article.Title,
ArticleType.Name AS ArticleType,
URL,
Publication.Title AS Publication,
DateName(m, DATEFROMPARTS(Article.[Year], Article.[Month], 1)) + ', ' + CONVERT(char(4), [Year])
FROM Article
JOIN ArticleType
ON Article.iTypeID = ArticleType.iID
JOIN Publication
ON Article.iMagazineID = Publication.iID
WHERE (@Pubs = ''
OR iMagazineID IN
(SELECT * FROM Split(@Pubs, ',')))
AND (@Types = ''
OR iTypeID IN
(SELECT * FROM Split(@Types, ',')))
AND (@Years = ''
OR CONVERT(CHAR(4), [Year]) IN
(SELECT * FROM Split(@Years, ',')))
ORDER BY [Year] DESC, [Month] DESC
END
编辑:为了简化情况,我创建一个不带参数只是检索所有记录(这是我需要在某些情况下),并修改了页面调用新的SP新的SP。和以前一样,SP在SSMS中工作,但没有检索到有用的记录。
我还需要澄清,似乎我得到一个记录,但它完全是空的。具体来说,为了测试,我在调用SP后添加了以下代码:
if (is_null($articles)) {
echo "Null return";
}
else {
$obj = sqlsrv_fetch_object($articles);
if (is_null($obj)) {
echo "First object is null";
}
else {
if (empty($obj)) {
echo "First object is empty";
}
}
在页面上回显的是“第一个对象为空”。 }
答
我找到了解决方案。字段列表中的最后一个字段是一个复杂的表达式(基本上构建“月,年”字符串)。无意中,我没有使用AS给这个字段命名。一旦我做到了,一切都会奏效。
我为什么会失败的猜测是sqlsrv库正在使用字段名称来生成PHP端的属性名称,以及提供的任何默认SQL Server都会导致问题。
显示您传递的确切参数以及如何在SSMS中运行它。 – DavidG
两件事。 1)你应该把你的params作为一个数组而不是一个字符串。 2)因为你把它作为一个字符串传递,这意味着你需要确保在对服务器进行正确格式化时。所以,如果你通过'猫,狗,猴',你可能希望它执行'执行程序'猫','狗','猴子'它实际上在做什么'执行程序猫,狗,猴子' – Augwa
它看起来就像你没有传递任何参数一样,也要确保你在正确的数据库中打开存储过程。 – Chuck