Javascript 需要_once()或AJAX,导致php脚本运行两次
我正在制作一个逐步的表单,在您按照步骤操作时存储会话变量 在一个步骤中,我有一个文件上载,它预览图像并显示一个上载按钮,按下该按钮时调用一个php脚本,该脚本需要修改$\u会话变量,并回显上载文件的路径 当我在我的调试器中测试它而不使用Javascript 需要_once()或AJAX,导致php脚本运行两次,javascript,php,jquery,ajax,session,Javascript,Php,Jquery,Ajax,Session,我正在制作一个逐步的表单,在您按照步骤操作时存储会话变量 在一个步骤中,我有一个文件上载,它预览图像并显示一个上载按钮,按下该按钮时调用一个php脚本,该脚本需要修改$\u会话变量,并回显上载文件的路径 当我在我的调试器中测试它而不使用require_once('config.php'),它的工作原理与我预期的完全一样,显示了图像及其文件名,但是,由于某种原因,当我在调试器中迭代配置文件时,它似乎运行了两次php脚本,它正确地更新了会话变量,但是文件名不再被回显,数据在到达前端之前就丢失了 我不
require_once('config.php')
,它的工作原理与我预期的完全一样,显示了图像及其文件名,但是,由于某种原因,当我在调试器中迭代配置文件时,它似乎运行了两次php脚本,它正确地更新了会话变量,但是文件名不再被回显,数据在到达前端之前就丢失了
我不知道错误是在config.php
文件中,还是在AJAX调用中,或者是我遗漏的其他地方
标记('step4.php'):
'uploadfile.php':(我的调试器显示的那个会被执行两次…)
“config.php”:当包含它时,它会把东西搞砸
<?php
//require_once('config.php'); //THE PROBLEM?
if($_FILES) {
//Get the uploaded file information
$name_of_uploaded_file = $_FILES['file']['name'];
//Actually upload the file to the server!
$upload_folder = 'temp/'; //Make a file named temp
$path_of_uploaded_file = $upload_folder.$name_of_uploaded_file;
$tmp_path = $_FILES["file"]["tmp_name"];
if(is_uploaded_file($tmp_path)) {
copy($tmp_path,$path_of_uploaded_file);
$_SESSION['step4filepath'] = $path_of_uploaded_file;
echo $path_of_uploaded_file;
}
}
?>
完全迷失于此。可能是这样吗?为什么配置文件中有这一行
<?php
session_start();
//Initialize session data
if(empty($_SESSION)) {
if(!isset($_SESSION['step4filepath'])) {
$_SESSION['step4filepath'] = '';
}
}
//Update session data
if($_SERVER['REQUEST_METHOD'] === 'POST') {
if($_SESSION['currentPage'] == 4) {
//input for step 4, we just want filename if they submit the form
$_SESSION['step4filepath'] = $_POST['step4filepath'];
}
//Enable us to hit the back button!
header("Location: " . $_SERVER['REQUEST_URI']);
}
?>
看起来config.php将$\u SESSION['step4filepath']的值替换为$\u POST['step4filepath'],而不是将其保留为上传文件的$path\u 编辑 正如其他地方提到的,header()将导致重新加载。我的答案与此无关,因为在设置变量之前调用config.php。解决方案1 替换
header("Location: " . $_SERVER['REQUEST_URI']);
到
解决方案2:请参见下面的示例代码
$(document).off('click').on('click', '#uploadbutton', function(e) {
似乎有用!我将其设置为这样,这样您就可以在浏览器中使用“后退”按钮,而不必偶尔出现“确认表单重新提交”消息。当用户当前在第4页时,我不允许它。(你回答得太快了,我得等一会儿才能把你记为是谁回答的。)谢谢!不要像这样重新添加功能。。。使用history.back(),如果您想使用PHP,请尝试在代码中添加更多的条件。如果按钮点击值为该值,则仅返回等。您建议什么条件?正在发布的是非敏感信息。我不确定您打算如何启用/使用它作为后台功能。1.请在背面使用此按钮/取消按钮。。。2.您还可以使用window.history.back()
header("Location: " . $_SERVER['REQUEST_URI']);
$(document).on('click', '#uploadbutton', function(e) {
$(document).off('click').on('click', '#uploadbutton', function(e) {
$(document).on("click", "#someID", function(e) {
$(this).attr("disabled","disabled");
// Disabling the input stops the event from firing multiple times.
var targetObj = $(this);
// targetObj can be used within the $.POST function, not $(this)
var myVariable = "Hello world";
$.post("/DoSomethingAJAXY.php", { variable1: myVariable },
function(data, status){
if (status == "success") {
// Do something
}
$(targetObj).removeAttr("disabled");
// Re-enable the event input trigger
});
}