我似乎无法弄清楚为什么根据
sqlsrv_fetch_assoc
,当结果集中有2行时,sqlsrv_num_rows
只返回1行。我尝试过对参数进行硬编码,但仍然得到相同的结果。
SSMS 结果集
id 描述 ------ ------------- 2 管理员 3 用户
PHP
$col = 'abcd';
$stmt = "SELECT id, [description] FROM dbo.tbl WHERE col = ?";
$params = array( $col );
$options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$query = sqlsrv_query( $conn, $stmt, $params, $options );
if( $query === false ) {
print( print_r( sqlsrv_errors() ) );
}
while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
...
}
当我尝试查看结果集时
$row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );
print_r($row);
收到了
数组 ( [id] => 2 [描述] => 管理员 )
sqlsrv_num_rows
echo sqlsrv_num_rows( $query );
//Returns 2
当我尝试查看结果集时
$row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );
print_r($row);`
既然您单独列出了这一点,我希望您不要这样做(显示所有代码):
$col = 'abcd';
$stmt = "SELECT id, [description] FROM dbo.tbl WHERE col = ?";
$params = array( $col );
$options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$query = sqlsrv_query( $conn, $stmt, $params, $options );
if( $query === false ) {
print( print_r( sqlsrv_errors() ) );
}
while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
...
$row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );
print_r($row);
}
因为很明显,每次循环迭代您都会消耗 sqlsrv_fetch_array 两次,一次用于条件检查,一次在循环内。
从 while 循环中删除所有多余的内容,只有这个 - 绝对没有其他东西,甚至没有 ... 或注释。
while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
print_r($row);
}
:以关联数组、数值数组或两者(默认)的形式返回“下一个”可用数据行。 我强调。sqlsrv_fetch_array
返回值:成功时返回一个数组,如果没有更多行可返回,则返回 NULL,如果发生错误,则返回 FALSE。
您需要执行 while 循环来获取所有记录,如下所示:
while ($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
//process $row
}
$i = 0;
while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
$result[$i][0] = $row['id'];
$result[$i][1] = $row['description'];
$i++; //works
// $i += 1; //does not work with this !
}
var_dump($result);
$Result = array();
$sql = "EXEC CRM_TestSP;";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
$i = 0;
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
$Result[$i]["Description"] = $row['Description'];
$i++;
}
sqlsrv_free_stmt($stmt);
return $Result;
它返回一个像这样的数组:
array(2) { [0]=> array(1) { ["Description"]=> string(4) "Text 1" } [1]=> array(1) { ["Description"]=> string(4) "Text2" } } 1
这正是我正在寻找的。
fetch_array
一次只检索一行(一行是下一行)...尝试类似...
while($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );){
//do something awesome
}
就我而言,我有一个 varchar 字段,但我认为任何 char 字段都可能发生这种情况。
选择替换(替换(替换(替换(替换(替换(替换内容,char(146),''),char(147),''),char(148),''),char(149),'') ),字符(150),' '),字符(151),' ') 来自我的表
然后我得到了所有结果。无法声称此处列出的所有字符是否捕获了所有内容(注意 LF/0x0a 工作正常)
这是 PHP 的 Linux 版本。