<iframe>而不是include </iframe>

时间:2011-04-08 15:33:08

标签: php iframe include comments

我希望使用Commentics php sript在一个页面上包含多个评论部分。 首先,我尝试使用include完成此操作,如下所示:

<div id="1">  
    <?php  
    include "comments_id1.php";  
    ?>  
</div>  
<div id="2">  
    <?php  
    include "comments_id2.php";  
    ?>  
</div>

comments_id1.php:

<?php 
session_start(); 
ob_start();
?>
[...]
<?php 
$page_id = "1"; 
$reference = "Page One"; 
$path_to_comments_folder = "comments/"; 
define ('IN_COMMENTICS', 'true');
require $path_to_comments_folder . "includes/commentics.php";
?>

(comments_id2.php相应地:$page_id = "2"; $reference = "Page Two"

显然(并且可能值得注意的是,当涉及到PHP时我仍然非常无能为力),这不起作用或至少导致各种麻烦(例如“警告:无法修改标头信息 - 标题已发送“)。

因此,我提出的解决方案是使用<iframe>标记,如下所示:

<div id="1">  
    <iframe width="100%" src="comments_id1.php"></iframe> 
</div>  
<div id="2">  
    <iframe width="100%" src="comments_id2.php"></iframe>  
</div>

现在这是我的问题: 这甚至是任何人都会推荐的有效解决方案吗?如果是这样的话,使用<iframe>为此目的会产生什么重大后果(除了搜索引擎)? 如果不是这样的话,有什么建议吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

我个人非常讨厌IFRAME,所以我建议远离它们。

您是否阅读过Commentics' integration guide

看来你必须把

<?php
    session_start();
    ob_start();
?>

在pag的开头,

<?php
    $page_id = "1";
    $reference = "Page One";
    $path_to_comments_folder = "comments/";
    define ('IN_COMMENTICS', 'true'); //no need to edit this line
    require $path_to_comments_folder . "includes/commentics.php"; //no need to edit this line
?>

你想要你的评论。还有extended integration guide

答案 1 :(得分:1)

我不会使用iframe ......

解决标题问题,你可以缓冲输出(标题只能在实际内容之前发送),然后一次发送所有内容:

ob_start();
// your code with includes
ob_end_flush();

答案 2 :(得分:1)

我不熟悉您正在使用的脚本,但iframe有一些明显的缺点。这种方法的一些缺点可能是:

  • iframe需要在HTML标记中定义其宽度和高度。如果Iframe中的维度不同(例如,由于比平时的评论更长),您将获得额外的滚动条设置。
  • iframe的内存使用率和呈现时间很长,尤其是在较旧的Internet Explorer版本中

要避免“无法修改标头信息”警告,您可以在PHP中启用output buffering,或者您可以查看您正在使用的脚本实际发送的标头。也许他们没必要?

答案 3 :(得分:1)

使用iframe的另一个后果是渲染可能是乱序的,因为它是一个独立的HTTP请求,并且,因为它是一个额外的请求,这可以增加检索数据的总时间,尤其是在IE中8之前的版本,它们一次限制为2个同时的HTTP请求 - 因此,如果您同时加载图像或其他脚本,其中一些可能会排队,直到两个插槽中的一个或两个都空闲。 IE8(和Firefox)将此提升至6。

虽然看起来真正的解决方案是调查他们修复评论家的脚本,或者你找到了另一个图书馆,尽管你可能会在这里找到相反的建议(虽然有充分的理由),对于初学者,我建议专注关于实用性和实验而不是教条;换句话说,只要iframe中没有链接,只要iframe中没有链接,就会导致iframe被内容替换。出于我和其他人提到的原因,这不是最好的做法。

需要注意的另一个问题是,即使在开始<?php之前最轻微的空格也会被解释为发送给用户的文本,因此如果您包含的脚本尝试添加标题,则可能会出现问题。已发送消息的标头意味着脚本已开始发送标头,因为它需要在开始发送已经开始打印的内容(在这种情况下是空白)之前发送它们(没有缓冲)。

对于PHP,我真的推荐像Smarty这样的模板引擎(Smarty很好地记录在案),你可以放心让你的业务逻辑先运行,然后将变量提供给设计逻辑以供在那里使用(目前是什么)是你的HTML +包括)。当您包含其他输出文本的库时,您仍然需要使用缓冲,原因是您发现的原因。

答案 4 :(得分:0)

只需删除:

<?php
    session_start();
    ob_start();
?>

来自comments_id1.php

它会起作用。