PHP没有在正确的地方回响

Posted

技术标签:

【中文标题】PHP没有在正确的地方回响【英文标题】:PHP Not Echoing in the right place 【发布时间】:2014-04-23 10:59:19 【问题描述】:

我在我的 WordPress 网站上运行一些 php 代码,当 PHP 运行以回显某些信息时,它并没有在正确的位置回显它。代码的缩写版本是:

<div class="description cms">
    <div id="home_left_middle">
        <h2>Search By Category</h2>
        [xyz-ips snippet="Category-List"]
     </div>
</div>

短代码用于插件 XYZ PHP 代码,它基本上只是在 WordPress 帖子中使用“包含”的一种方式。我在 WP 数据库中设置了一些自定义,但它只是基本的数据库调用。所有信息都从数据库成功返回,所以那里没有问题。我在那里使用的 PHP 代码是:

$sql = "SELECT * FROM wp_categories_table";
$result = $wpdb->get_results($sql);

echo "<ul class='category_list'>";

foreach( $result as $results ) 
    $category = $results->category; 
    $number = $results->number_of;
    $category_html = htmlentities($category);

    echo "<li><a href='?search-class=DB_CustomSearch_Widget-db_customsearch_widget&widget_number=preset-default&cs-all-0=&cs-post_cat-1=".$category_html."&search=Search'>".$category." (".$number.")</a></li>";


echo "</ul>";

发生的情况是,当 PHP 代码运行时,它会在 div.description 之后(以及 div#home_left_middle 之前)回显它,并且只有 H2 保留在 home_left_middle div 中。那不是运行代码的地方。

奇怪的是,我在另一个站点上使用了完全相同的代码(我复制了这个站点,因为我们只是在更改服务器,但内容完全相同)并且它在另一个服务器上运行良好。这是一个 VPS,所以我想知道是否有某种我没有正确安装在服务器上的 PHP 扩展可能导致这种情况?我知道这有点牵强,但我很困惑为什么完全相同的代码,在相同版本的 WordPress 中并使用相同的主题和 CSS 文件会在两个不同的站点上导致不同的结果。我看到的唯一区别可能是服务器,除非我忽略了一些小错误?

编辑

对于那些询问输出缓冲问题的人,我最近从最后一个服务器复制了 php.ini 文件,输出缓冲代码如下所示:

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

所以它似乎被注释掉了。

【问题讨论】:

你看的是源还是输出? 源代码通过“查看源代码”或谷歌浏览器上的检查器。查看页面时也很明显。 我只能猜测.....但是短代码回调返回数据而不是回显。在大多数情况下,Shortcode 回调将通过打开输出缓冲区、捕获所有回显数据,然后返回输出缓冲区的内容来规避这一点。您的 Wordpress 安装中可能有一个插件,它可以打开输出缓冲区并使其保持打开状态(有时这样做是为了允许在 Wordpress 操作顺序的后期发生重定向)。尝试一一禁用您的插件(XYZ PHP 除外),看看是否有任何改变。 尽管如此,我越想,我就越意识到如果是这种情况,那么您的文本可能会延迟而不是更早地输出。尽管如此,检查插件冲突通常是调试的第一步。 嗨@maiorano84,禁用插件并没有解决问题。还有其他想法吗?我尝试用几种不同的方式格式化代码,但结果仍然相同...... 【参考方案1】:

就像 cmets 中建议的 maioran84 一样,这可能是输出缓冲区的一些问题。我建议您将 php.ini 文件从工作站点复制到非工作站点服务器。

查看 PHP 配置文件,有一些设置可能会导致在 wordpress 准备好之前显示输出。

; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block.  This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block.  Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
; http://php.net/implicit-flush
; Note: This directive is hardcoded to On for the CLI SAPI
implicit_flush = Off

output_buffering = 4096

查看add_shortcode() 的 WordPress 文档,以下文本块真的很突出。您可以轻松更改所有 echo 语句以将值附加到字符串,然后将字符串作为一个整体返回。

请注意,短代码调用的函数不应产生任何类型的输出。简码函数应返回用于替换简码的文本。直接产生输出会导致意想不到的结果。这类似于过滤器函数的行为方式,因为它们不应从调用中产生预期的副作用,因为您无法控制调用它们的时间和位置。

https://codex.wordpress.org/Function_Reference/add_shortcode

希望这可以帮助您解决这个问题,但我以前从未听说过任何类似的错误发生。

【讨论】:

php.ini 文件应该是这样的吗?我在上面放了代码来显示最后一个 php.ini 文件的外观。我已将其复制到当前服务器,但无法正常工作。我是否需要通过 WHM 重新启动 PHP 以反映更改? 另外,我按照你说的编辑了代码(我今天早些时候就想到了),但不幸的是这并没有改变任何东西。 成功了。我必须进入 .htaccess 并将加载的配置文件更改为我上传的旧 php.ini 文件的当前路径。那令人困惑。非常感谢帮忙。我学到了新东西!【参考方案2】:

我知道这个问题已经过时并且已经解决了,但是我遇到了同样的问题并设法以不同的方式解决它,所以我想我会分享:)

我使用的是与你相同的 wordpress 插件,XYZ php 代码,它在被调用的 div 上方输出。我切换到另一个名为“PHP Code for posts”的插件,它的工作原理完全相同作为 XYZ,期望有一个稍微好一点的代码编辑器,它的输出完全符合预期。

这很奇怪,因为我通常在我的 WP 版本中使用 XYZ 并且它总是运行良好,所以我只能猜测是插件交互不好。显然,插件的工作方式有所不同,但我今天还没有足够的勇气去弄清楚是什么;)。

【讨论】:

以上是关于PHP没有在正确的地方回响的主要内容,如果未能解决你的问题,请参考以下文章

返回响应时,Symfony 4.4 转储不输出任何内容

返回响应时,Symfony 4.4 转储不输出任何内容

Delphi:PJL 命令到打印机并读回响应

2018-3-1 10周2次课

当 Api 返回响应时,如何以角度显示“登录失败。请重试”消息?

为啥 Laravel 网站在 web.php 中没有走正确的路线?啥是自动加载 static.php?