sqlsrv_has_rows 无法使用存储过程。有办法解决这个问题吗?

sqlsrv_has_rows not working with Stored Procedures. Is there a way round this?

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

我们使用 SP 的原因是一些查询需要 table 变量并使用 'with CTE' 来产生最终结果。

我遇到的问题是我需要检查是否返回了行,如果没有则显示 suitable HTML 消息。函数 sqlsrv_has_rows() 适用于标准 SELECT 语句但不适用于 SP。我被引导相信这是 SQL 本机驱动程序的问题,而不是 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() expects parameter 1 to be resource, bool given'

警告。

我可以找到各种提到打开“SET NOCOUNT ON;”等的线程,但我正在努力寻找一个实际的 workaround/solution 允许我检测何时没有返回任何行并采取相应行动。

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

出现"sqlsrv_num_rows() expects parameter 1 to be resource, bool given"错误的原因是语句没有正确执行。可能是打字错误(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
        }
    }
?>