===================
===================
我怎样才能"擦除"任何以前的[浏览器]回显的项目? - 完全清除屏幕(将屏幕设置为空白)?
例如......:
<?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
因此,屏幕为空白,没有任何错误消息
答案 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_start
,ob_clean
,ob_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
的更多详情让我知道它是否适合你。