Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 需要_once()或AJAX,导致php脚本运行两次_Javascript_Php_Jquery_Ajax_Session - Fatal编程技术网

Javascript 需要_once()或AJAX,导致php脚本运行两次

Javascript 需要_once()或AJAX,导致php脚本运行两次,javascript,php,jquery,ajax,session,Javascript,Php,Jquery,Ajax,Session,我正在制作一个逐步的表单,在您按照步骤操作时存储会话变量 在一个步骤中,我有一个文件上载,它预览图像并显示一个上载按钮,按下该按钮时调用一个php脚本,该脚本需要修改$\u会话变量,并回显上载文件的路径 当我在我的调试器中测试它而不使用require_once('config.php'),它的工作原理与我预期的完全一样,显示了图像及其文件名,但是,由于某种原因,当我在调试器中迭代配置文件时,它似乎运行了两次php脚本,它正确地更新了会话变量,但是文件名不再被回显,数据在到达前端之前就丢失了 我不

我正在制作一个逐步的表单,在您按照步骤操作时存储会话变量

在一个步骤中,我有一个文件上载,它预览图像并显示一个上载按钮,按下该按钮时调用一个php脚本,该脚本需要修改$\u会话变量,并回显上载文件的路径

当我在我的调试器中测试它而不使用
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
});
}