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&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&2=<?php echo($ROW_Contact01['ContactResolveId']);?>">Details</a></td>
</tr>
<?php
}
}
?>
我正在将一些遗留 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&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&2=<?php echo($ROW_Contact01['ContactResolveId']);?>">Details</a></td>
</tr>
<?php
}
}
?>