我正在尝试将JSON数组中的FormData传递给AJAX脚本:
$('#form').submit(function(e)
{
e.preventDefault();
let formData = new FormData(this),
data = {'action': 'insert', 'data': formData};
$.ajax({
data: data,
url: '/wp-content/plugins/eng-dealer-map/bin/Admin.php',
type: 'post',
cache: false,
contentType: false,
processData: false,
success: function(res) {console.log(res)},
error: function(res) {console.log(res)}
})
});
然后/bin/Admin.php
<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
$ds = DIRECTORY_SEPARATOR;
require_once $_SERVER['DOCUMENT_ROOT']. $ds. 'wp-content'. $ds. 'plugins'. $ds. 'eng-dealer-map'. $ds. 'vendor'. $ds. 'autoload.php';
var_dump($_POST);
$admin = new \App\Endpoint\Admin(['action' => $_POST['action'], 'data' => $_POST['data']]);
echo $admin->execute();
反过来,最终进入这个(最小化的)类:
<?php
namespace App\Endpoint;
class Admin
{
protected $db;
protected $table;
protected $sql;
protected $data;
public function __construct($foo)
{
require_once $_SERVER['DOCUMENT_ROOT']. DIRECTORY_SEPARATOR. 'wp-config.php';
global $wpdb;
$this->db = $wpdb;
$this->table = '`'. $this->db->prefix .'trey_is_the_best`';
$this->sql = $this->build($foo['action']);
$this->data = $foo['data'];
}
public function build(string $action)
{
switch($action)
{
case 'insert': return $this->insertSql(); break;
case 'update': return $this->updateSql(); break;
case 'remove': return $this->removeSql(); break;
default: throw new \Exception('trey'); break;
}
}
public function execute()
{
if (!empty($this->sql)) {
try {
if ($this->db->query($this->db->prepare($this->sql, $this->data))) {
return true;
} else {
throw new \Exception($this->db->last_error);
}
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}
} else {
return 'SQL empty!';
}
}
}
不幸的是,似乎$_POST
迷路了。将此添加到我的JS中:
for (let pair of formData.entries())
{
console.log(pair[0]+ ', ' + pair[1]);
}
可以正确显示我的数据。然后,我在var_dump($_POST)
中的bin/Admin.php
中显示了一个空数组。
我将'data': formData
更改为'data': 'hello, world'
,所以我感觉FormData不喜欢与其他元素一起放入JSON数组中?
那么如何将FormData和其他元素发送到我的AJAX脚本中?我知道我可以使用:
formData.append('action', 'action-value')
但是当它可以作为一个对象发送到我的脚本时,这感觉像是一个额外的步骤。
我也尝试在JSON.stringify
上使用formData
,但同样,什么也没有。有没有一种方法可以在不使用.append()
的情况下将formData和其他数据一起作为表单对象发送?还是我唯一的选择?
答案 0 :(得分:1)
我感觉FormData不喜欢与其他元素一起放入JSON数组中?
正确。您不能将FormData转换为JSON。
那我该如何将FormData和其他元素发送到我的AJAX脚本中?
将多余的数据添加到FormData。
我知道我可以使用:
formData.append('action', 'action-value')
是的,这样做。
但是当它可以作为一个对象发送到我的脚本时,这感觉像是一个额外的步骤。
FormData
对象是一个对象。您只需要向其中添加数据,而不是将数据添加到其他对象,然后尝试将FormData
中的数据添加到其中。