【发布时间】:2016-06-10 15:10:25
【问题描述】:
对于文件管理,我使用表单来重命名通过 foreach 循环显示的文件。
首先是php:
if(isset($_POST['rename'])) {
if(!is_dir($_POST['old_name'])) {
rename($_POST['old_name'], $NewFileName);
exit;
}
}
形式:
<form class="sfmform" method="post" action="">
<input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" />
<input class="new_name" type="text" name="new_name" placeholder="only a-z, A-Z and 0-9" value="" />
<input type="submit" class="rename" name="rename" value="Go" />
</form>
注意:表单是 foreach 循环的一部分,靠近每个文件
js(ajaxForm):
$('.sfmform').ajaxForm({
success: function(data) {
status.html(data);
$('.myFiles').load(document.URL + ' .myFiles');
},
});
div .myFiles 包含渲染的文件,其中包含 foreach 循环。
会发生什么: 拳头重命名正确;没有硬刷新,他重命名文件并且它立即可见,因为 div .myFiles 已加载。 但是第二次重命名出错了;他遵循php中的循环并死去。 如果我不使用出口;在 php 中,他多次生成 myFiles div。
当我进行硬刷新时;我可以重新命名。但是在没有硬刷新的情况下一个接一个地重命名,他就死了。
我做错了什么?
我还有其他形式用于创建具有相同类的目录:sfmfom,这些不是 foreach 循环的一部分。有了它们,我可以毫无问题地使用它们两次。 为什么这只发生在作为 foreach 循环一部分的表单上? 我怎样才能使它正常工作?
更新:foreach
/* RENDER THE FILES */
foreach ($files as $file) {
if ($file != '.' && $file != '..') { // don't show links to previous folders
$MimeFileType = mime_content_type($dir.'/'.$file);
$FileExtension = pathinfo($file, PATHINFO_EXTENSION);
$ClassExtension = 'sfm_'.$FileExtension;
.......
<td>
<!-- RENAME -->
<form class="sfmform" method="post" action="">
<input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" />
<input class="new_name" type="text" name="new_name" placeholder="only a-z, A-Z and 0-9" value="" />
<input type="submit" class="rename" name="rename" value="Go" />
</form>
</td>
}
}
【问题讨论】:
-
等到有人开始向您的脚本提交
old_name=/etc/passwd和其他有趣的路径! -
php 中有什么循环?正如@jszobody 所说:这段代码非常危险 - 您允许用户指定 ANY 文件/路径,他们知道您的服务器上的名称。这使您几乎可以窃取机器上的所有文件。
-
@jszobody 我知道操纵旧名称的问题。但这在其他地方受到保护!但这不是我的问题……
-
就个人而言,我建议您更新数据库中的链接,而不是移动文件系统上的实际文件。但是,您最可能需要刷新的问题是 jQuery 操作未绑定到动态加载的表单。请参阅stackoverflow.com/questions/3467894/… 了解有关此内容的一些见解
-
已找到解决方案!这个:
$(".sfmform").livequery(function() { $(this).ajaxForm({而不是这个:$('.sfmform').ajaxForm({解决了这个问题!谢谢@史蒂夫