我遇到一种奇怪的情况,我从未遇到过来自我的类方法的返回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
编辑:经过进一步调查后,最终的$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'])]
存在问题吗?
答案 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