SQL Serverストアドプロシージャがあります。 SSMSで実行すると、312行が返されます。私はVisual FoxProコードから実行するとき。しかし、私のPHPコードで同じ呼び出しを使用すると、空の結果が得られます。空の場合は、empty()関数でテストするとtrueが返されます。 sqlsrv_has_rows()もtrueを返しますが、結果をループしようとするとループに入ることはありません。PHPから呼び出されたSQL Server SPは空の結果を返します。 Studioなどで複数の行が返される
私は同じ呼び出し構造を使用して、他のいくつかのSPで呼び出しを設定し実行しています。実際に、私が作業しているページを変更して、別のSPを呼び出すようにすると、結果が得られます。テーブルを移入するために、HTMLやPHPのミックスが続いています
<?php
$articles = getdata("GetArticles","'','',''");
while($obj = sqlsrv_fetch_object($articles)) {
?>
:
私はここに表示どのようなコードでもわからないんだけど、ここでコールを含むページからキーコードがあります。ここで
は函機能です:
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
EDIT:状況を簡単にするために、私は単純に(私はいくつかのケースで必要なものである)すべてのレコードを取得し、新しい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";
}
}
「最初のオブジェクトは空です」というメッセージが表示されます。 }
あなたが渡している正確なパラメータと、それをSSMSでどのように実行するかを表示します。 – DavidG
2つのもの。 1)配列を文字列ではなく渡す必要があります。 2)文字列として渡すので、サーバーに行うときに正しい形式になっているかどうかを確認する必要があります。あなたが 'cat、dog、monkey'を渡すと、 'EXECUTE procedure' cat '、' dog '、' monkey''が実際にやっていることは 'EXECUTE procedure cat、dog、monkey'です。 – Augwa
任意のパラメータを渡していないのと同様に、正しいデータベースにストアドプロシージャが開かれていることを確認してください。 – Chuck