【问题标题】:sqlsrv_has_rows not working with Stored Procedures. Is there a way round this?sqlsrv_has_rows 不适用于存储过程。有办法解决这个问题吗?
【发布时间】:2021-02-16 20:06:42
【问题描述】:

我正在将一些旧的 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 编码新手的实际帮助(包括最佳实践)。

【问题讨论】:

  • 你试过SET NOCOUNT ON吗?
  • 这里有 SQL 注入的风险,你应该使用正确的参数化,而不是插值
  • 大卫,我尝试的第一件事。
  • 查理脸。有效点,会这样做。

标签: php sql-server sqlsrv


【解决方案1】:

“sqlsrv_num_rows() 期望参数 1 是资源,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
        }
    }
?>

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2023-01-26
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多