sqlsrv_has_rows 不适用于存储过程。有办法解决这个问题吗?

问题描述 投票:0回答:1

我正在将一些旧版 HTML 表单从 ASP 转换为 PHP。数据是从 SQL Server 2017 上的存储过程检索的。

我们使用 SP 的原因是某些查询需要表变量并使用“with CTE”来生成最终结果。

我遇到的问题是我需要检查是否返回行,如果没有则显示合适的 HTML 消息。函数

sqlsrv_has_rows()
适用于标准 SELECT 语句,但不适用于 SP。我相信这是 SQL Native Driver 的问题,而不是 PHP 的问题。

这是一个不起作用的示例。

<?php
    $SQLStmt = "exec.dbo.usp_QueryContacts NULL,".$parm1.",NULL;";
    $RS_Contact01 = sqlsrv_query($conn01, $SQLStmt); 
    if (sqlsrv_has_rows($RS_Contact01) === false) {
?>
                    <p>There are currently no contacts on record for this Site.</p> 
<?php
    }
    else {
?>
<?php
    while ($ROW_Contact01 = sqlsrv_fetch_array($RS_Contact01,SQLSRV_FETCH_ASSOC)) {
?>
                    <tr class="tablebody">
                    <td><?php echo($name);?></td>
                    <td><?php echo($ROW_Contact01['Email']);?></td>
                    <td><?php echo($ROW_Contact01['Phone']);?></td>
                    <td><?php echo($ROW_Contact01['Mobile']);?></td>
                    <td><a class="linkbutton shuttlegray shuttlegrayhover" href="contact-det.php?1=1&amp;2=<?php echo($ROW_Contact01['ContactResolveId']);?>">Details</a></td>
                    </tr>
<?php
        }
    }
?>

这会抛出一个:

'sqlsrv_num_rows() 期望参数 1 为资源,给定 bool'

警告。

我可以找到各种提到打开“SET NOCOUNT ON;”等的线程,但我正在努力寻找一种实际的解决方法/解决方案,使我能够检测何时没有返回行并采取相应的行动。

对于新手 PHP 编码人员的任何实际帮助将不胜感激(包括最佳实践)。

php sql-server stored-procedures sqlsrv
1个回答
1
投票

出现“sqlsrv_num_rows() Expectsparameter 1 to be resource, bool给定”错误的原因是该语句没有正确执行。这可能是一个打字错误(

exec dbo.usp_QueryContacts ...;
,而不是
exec.dbo.usp_QueryContacts ...;
),但您需要考虑以下事项:

  • 始终在语句中使用参数来防止可能的 SQL 注入问题。正如 documentation 中提到的, ... sqlsrv_query 函数非常适合一次性查询,并且应该是执行查询的默认选择,除非特殊情况适用 ...... sqlsrv_query 函数既进行语句准备又执行语句,并且可用于执行参数化查询
  • 始终检查
    sqlsrv_query()
    通话的结果。

下面的示例(基于您的代码)是您问题的可能解决方案:

<?php
    $SQLStmt = "exec dbo.usp_QueryContacts NULL, ?, NULL;";
    $SQLPrms = array($parm1);
    $RS_Contact01 = sqlsrv_query($conn01, $SQLStmt, $SQLPrms);
    if ($RS_Contact01 === false) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }

    if (sqlsrv_has_rows($RS_Contact01) === false) {
?>
    <p>There are currently no contacts on record for this Site.</p> 
<?php
    } else {
    while ($ROW_Contact01 = sqlsrv_fetch_array($RS_Contact01, SQLSRV_FETCH_ASSOC)) {
?>
    <tr class="tablebody">
    <td><?php echo($name);?></td>
    <td><?php echo($ROW_Contact01['Email']);?></td>
    <td><?php echo($ROW_Contact01['Phone']);?></td>
    <td><?php echo($ROW_Contact01['Mobile']);?></td>
    <td><a class="linkbutton shuttlegray shuttlegrayhover" href="contact-det.php?1=1&amp;2=<?php echo($ROW_Contact01['ContactResolveId']);?>">Details</a></td>
    </tr>
<?php
        }
    }
?>
© www.soinside.com 2019 - 2024. All rights reserved.