【问题标题】:Passing JSON object to PHP script将 JSON 对象传递给 PHP 脚本
【发布时间】:2016-08-03 04:05:07
【问题描述】:

我正在尝试传递一个类似于此的 JSON 对象:

 {"service": "AAS1", "sizeTypes":[{"id":"20HU", "value":"1.0"},{"id":"40FB","2.5"}]}

请注意:在 sizeTypes 中,数组中一共有大约 58 个项。

当用户单击提交按钮时,我需要能够将对象发送到 PHP 脚本以运行 UPDATE 查询。这是应该将 JSON 发送到 PHP 脚本的 javascript:

 $('#addNewSubmit').click(function()
 {
   var payload = {
     name: $('#addservice').val();
     sizeTypes: []
   };

   $('input.size_types[type=text]').each(function(){
     payload.sizeTypes.push({
       id: $(this).attr('id'),
       value: $(this).val()
      });
   });

   $.ajax({
     type: 'POST',
     url: 'api/editService.php',
     data: {service: payload},
     dataType: 'json',
     success: function(msh){
       console.log('success');
     },
     error: function(msg){
       console.log('fail');
     }
   });
 });

使用上面的点击函数,我试图将对象发送到下面的 php 脚本,它位于 api/editService.php 中:

 <?php
 if(isset($_POST['service']))
 {
   $json = json_decode($_POST['service'], true);

   echo $json["service"]["name"] . "<br />";

   foreach ($json["service"]["sizeTypes"] as $key => $value){
     echo $value["value"] . "<br />";
   }
 }
 else
 {
   echo "Nooooooob";
 }
 ?>

我还没有 UPDATE 查询,因为我什至不确定我是否正确传递了 JSON。在 javascript click 函数中,您会看到 SUCCESS 和 ERROR 函数。我所产生的只是 Chrome 控制台中的 ERROR 函数。

我不确定错误出在哪里,是 JavaScript 还是 PHP。

为什么我只能在AJAX帖子中产生错误函数?

编辑

我在 ajax 调用中去掉了 dataType,并将 JSON.stringify 添加到数据中:

 $.ajax({
   type: 'POST',
   url: 'api/editService.php',
   data: {servce: JSON.stringify(payload)},
   success: function(msg){
     console.log('success');
   },
   error: function(msg){
     console.log('fail'), msg);
   }
 });

在 PHP 脚本中,我尝试了这个:

 if(isset($_POST['service'))
 {
   $json = json_decode($_POST['service'], true);

   foreach ($json["service"]["sizeTypes"] as $key => $value){
     $insert = mysqli_query($dbc, "INSERT INTO table (COLUMN, COLUMN, COLUMN) VALUES (".$json["service"] . ", " . "$value["id"] . ", " . $value["value"]")");
   }
 }
 else
 {
   echo "noooooob";
 }

通过此更新,我可以触发成功消息,但仅此而已。我无法运行查询。

【问题讨论】:

  • 您可能想要登录 msg 而不是 'fail'
  • 即:console.log('fail:', msg);
  • 并且没有理由在你的PHP中使用json_decode()$_POST变量不会包含json。
  • 我发布了一个答案,错误可能是您正在回显 html 但 ajax 期待 json (dataType: 'json')
  • @HoodCoderMan 您收到错误可能是因为这条线。回声 $json["service"]["name"].您在给定的示例数组字符串中没有任何名称键。

标签: javascript php json ajax


【解决方案1】:

尝试改变

 error: function(msg){
   console.log('fail');
 }

 error: function(msg){
   console.log(msg);
 }

可能有一些 php 错误或语法问题,您应该可以在那里看到。

还可以尝试通过添加类似

的内容逐步调试您的 php 脚本

echo "still works";die;

在php脚本的开头并向下移动直到它会导致错误,然后你就会知道错误在哪里。

此外,如果您期待 JSON(并且您是 - dataType: 'json' in js ,请不要在您的 php 中回显任何 HTML。

【讨论】:

  • 我按照建议更改了错误函数,并收到以下控制台消息: Object {readyState: 4, responseText: "↵↵", status: 200, statusText: "OK"} 我也删除了PHP 脚本中的 HTML 标签
【解决方案2】:

没有看到错误,我怀疑错误是因为 ajax 期待 json (dataType: 'json',) 但您在 php 中回显 html

【讨论】:

    【解决方案3】:

    当您在service 键中发送一个对象时,您可能在$_POST['service'] 中有一个多维数组。

    如果你想发送一个字符串,你应该将对象转换为json:

    data: {service: JSON.stringify(payload)},
    

    现在您可以像在 php 中一样对其进行解码。

    另外请注意,如果将dataType 设置为json,则只能从 php 发回 json。除了有效的 json 之外的任何东西都会让你在 error 处理程序中结束。

    【讨论】:

    • 如果你将 jQuery 设置为 json,你不需要这样做。您可以传递 js 对象并在后端拥有 php 数组
    • ^取决于 jquery 版本我猜,不是吗?
    • @AdamPietrasiak 我很确定你会这样做,否则你最终会得到像$_POST['service']['sizeTypes'][..] 这样的值,当你在表单输入的name 属性中使用数组时,这也是完全有效和常见的.所以 OP 可能甚至不必解码当前值 :-)
    【解决方案4】:

    示例如何处理来自editService.phpJSON 响应。通常,editService.php 脚本将是 worker 并将处理您需要完成的任何事情。它会(通常)向success 方法发送一个简单的响应返回(考虑更新您的$.ajax 以使用最新的方法,例如$.done 等)。从那里您可以适当地处理响应。

    $.ajax({
        method: 'POST',
        url: '/api/editService.php',
        data: { service: payload },
        dataType: 'json'
    })
     .done(function(msh) {
        if (msh.success) {
            console.log('success');
        }
        else {
            console.log('failed');
        }
    })
     .fail(function(msg) {
        console.log('fail');
    });
    

    示例/editService.php 以及如何通过$.ajax 使用JSON

    <?php
    $response = [];
    if ( isset($_POST['service']) ) {
        // do your stuff; DO NOT output (echo) anything here, this is simply logic
        // ... do some more stuff
    
        // if everything has satisfied, send response back
        $response['success'] = true;
    
        // else, if this logic fails, send that response back
        $response['success'] = false;
    }
    else {
        // initial condition failed
        $response['success'] = false;
    }
    echo json_encode($response);
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2013-06-18
      • 2013-10-02
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      相关资源
      最近更新 更多