PHP方法输出结构不正确的HTML?

时间:2017-06-08 01:51:21

标签: php html class methods structure

我遇到一种奇怪的情况,我从未遇到过来自我的类​​方法的返回HTML没有以正确的结构输出的情况。由于某些未知原因,所有内容都嵌套在第一个循环,第二个循环等HTML中。

的index.php

<body>
some html...
<div class="usb-port-container">
<?= $generate->output('short_name',id,'hostname'); ?>
</div>
some html...
<div class="usb-port-container">
<?= $generate->output('short_name',id,'hostname'); ?>
</div>
some html...
</body>

class.generate.php

function __construct() {
    $this->getCopy = new getCopyData();
    $this->getDrive = new getDriveData();
    $this->helper = new helper();

}

function output ($short_name,$id,$hostname) {

    $portCount = $this->getCopy->portCount($hostname, 'total');

    for ($port = 0; $port < $portCount; ++$port) {
        if ($this->getCopy->probePort($hostname,$port)) {
            $default = $this->usbPortDefault($short_name,$id,$hostname,$port);

            return $default;
        } else {
            $details = $this->usbPortDetails($short_name,$id,$hostname,$port);

            return $details;
        }
    }
}

function usbPortDefault($short_name,$id,$hostname,$port) {

    $port_details =  '<div>
                        <div>----</div>
                        <div>----</div>
                    </div>';

    return $port_details;
}

function outputRecords($hostname,$port) {

    //get records data from database
    $records = $this->getCopy->records($hostname,$port);

    //create empty variable for HTML
    $records_html = "";

    foreach ($records as $key => $value) {
        if ($value) {
            $records_html .= '<div><span class="copy-group">' .$key. '</span><span class="copy-instance">' .$value. '</span></div>';
        } else {
            return '<div>Unable to get any group or instance</div>';
        }
    }

    return $records_html;
}

function usbPortDetails($short_name,$id,$hostname,$port) {

  $port_info = '';
  $port_info .= 'bunch of HTML';
  $port_info .= $this->outputRecords($hostname,$port);
  $port_info .= 'bunch of HTML';

  return $port_info;

}

我对问题的最佳猜测是,我返回HTML或输出缓冲的方式存在问题。我实际上并不知道我是否在课堂上需要它,但我已经把它拿出来并且问题是一样的。我还尝试将输出缓冲添加到index.html。

以下是源HTML的摘要。我注意到的第一个差异是以蓝色突出显示的<div class="server-details"></div>不属于那里,它应位于<div class="dc-container"></div>内并与之前的<div class="server-details"></div>相邻。 port-data-left之后port-data-right应该$port_info,但无处可寻。在这一点上,我几乎已经确信某个地方有一个丢失的结束标签,但我无法找到它。自从我认真做了任何开发以来已经好几年了:D

enter image description here

编辑:经过进一步调查后,最终的$port_info .= $this->outputRecords($hostname,$port);似乎没有输出,可能会导致此问题。 X = lambda cus['id'],cus['maxamt']: \ df1_test.TXNID[(df1_test['CUSTOMERID'] == cus['id'])\ &(df1_test['CREDITAMT'] > cus['maxamt'])] 存在问题吗?

1 个答案:

答案 0 :(得分:0)

由于您使用$generate重用了对象实例,因此构造函数和析构函数方法仅在此脚本中调用一次。

构造函数使用ob_start()启动一个新的输出缓冲区,这意味着output方法输出的所有内容都将被缓冲,直到你刷新它。

问题是,刷新只发生在析构函数中,ob_end_flush()只在最后output次调用后执行一次。

因为你echo方法的结果并且同时启动一个缓冲区,输出必须确实很奇怪并且会发生一些嵌套/重复,因为下一个输出仍然会添加到缓冲区。

正如评论中所指出的,最简单的解决方案是关闭课堂中的输出缓冲。

您还需要在方法开头清除$port_info才能使其正常工作,尽管它应该没问题,除非$port_info是全局变量?

这可能在初始类中没有被清除,以便在多次调用时使其工作,以连接结果(并缓冲它们,然后立即输出它们)

在页面中间使用缓冲区是将函数的输出重定向到变量。

例如,您可以使用一个与代码相呼应的功能,但您不希望它回显。

然后您可以执行以下操作:

Some HTML
<?php
ob_start();
call_to_some_function_that_normally_outputs_code();
$myvar = ob_get_clean();
?>
Rest of the HTML