使用 jquery ajax 将 javascript 数组变量发送到 php 脚本(获取字符串作为输出而不是数组)

Posted

技术标签:

【中文标题】使用 jquery ajax 将 javascript 数组变量发送到 php 脚本(获取字符串作为输出而不是数组)【英文标题】:send javascript array variable to php script using jquery ajax (getting string as output instead of array) 【发布时间】:2020-06-01 02:52:12 【问题描述】:

我正在尝试使用 Ajax 将 javascript 数组发送到 php 脚本,但是当我尝试 var_dump $_POST['file_paths'] 获取字符串而不是数组作为输出时,我希望以数组格式输出不是字符串格式。是不是因为我在 contentType: falseprocessData: false 等代码中使用了 Ajax 设置。

如果有人能指出我正确的方向,我尝试 JSON 解码和编码仍然得到字符串作为输出。(需要以数组格式而不是字符串输出)

html 标记:(文件夹上传)

<form id='submit' action='' method="post">
            <div id="upload">
                <div class="fileContainer">

                    <input id="myfiles" type="file" name="myfiles[]" multiple="multiple" webkitdirectory multiple directory />
                </div>
            </div>
            <input id="directory_name" type="text" name="directory_name" placeholder="Directory Name" >
</form>

这是一个简单的js来获取所有表单数据,比如父目录名,文件数据和文件路径使用

webkitRelativePath

在获取发送两个数组的所有数据后,第一个是文件数组,第二个是文件路径数组到 php 脚本,当我 console.log 文件路径数组获取数组时。

JS 脚本:

            $(document).ready(function() 
                $('#myfiles').on("change", function() 

                    var myfiles = document.getElementById("myfiles");
                    var file_paths = [];
                    var files = myfiles.files;
                    var new_directory_name =$('#directory_name').val();
                    var data = new FormData();
                    data.append('new_directory_name',new_directory_name);
                    data.append('action', 'upload_folder_to_server');
                    data.append('data_room_id', 55);
                    data.append('username', 'saurabh');
                    for (i = 0; i < files.length; i++) 
                        data.append('file' + i, files[i]);
                        file_paths.push(files[i].webkitRelativePath);
                        console.log(files[i].webkitRelativePath);
                    
                    //file_paths = JSON.stringify(file_paths);
                    console.log(file_paths);
                    data.append('file_paths', file_paths);
                    $.ajax(
                        method: "POST",
                        url: ajaxurl,
                        contentType: false,
                        data: data,
                        processData: false,
                        //cache: false
                    ).done(function(msg) 
                        $("#loadedfiles").append(msg);
                    );
                );
            );

javascript 输出:

Array(3) [ "first folder/second folder/third folder/upload_groupmembers_additonal_login_sample(7).xlsx", "first folder/second folder/upload_groupmembers_additonal_login_sample(7).xlsx", "first folder/upload_groupmembers_additonal_login_sample(7).xlsx" ]

当 var_dump file_paths 以字符串格式获取输出时,在 PHP 脚本中。 PHP 脚本:

function upload_folder_to_server()

    var_dump($_POST['file_paths']);

add_action('wp_ajax_upload_folder_to_server', 'upload_folder_to_server');
add_action('wp_ajax_nopriv_upload_folder_to_server', 'upload_folder_to_server');

输出:

string(232) "first folder/second folder/third folder/upload_groupmembers_additonal_login_sample(7).xlsx,first folder/second folder/upload_groupmembers_additonal_login_sample(7).xlsx,first folder/upload_groupmembers_additonal_login_sample(7).xlsx" 

有人能解释一下为什么我在 PHP 中得到字符串,在 JavaScript 中得到数组

【问题讨论】:

这能回答你的问题吗? How to pass a Javascript Array via JQuery Post so that all its contents are accessible via the PHP $_POST array? 感谢您的评论,但我担心的不是在 PHP 中获取 JavaScript 数组,而是以类似格式获取输出,例如如果我通过 JavaScript 发送数组但在 PHP 脚本中获取字符串,如果我在 JavaScript 中发送数组,我希望数组作为输出,并且很少解释为什么我得到字符串而不是数组 【参考方案1】:
  var myfiles = document.getElementById("myfiles");
                    var file_paths = [];
                    var files = myfiles.files;
                    var new_directory_name =$('#directory_name').val();
                    var data = new FormData();
                    data.append('new_directory_name',new_directory_name);
                    data.append('action', 'upload_folder_to_server');
                    data.append('data_room_id', 55);
                    data.append('username', 'saurabh');
                    for (i = 0; i < files.length; i++) 
                        data.append('file' + i, files[i]);
                        file_paths.push(files[i].webkitRelativePath);
                        console.log(files[i].webkitRelativePath);
                    
                    //file_paths = JSON.stringify(file_paths);
                    console.log(file_paths);
                    data.append('file_paths', file_paths);

用这个替换并尝试

var myfiles = document.getElementById("myfiles");
var file_paths = [];
var files = myfiles.files;
var new_directory_name =$('#directory_name').val();
var data = new FormData();
data.set('new_directory_name',new_directory_name);
data.set('action', 'upload_folder_to_server');
data.set('data_room_id', 55);
data.set('username', 'saurabh');
for (i = 0; i < files.length; i++) 
data.set('file' + i, files[i]);
file_paths.push(files[i].webkitRelativePath);
console.log(files[i].webkitRelativePath);

data.set('file_paths', file_paths);

【讨论】:

WEX 我试过你上面的代码,但它没有解决我的问题,得到空白数组作为输出输出:数组() 我看到你的字符串你可以explode (string,',') 获取数组 请检查我的问题我已经发布了有问题的输出 第一个输出在 JavaScript 中,我得到数组格式,第二个输出在 PHP 脚本中,我得到字符串格式 嗨,我更新了我的答案检查,你可以像我发布的那样做。 嗨 WEX 我知道我可以通过简单的 php 爆炸来实现这一点,但为什么数据在 php 中从数组转换为字符串。它只是解决我的问题吗?如果是,请解释原因【参考方案2】:

您应该可以使用 JSON.stringify()json_decode() 来做到这一点。

在使用 JS 发送之前对其进行字符串化:

const jsonArr = JSON.stringify(data);

PHP 端收到它时解析它:

$parsedArr = json_decode($_POST['file_paths']);

你可以做的是,当你在 PHP 端收到字符串时,将它转换为数组。 您只需添加以下内容:

$str = isset($_POST['file_paths']) ? $_POST['file_paths'] : ''; // Use condition to check if there is a post request with that name coming in
$arr = explode(",", $str);

explode() 函数的第一个参数中,您可以指定要拆分字符串的位置。阅读更多here。

【讨论】:

以上是关于使用 jquery ajax 将 javascript 数组变量发送到 php 脚本(获取字符串作为输出而不是数组)的主要内容,如果未能解决你的问题,请参考以下文章

jQuery实例分析解析

使用 Ajax 实时更改数据库

jQuery $.get(url,data,callback,type) 返回值给全局变量赋值的问题

如何使用 jQuery $.ajax 将请求参数数组发送到 servlet?

JQuery事件与应用

jQuery - 将验证插件与 AJAX 表单插件一起使用