根据sqlsrv_fetch_assoc
,当结果集中有2行时,我似乎无法弄清楚为什么sqlsrv_num_rows
只返回1行。我试图对参数进行硬编码,但我仍然得到相同的结果。
SSMS结果集
id description ------ ------------- 2 Administrator 3 User
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);
我收到了
Array ( [id] => 2 [description] => Administrator )
sqlsrv_num_rows
echo sqlsrv_num_rows( $query );
//Returns 2
答案 0 :(得分:6)
当我尝试查看结果集
时$ row = sqlsrv_fetch_array($ query,SQLSRV_FETCH_ASSOC);
的print_r($行);`
由于你单独列出了这个,我希望你不要这样做(显示所有代码):
$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);
}
答案 1 :(得分:3)
sqlsrv_fetch_array
:将下一个可用数据行作为关联数组,数字数组或两者返回(默认值)。
我的重点。
返回值:成功时返回一个数组,如果没有更多行要返回则返回NULL,如果发生错误则返回FALSE。
你需要做一个while循环来获取所有记录,如下所示:
while ($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
//process $row
}
答案 2 :(得分:0)
我的印象是fetch_array
一次只检索一行(一行是NEXT行)...尝试类似......
while($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );){
//do something awesome
}
答案 3 :(得分:0)
由于“ Ashish”,此代码终于为我服务。我不明白为什么它不支持。
$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
这正是我想要的。
答案 4 :(得分:0)
$sql = "SELECT id, description FROM dbo.tbl";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
$data = array();
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
$data[] = array(
"description" => $row['description']
);
}
return $data;
答案 5 :(得分:-1)
一种简单的方法是使用sqlsrv_fetch_array并使用多维数组存储每个行数据。但是在执行此操作时,请确保使用$ i ++而不是$ i + = 1 如果我们使用$ i + = 1,则仅保存一行。
$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);