0

使用 ajax 调用我将 json 数据包发送到 php 后端,但是由于json_decode不明原因而失败。有问题的php代码在这里:

$request = file_get_contents('php://input');
Logger::getInstance()->debug("Request: ".$request);
// The logger shows the following line after a sample submission: 
// Request: prospectname=OMEGAK&teaserimg=kb.png&submit=Submit
$data = json_decode($request, true);
Logger::getInstance()->debug("Data: ".var_export($data,true));
// The logger shows the following line after a sample submission:
// Data: NULL

json 的打包来自各种类似的帖子,但我使用的是以下脚本(它只是试图发送表单提交的 json 编码的键值映射):

(function (){
  $.fn.serializeObject = function()
  {
      var o = {};
      var a = this.serializeArray();
      $.each(a, function() {
          if (o[this.name] !== undefined) {
              if (!o[this.name].push) {
                  o[this.name] = [o[this.name]];
              }
              o[this.name].push(this.value || '');
          } else {
              o[this.name] = this.value || '';
          }
      });
      return o;
  };

  $(function() {
      $('form').submit(function() {
          var $blah = $('form').serializeObject();
          // The $blah object reads like so at this point:
          // {"prospectname":"OMEGAKB","teaserimg":"kb.png"}
          var promise = $.ajax({ 
            url: 'myform/save',
            dataType: 'json',
            data: $blah,
            type: 'POST'
          });

          promise.done(function (result) {
            alert("Success: "+result);
          });

          promise.fail(function (result) {
            alert("Failure: "+result);
          });

          return;
      });
  });

})();

谁能解释我哪里出错了,为什么 php 似乎转换或收到错误的传入数据?

4

4 回答 4

1

是prospectname=OMEGAK&teaserimg=kb.png&submit=提交你指的json吗?如果是这样,那不是json。那是一个url字符串。http://php.net/manual/en/function.urldecode.php

dataType: 'json'不会将您的数据转换为 json。它告诉服务器您尝试发送 json。

JSON代表*javascript* object notation。所以当你使用 jquery.serializeObject() 时,你实际上得到了一个对象作为回报。

直接来自 php.net:

<?php
$query = "my=apples&are=green+and+red";

foreach (explode('&', $query) as $chunk) {
    $param = explode("=", $chunk);

    if ($param) {
        printf("Value for parameter \"%s\" is \"%s\"<br/>\n", urldecode($param[0]), urldecode($param[1]));
    }
}
?>
于 2013-08-20T23:14:23.300 回答
1

您实际上并没有发送 JSON。您正在创建一个 JavaScript 对象并将其传递给 $.ajax,后者将其转换为查询字符串并发布(它不会将其转换为 JSON)。您可以使用JSON.stringify将对象转换为 JSON。

data: JSON.stringify($blah),
于 2013-08-20T23:16:16.280 回答
1

在没有看到你的整个代码的情况下不能 100% 确定,但我相信,因为你最后做的是“return”而不是“return false”或“e.preventDefault()”,标准的提交按钮行为被触发,并且表单实际上是在没有ajax的情况下发布的。

于 2013-08-20T23:23:14.577 回答
1

My guess is that url in your ajax method is not a php page. Change it to the path.php to test this theory. Handle the $data on your PHP page as you would with an Associative Array, then echo or print the results within json_encode() that you want to go back to handle with jQuery, like:

echo json_encode($results);
于 2013-08-20T23:28:42.470 回答