【问题标题】:Pausing output buffer in php在php中暂停输出缓冲区
【发布时间】:2012-01-22 06:34:47
【问题描述】:

这是我的问题。我希望能够只缓冲表格的内容而不是标题。是否可以在 php 中暂停输出缓冲,以便我可以跳过表头上的缓冲并在实际内容的开头再次恢复?

<?php ob_start(); ?>
<table>
<tr>
    <th>Account</th>
    <th>Quarter</th>
    <th>Amount</th>
</tr>
    <?php 
    foreach($tc_item as $v){ 


    if($v->dbl_amt != 0){
    ?>
    <tr>
    <!-- Nature of Collection -->
        <td id="nature"><?php echo $v->strDescription; ?></td>
     <!-- Account Code -->     
        <td id="account"><?php echo $v->str_details; ?></td>
     <!-- Amount -->
        <td id="amount"><?php echo number_format($v->dbl_amt,2, '.', ''); ?></td>

    </tr>
    <?php } ?>
    <?php } ?>

</table>
<?php 
$_SESSION['or_details'] = ob_get_contents();
?>

【问题讨论】:

  • 为什么不将ob_start() 移到标题下方?
  • 缓冲表的意义何在?
  • @Col.Shrapnel 我在表格的顶部有一些东西要缓冲,而且如果我不在表格标签之前缓冲,数据实际上也不会作为表格出来。跨度>

标签: php output-buffering


【解决方案1】:

如果你不想缓冲整个表,那就不要缓冲它:

<table>
  <thead></thead>
  <?php ob_start();?>
  <tbody></tbody>
  <?php $tbody = ob_get_flush(); ?>
</table>

如果你想缓冲整个表格,但又想要单独的表格体,那么再增加一层缓冲:

<?php ob_start();?>
<table>
  <thead></thead>
  <?php ob_start();?>
  <tbody></tbody>
  <?php $tbody = ob_get_flush(); ?>
</table>
<?php $table = ob_get_clean(); ?>

或者,您可以刷新当前缓冲区而不创建新缓冲区。我不推荐这样做,因为它会使您的代码更难遵循。这也很愚蠢,因为如果您只是在不捕获字符串的情况下进行刷新,那么您可能一开始就不缓冲:

<?php ob_start()?>
<table>
  <thead></thead>
  <?php ob_flush();?>
  <tbody></tbody>
  <?php $tbody = ob_get_contents(); // only contains output since last flush ?>
</table>
<?php ob_end_flush(); ?>

【讨论】:

  • 是否有一个 all_obs_end_flush 可以刷新所有当前打开的缓冲区?
  • while (ob_get_level()) ob_end_flush();
【解决方案2】:

在头部之后开始缓冲

<table>
<tr>
    <th>Account</th>
    <th>Quarter</th>
    <th>Amount</th>
</tr>
<?php
ob_start();
echo "table data";
ob_end_flush();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2012-06-09
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    相关资源
    最近更新 更多