为什么不覆盖file_put_contents?

时间:2012-04-12 07:37:54

标签: php javascript

我有一个页面,其中包含用户可以使用的WYSIWYG编辑器。编辑后,他们可以按一个按钮,javascript应该将当前页面POST到save.php文件,并使用新信息刷新页面。

有两个问题。首先,最初页面不会加载更新的文件。用户必须刷新页面才能看到它更新(也许只需要额外的一秒钟来编写文件?)。第二个问题是,在第一次创建临时文件之后,它无法被覆盖,因此页面在第一次刷新后永远不会更新。以下是我与之合作的片段:

WYSIWYG编辑器页面上的Javascript函数(editor.php):

function refresh(html,username,info)
{
    $.post("save.php", { html: html, username: username } );
    window.location = 'editor.php?info=' + info;
}

save.php文件

$html = $_POST['html'];
$username = $_POST['username']; 
file_put_contents('temp/' . $username . '.txt', $html);

3 个答案:

答案 0 :(得分:1)

由于浏览器在导航到下一页之前可能尚未发出POST请求,请使用帖子中的成功回调来进行重定位:

function refresh(html,username,info) {
  $.post("save.php", { html: html, username: username }, function() {
    window.location = 'editor.php?info=' + info;
  });
}

正如其他人已经评论过的那样,直接使用表单帖子中的数据而不进行消毒是一个非常糟糕的计划,并且会使您的服务器受到各种恶意攻击。看看其中一些问题:https://stackoverflow.com/search?q=sanitize+php

如果数据到达您的服务器,请确保目录'temp'上的访问权限允许来自Web服务器用户的写访问权限(如果您有权访问服务器的SSH,请运行chmod go+w /path/to/temp ,否则大多数FTP程序也允许你设置文件权限。

答案 1 :(得分:0)

为什么不使用fopenfwrite

只需使用:

$html = $_POST['html'];
$username = $_POST['username']; 
$file = "temp/" . $username . ".txt";

if (!file_exists($file)) {
  $files = fopen($file, "x+");
} else {
  $files = fopen($file, "w+");
}

if(fwrite($files, $html)) {
  echo "Success!";
} else {
  echo "Failure!";
}

对于php并使刷新工作在js中,尝试将语句放在成功函数中,如下所示:

function refresh(html,username,info) {
    $.post("save.php", { html: html, username: username }, 
            function (response) {
             window.location = 'editor.php?info=' + info;
             console.log(response);// for debugging :) 
           });
}

答案 2 :(得分:0)

ajax请求是异步的,因此在重定向开始时可以进行写入操作。你必须听完$ .post动作的完成exent来进行重定向。