我正在运行一个可以执行各种操作的脚本。其中一个问题是在html textarea框内向屏幕生成css文件的内容,并允许编辑和提交。为了用我使用的新内容覆盖现有文件:
$myFile = "default.css";
$fh = fopen($myFile, 'w');
$stringData = $_POST['css'];
$write = fwrite($fh, $stringData);
fclose($fh);
如果我添加到文件并提交内容将擦除并按预期写入文件。但是,如果我从文件中删除了内容,则新提交的数据将附加到现有数据的顶部,而不是删除它。
如果在添加和删除数据时如何覆盖文件?
更新
通过添加和删除,澄清一小部分我的css文件:
p, h1 {
text-align: center;
}
如果我要添加color: blue;
并提交,则会添加此内容,文件的其余部分将保持不变。如果我然后删除这个新添加的信息并再次提交新的工作表(没有color: blue;
)将附加到顶部(对不起,我首先说底部)所以没有颜色的工作表将是顶部,整个工作表将有颜色将在下面。
我已经尝试了file_put_contents("default.css", $_POST['css']);
同样的结果。包括var_dump($stringData);
在首次提交时显示字符串长度为1500(ish),在第二次提交时显示大约3000。正如建议的那样,我提交了$stringData;
来清除字符串,一旦提交内容进行写作。
因为我不想留下比特,因为这里的某人可能很明显很明显这个请求的完整php($ data是收集并打印内容到textarea):
if (isset($_POST['css'])) {
$myFile = "default.css";
$fh = fopen($myFile, 'w');
$stringData = $_POST['css'];
$write = fwrite($fh, $stringData);
var_dump($stringData);
fclose($fh);
$stringData;
}
$data = file_get_contents("default.css");
控制此的表格:
<form onsubmit="return confirm('Confirm Submission');" method="post" action="<?php echo ($_SERVER["PHP_SELF"]);?>">
<textarea cols="60" rows="20" name="css" id="css"><?php echo $data; if(isset($_POST['css'])) {
echo htmlentities ($_POST['css']); }?>
</textarea>
<br><br>
<input type="submit" value="Submit CSS"/>
</form>
答案 0 :(得分:3)
我怀疑问题出在$stringData
。在页面的某处尝试var_dump($stringData)
。查看是否附加了新的简化数据。 $stringData
是否需要清除? $stringData;
会这样做。
w
通常会写新的。 a
会追加。我怀疑问题在于表单处理而不是文件操作。
答案 1 :(得分:1)
只需使用file_put_contents(),您就没有问题。该函数接受一个字符串,并写入一个文件(不附加)。
全部在一行!
file_put_contents("default.css", $_POST['css']);
答案 2 :(得分:1)
这不是真的有意义 - 打开模式w
应该写,并将指针放在文件的开头。请尝试w+
而不是w
,如果这不起作用,请使用file_put_contents
。这将上面的整个代码块转换为:
file_put_contents("default.css", $_POST['css']);
答案 3 :(得分:0)
在尝试了一些建议并尝试了我自己的一些后,我做了一个相当讨厌的发现[因为我没有立即发现它]。我发现重复来自textarea框,正如@Mr. Helper所建议的那样。每次提交数据时,都会附加到框的末尾。
为了解决这个问题,我将$data = file_get_contents("default.css");
变量移动到一个单独的PHP文件(style.php),其中包含一个$data;
清晰的方面以防万一。 style.php文件通过onclick ajax请求运行。现在,当按下提交按钮时,没有请求将现有的css表从$ data变量打印到文本区域。
感谢所有建议。我从所有的评论和答案中找到了一些更好的方法来实现我的代码。