6

我使用 POST 通过 AJAX 将数据提交到 php 文件。只需提交字符串就可以正常工作,但现在我想用 JSON 提交我的 JS 对象并在 PHP 端对其进行解码。

在控制台中,我可以看到,我的数据已正确提交,但在 PHP 端 json_decode 返回 NULL。

我尝试了以下方法:

this.getAbsence = function()
{
    alert(JSON.stringify(this));
    jQuery.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "ajax/selectSingle.php?m=getAbsence",
        data: JSON.stringify(this),
        success : function(data){
            alert(data);
        }
    });
}

PHP:

echo $_POST['data'];
echo json_decode($_POST['data']);
echo var_dump(json_decode($_POST['data']));

和:

this.getAbsence = function()
{
    alert(JSON.stringify(this));
    jQuery.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "ajax/selectSingle.php?m=getAbsence",
        data: {'Absence' : JSON.stringify(this)},
        success : function(data){
            alert(data);
        }
    });
}

PHP:

echo $_POST['Absence'];
echo json_decode($_POST['Absence']);
echo var_dump(json_decode($_POST['Absence']));

警报只是为了检查一切是否正常...

是的,通常的字符串被正确回显:-)

4

5 回答 5

23

你在第一个代码中的代码出错的地方是你必须使用这个:

var_dump(json_decode(file_get_contents("php://input"))); //and not $_POST['data']

引用 PHP 手册

php://input 是一个只读流,允许您从请求正文中读取原始数据。

由于在您的情况下,您要在正文中提交 JSON,因此您必须从此流中读取它。通常的方法$_POST['field_name']不起作用,因为帖子正文不是 URLencoded 格式。

在第二部分中,您一定使用过这个:

contentType: "application/json; charset=utf-8",
url: "ajax/selectSingle.php?m=getAbsence",
data: JSON.stringify({'Absence' : JSON.stringify(this)}),

更新

当请求具有内容类型application/json时,PHP 不会解析请求并为您提供 JSON 对象$_POST,您必须自己从原始 HTTP 正文中解析它。使用 检索 JSON 字符串file_get_contents("php://input");

如果你必须使用$_POST它,你会做到:

data: {"data":JSON.stringify({'Absence' : JSON.stringify(this)})},

然后在 PHP 中执行:

$json = json_decode($_POST['data']);
于 2012-06-08T10:56:21.357 回答
0

单引号对 php 无效,json_encode对字段名称和值都使用双引号。

于 2012-06-08T10:58:02.407 回答
0

对我来说,看起来你应该重新格式化你的 AJAX 对象。url-property 应该只是目标 php-file 的 URL,任何需要发布的数据都应该是 data-property 中的查询字符串的形式。以下应该按您的预期工作:

this.getAbsence = function() {
  var strJSONData = JSON.stringify(this);
  alert(strJSONData);
  jQuery.ajax({
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    url: 'ajax/selectSingle.php',
    data: 'm=getAbsence&Absence=' + strJSONData,
    success: function(data) {
      alert(data);
    }
  });
}
于 2012-06-08T11:11:41.720 回答
0

试试这个

  var vThis = this;
  this.getAbsence = function()
  {
    alert(JSON.stringify(vThis));
    jQuery.ajax({
       type: "POST",
       contentType: "application/json; charset=utf-8",
       url: "ajax/selectSingle.php?m=getAbsence",
       data: JSON.stringify(vThis),
       success : function(data){
         alert(data);
       } 
     });
   }

编辑

我想我们也可以做到这一点!

  var vThis = this;
  this.getAbsence = function()
  {
    alert(JSON.stringify(vThis));
    jQuery.ajax({
       type: "POST",
       dataType: "json",
       url: "ajax/selectSingle.php?m=getAbsence",
       data: vThis,
       success : function(data){
         alert(data);
       } 
     });
   }

在 PHP 中

print_r($_POST);
于 2012-06-08T11:16:07.227 回答
0

在 PHP 方面试试这个:

$sectionValue = htmlspecialchars($_POST['sectionValue'], ENT_QUOTES);
$dataToWrite = json_decode(html_entity_decode($sectionValue, ENT_QUOTES, "utf-8" ), true);
于 2022-02-23T14:40:59.870 回答