PHP:清除屏幕(或将屏幕设置为空白)

时间:2015-02-15 04:25:57

标签: php

===================

注意:这不是重复的,因为我已经尝试了linked question上的解决方案,但它对我的问题不起作用

===================

我怎样才能"擦除"任何以前的[浏览器]回显的项目? - 完全清除屏幕(将屏幕设置为空白)?

例如......:

<?php
function test($var) {
    if ($var === 0) { echo "Hello "; }
    if ($var === 1) { echo "World"; }
    if ($var < 0 || $var > 1) { [clear screen]; echo "Number is too big";}
}

test(0);
test(1);
test(666);

========更多细节========

我遇到的问题是这个。该页面呈现HTML的一部分,但当它到达关键字时,它会停止并回显我需要的内容(如果页面没有关键字,则为预期行为)。

然而,由于它没有清除屏幕和DOM ...因此,浏览器的屏幕是空白的,没有任何错误消息。这是因为我需要擦除任何先前回显的输出。

我在发布此问题之前尝试ob_end_clean()。但它不起作用

PHP:

class keywords{

    private static function run(){
    ...pdo code...
    ...some more code...
    if( $sht->rowCount() === 0 ){
        ...[clear screen goes here]...
        exit("Page " . $pageID . " has no keywords");
    else...
    ...more code
    }

    ...more code    
}

在HTML方面,我使用...content="<?php keywords::run(); ?>" />。当页面没有关键字时,这是输出(不清除浏览器):

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">

    <meta name="description"    content="Some page" />  
    <meta name="keywords"       content="Page: 0123456789 Page has no keywords

因此,屏幕为空白,没有任何错误消息

10 个答案:

答案 0 :(得分:5)

PHP文档

ob_start说:

  

输出缓冲区是可堆叠的,也就是说,当另一个ob_start()处于活动状态时,您可以调用ob_start()。只需确保调用ob_end_flush()适当的次数。如果多个输出回调函数处于活动状态,则将按嵌套顺序依次对每个输出回调函数进行过滤。

ob_clean说:

  

输出缓冲区必须由带有 PHP_OUTPUT_HANDLER_CLEANABLE 标志的ob_start()启动。否则ob_clean()将无效。

PHP文档PHP_OUTPUT_HANDLER_CLEANABLE

  

控制是否可以清除ob_start()创建的输出缓冲区。

     

自PHP 5.4以来可用。

您确定可以启动/刷新/结束输出缓冲区吗? 你检查过你的服务器配置了吗? 您确定没有输出缓冲区堆叠吗?

答案 1 :(得分:3)

您可以从output control获得一些帮助 关键功能:ob_startob_cleanob_end_flush 尝试以下代码

<?php
ob_start();
function test($var) {
    if ($var === 0) { echo "Hello "; }
    if ($var === 1) { echo "World"; }
    if ($var < 0 || $var > 1) { 
        ob_clean(); 
        echo "Number is too big";
    }
}

test(0);
test(1);
test(666);
ob_end_flush();

答案 2 :(得分:2)

您有什么理由不能做以下事情吗?在您知道要打印/回显的内容之前,您不应该输出

<?php
$output = "";
function test($var) {
if ($var === 0) { $output = "Hello "; }
if ($var === 1) { $output = "World"; }
if ($var < 0 || $var > 1) { [clear screen]; $output="Number is       too big";}
}
Function outputCheck(){
  Echo $output;
}

test(0);
test(1);
test(666);

outputCheck();

答案 3 :(得分:1)

事实上,当我不理解您的需求时,您不想清除屏幕,而是在浏览器中查看错误消息,而不查看源代码。这是不可能的,因为你已经打开了标签。

试试这个,而不是退出代码:

   exit('<html><head></head><body>Page ' . $pageID . " has no keywords</body></html>");

您必须关闭,您的元标记和标题并启动正文标记。

答案 4 :(得分:1)

您正以非常糟糕的方式使用“退出”: http://php.net/exit

退出将完成脚本的执行,我想这不是你期望的行为。因此,当文档没有关键字时,您的代码无法正常工作:

class keywords{

    private static function run(){
    ...pdo code...
    ...some more code...
    if( $sht->rowCount() === 0 ){
        ...[clear screen goes here]...
        exit("Page " . $pageID . " has no keywords");
    else...
    ...more code
    }

    ...more code    
}

您必须使用“return”或其他方式退出“run”但不结束PHP脚本执行!

例如(将此文字保留在关键字标签内):

class keywords{

    private static function run(){
    ...pdo code...
    ...some more code...
    if( $sht->rowCount() === 0 ){
        ...[clear screen goes here]...
        echo "Page " . $pageID . " has no keywords";
        return;
    else...
    ...more code
    }

    ...more code    
}

示例(不留任何文字):

class keywords{

    private static function run(){
    ...pdo code...
    ...some more code...
    if( $sht->rowCount() === 0 ){
        ...[clear screen goes here]...
        return "Page " . $pageID . " has no keywords";
    else...
    ...more code
    }

    ...more code    
}

该文本可用于向调用者发出有关该问题的警告,但在您的代码中,它会默默地将关键字标记保留为空,并仍然让其余的PHP脚本运行。

最好的问候。

答案 5 :(得分:0)

您无法提供输出。通常,服务器会立即发送每个输出。因此打印或回声无法逆转。但您可以通过 ob_start();

启动所有代码来缓冲输出

在代码结束时,您可以使用 ob_end_flush();

将缓冲区发送给客户端

要输出错误详细信息,您可以使用以下自定义功能:

function error($str) {
    ob_end_clean();
    exit($str);
}

这将是你的伎俩。

<强> BUT

在发送html之前收集元数据的所有信息会好得多。这将导致更快地发送到客户端。如果所有信息都清楚,您只需输出元数据:

$test1 = test(1);
$test2 = test(2);
if //all my content is okay {
    ...paste html here...
}

答案 6 :(得分:0)

<?php
ob_start(); //starts the buffer
function test($var) {
    if ($var === 0) { echo "Hello "; }
    if ($var === 1) { echo "World"; }
    if ($var < 0 || $var > 1)
    {
         ob_get_clean(); //fetches buffer (not used here) and cleans it. It do not stop the buffer from working like  ob_end_clean();
         echo "Number is too big";
    }
}

test(0);
test(1);
test(666);

这通常用于加载自定义插件的cms。人们倾向于在文件末尾添加前导输入或在第一个<?php标记之前输入空格/输入,因此引擎通常会打开ob处理程序,然后在加载所有内容之后(并且在模板用于输出之前 - 它会清除来自所有错误的缓冲区,进入等等。

答案 7 :(得分:0)

好的......你应该用这个:

exit(' " /> </head><body> Page '.$pageID.' has no keywords </body></html>');

答案 8 :(得分:0)

好的,我会尝试以多种方式面对这个问题。我们可以理解,您的第一个“测试”脚本:

<?php
function test($var) {
    if ($var === 0) {
        echo "Hello ";
    }
    if ($var === 1) {
        echo "World";
    }
    if ($var < 0 || $var > 1) {
        echo "Number is too big";
    }
}

test(0);
test(1);
test(666);

应仅导致:

  

数字太大了

正如您在其他答案中看到的那样 - ob_start适用于此,但由于它在函数中使用,因此必须正确嵌套。以下示例正常工作。

function test($var)
{
    if ($var === 0) {
        echo "Hello ";
    }
    if ($var === 1) {
        echo "World";
    }
    if ($var < 0 || $var > 1) {
        ob_clean();//clear all output till now
        echo "Number is too big";
    }
}
ob_start();//start buffering output
test(0);
test(1);
test(666);

所以我们得到了基础知识。让我们回到你的代码。

我认为HTML是这样的:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="description"    content="Some page" />  
    <meta name="keywords"       content="<?php keywords::run(); ?>" />
</head>
<body>
maybe some content?...
</body>
</html>

目前尚不清楚是否要发送只有错误的空白页,或将此错误发送到您的身体中。我假设后者。

可能的解决方案:在内容的某处放置其他错误

因此,我们希望从关键字:: run()中捕获该错误,并将其放在正文中的某个位置。让我们使用新课程吧!

class YourErrorCatcher
{

    private static $errors = array();//array for collecting all your errors

    public static function addError($errorString)//method to add new error
    {
        self::$errors[] = $errorString;
    }

    public static function echoErrors()//function echoing all your errors in selected place
    {
        $errorMessage = implode("<br>", self::$errors);
        echo $errorMessage;
        return true;
    }

}

现在,您的HTML可以与以前一样,只需添加一个:

<body>
maybe some content?...
and here we have our errors:
<?php YourErrorCatcher::echoErrors(); ?>
</body>

现在应该如何查看关键字类?

class keywords{

    private static function run(){
    //i assume that this function is echoing some keywords, so let's start buffering output
    ob_start();
    ...pdo code...
    ...some more code...
    if( $sht->rowCount() === 0 ){
    ob_clean();//there's error - clear buffer!
    //"throw" error
    YourErrorCatcher::addError("Page " . $pageID . " has no keywords");
    YourErrorCatcher::addError('Yes, you can "throw" more than one error in this solution and all of them will be shown.');
    //instead of exit we're returning false
    return false;
    else...
    ...more code
    }

    ...more code    
}

这个很长一段时间开放,也许这会对你有所帮助。如果这有助于你,请告诉我!

答案 9 :(得分:-1)

我尝试了您在说明中提供的示例代码以及下面的代码。

<?php
    ob_start();
    function test($var) {
        if ($var === 0) { echo "Hello "; }
        if ($var === 1) { echo "World"; }
        if ($var < 0 || $var > 1) { 
            ob_end_clean(); 
            echo "Number is too big";
        }
    }

    test(0);
    test(1);
    test(666);

有关ob_end

的更多详情

让我知道它是否适合你。