所以我有一个名为create.php的页面,它创建另一个名为“1”的php文件。在这个名为“1”的php文件中。我本来希望用
<?php echo $_SERVER['PHP_SELF'];?>
或
<?php $path = $_SERVER["SCRIPT_NAME"];echo $path;?>
创建一个链接,该链接将获取页面的编号并将其+1。当我执行这两个功能而不是获得我认为我会得到的东西时,“1”,我得到“创建”,它是用它创建的页面。我很惊讶为什么会发生这种情况,代码肯定是在“1”上,我甚至仔细检查以确保创建了一个文件并且我在它上面,为什么它认为当前页面是“创建” ?
正在使用的代码
<?php
// start the output buffer
ob_start(); ?>
<?php echo $_SERVER['PHP_SELF'];?>
<?php
// open the cache file "cache/1" for writing
$fp = fopen("cache/1", 'w');
// save the contents of output buffer to the file
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
?>
答案 0 :(得分:1)
你将代码拆分成碎片,你可能对于cache/1
中发生的事情和将要写的内容有错误的想法。您的代码与以下内容相同:
<?php
// start the output buffer
ob_start();
// echo the path of the current script
echo $_SERVER['PHP_SELF'];
// open the cache file "cache/1" for writing
$fp = fopen("cache/1", 'w');
// save the contents of output buffer to the file
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
我删除了关闭的PHP标记(?>
),后面是一个打开的PHP标记(<?php
)。
现在应该清楚的是,如果没有输出缓冲,脚本create.php
将显示相对于文档根目录的自己的路径。输出缓冲捕获输出并将其放入文件cache/1
。
你甚至不需要输出缓冲。您只需删除对ob_*
个函数的所有调用,删除echo()
行并使用:
fwrite($fp, $_SERVER['PHP_SELF']);
很明显,这不是你的目标。您可能希望生成包含以下内容的PHP文件:
<?php echo $_SERVER['PHP_SELF'];?>
这很简单,只需将此文本放入字符串并将字符串写入文件:
<?php
$code = '<?php echo $_SERVER["PHP_SELF"];?>';
$fp = fopen("cache/1", 'w');
fwrite($fp, $code);
fclose($fp);
您甚至可以使用PHP函数file_put_contents()
,并且您在问题中发布的所有代码都会变为:
file_put_contents('cache/1', '<?php echo $_SERVER["PHP_SELF"];?>');
如果您需要在生成的文件中放置更大的PHP代码块,那么您可以使用nowdoc字符串语法:
$code = <<<'END_CODE'
<?php
// A lot of code here
// on multiple lines
// It is not parsed for variables and it arrives as is
// into the $code variable
$path = $_SERVER['PHP_SELF'];
echo('The path of this file is: '.$path."\n");
$newPath = dirname($path).'/'.(1+(int)basename($path));
echo('The path of next file is: '.$newPath."\n");
// That's all; there is no need for the PHP closing tag
END_CODE;
// Now, the lines 2-11 from the code above are stored verbatim in variable $code
// Put them in a file
file_put_contents('cache/1', $code);