1

我对以下代码块有疑问。我不能将它们都放在同一页面中,否则最后一个失败(无论他们是否改变位置,最后一个失败)。如果我注释掉一个(不管是哪个),那么另一个就可以了。所以它看起来不像实际代码的问题?

不能在同一页面中运行这两个吗?我显然做错了什么,所以请帮我指出它是什么。

while( $test = sqlsrv_fetch_array( $data, SQLSRV_FETCH_ASSOC) ) {
    if ($_GET['unit'] == '15min') { $newDate = $test['dt']->format('H:i:s'); }
    if ($_GET['unit'] == 'hour') { $newDate = $test['dt']->format('m/d H:i'); }
    if ($_GET['unit'] == 'day') { $newDate = $test['dt']->format('Y/m/d'); }
    $dates[] = $newDate;
    $values[] = $test[$pick_graph];
}

第二个

while( $row = sqlsrv_fetch_array( $data, SQLSRV_FETCH_ASSOC) ) {
$newDate = $row['dt']->format('Y/m/d_H:i:s');

    echo    '<tr>'.
            '<td>'.$row['net']."</td>".
            '</tr>';
}

没有错误消息或任何东西。当第二个循环运行时,就好像 $data 是空的或者什么东西,因为它没有循环任何东西,在那里放一个 echo 不会输出任何东西。

4

2 回答 2

4

与计算机科学中的许多模式(例如文件 IO)一样,大多数库中的查询结果都被视为流。你得到了结果,但你不能向后跳过,如果不重新运行查询就不能重新开始。

您可以再次运行查询,也可以将结果缓存在数组中。

$cache = array();
while ($row = sqlsrv_fetch_array($data, SQLSRV_FETCH_ASSOC))
    $cache[] = $row;

然后,您可以foreach$cache您的两个位置执行与您的问题相同的逻辑。

在大多数情况下,缓存是更好的选择。

但是,如果您谈论的是一个非常大的结果集(1000 秒),则最好运行两次查询,因为您一次只需要在 RAM 中存储一行。已经使用的行将被垃圾收集。

与所有性能方面的事情一样,如果它很重要,请从两个方面进行分析并确定哪个符合您的目标。

于 2012-12-07T13:46:51.117 回答
3

我猜你sqlsrv_query()只打电话一次,你想迭代两次低谷结果。

在这种情况下,这是预期和想要的行为。否则,您将永远陷入循环(如果sqlsrv_fetch_array达到最终结果,它将重新开始)。

例如看看 MySQLs mysql_data_seek(),但根据手册,没有 SqlSrv 替代品,所以你有两个选择:

  • 第一次执行查询并遍历所有行时将所有结果缓存到数组中[可能更好的解决方案]
  • 每次要查看数据时执行查询
于 2012-12-07T13:49:03.817 回答