使用 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: false 和 processData: 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 $.get(url,data,callback,type) 返回值给全局变量赋值的问题