js通过ajax和thinkPHP交换数据

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

php.net上的文档,$json是个json格式的字符串,通过json_decode()得到的是php变量/对象

 

$data= json_decode(urldecode(I('data')),TRUE);
$data_arr=object_array($data);    //object_array()是function
echo $data_arr['title_header'];

public function object_array($array){
if(is_object($array))
{
$array = (array)$array;
}
if(is_array($array))
{
foreach($array as $key=>$value)
{
$array[$key] = $this->object_array($value);
}
}
return $array;
}//转换成数组

//thinkphp 里的代码

urldecode()得到的是json格式字符串,json_decode()得到的是json数组或者对象,第二个参数true代表转换成数组,把它强制生成PHP关联数组.,false代表转换成对象

 

jquery:

简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax

jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求

 

<?php
     $arr['title']       = $User->where($data)->getField('title');//,from,content1,category,is_top,create_at
        $arr['from']        = "xxxx";
        $arr['content']     = "xxxx";
        $arr['category']    = "xxxx";
        $arr['is_top']      ="xxxx";
        $arr['create_at']   ="xxxx";
        echo json_encode($arr);
?>

//php

<script>

$.post(
"{:U('modify')}?id="+id,
function(data){
  data = eval("(" + data + ")");//eval():字符串->对象

  console.log(data);  // output:  Object {title: "GGGGG", from: "GGG"}

  //title,from是对象的属性                                

  var title = data.title;  //string

  var from  = data.from;  //string

});

  /*

 var show_to_modify = JSON.stringify(data);//jsonObj->json字符串
  
console.log(show_to_modify);  // output:{"title":"GGGGG","from":"GGG"}
show_tom_modify.title=>undefined

  var jsonStr1 = show_to_modify.split("{")[1];
  var jsonStr2 = jsonStr1.split("}")[0];
  console.log(jsonStr2.split(",").length);  //2
  var str = jsonStr2.split(",");
  var jsonStr3 = str[0];
  var show_header = jsonStr3.split(":")[1];  //undefined
  var jsonStr4 = str[1];
  var show_from = jsonStr4.split(":")[1];    //undefined

*/
</script>

 

php里接收js $.ajax()的json数据的时候,函数里用的是header("Content-Type:application/json;charset=utf-8");

而不能用header("Content-Type:text/html;charset=utf-8");

因为你要告诉客户端,该以什么方式来接受/解析数据,你是打出json的,就应该跟客户端说,这不是text/html, 而不是 application/json.

也就是说php回传json的时候,特别是有中文时要加header("Content-Type:application/json;charset=utf-8");这句。

 

 

关于json的:

 

 $a = array( 'Jack' , 'Sam' , 'Tom' );
    echo json_encode( $a );

 

当 JavaScript 请求到上面的代码,PHP 将解析数组 $a 为 json 字符串并返回到前端,但事实上在前端拿到的返回结果却是一个数组。

 

     [ "Jack" ,  "Sam" ,  "Tom" ]

 

这个结果对于前端来说也许并不是所期望的,对于 JavaScript 来说,数组和 json 的关系非常密切,甚至可以简单地把 json 理解为关联数组,但这并不意味着二者可以划等号,比如 json 没有 length 属性,也不能进行数字索引,json 是键值对,而 JavaScript 的数组严格说来是没有"键"的,这和 PHP 的差异比较大。那么为什么 json_encode 的返回结果是数组呢?

 

本文开头的 PHP 代码中的数组是严格意义上的数字索引数组,json_encode 方法在处理这样的数组的时候会返回数组字符串,它需要同时满足两个条件:1. 数字索引数组,2. 索引值从 0 开始。这意味着下面的代码也会返回同样的结果:

 

    $b = array(
        '0' => 'Jack',
        '1' => 'Sam',
        '2' => 'Tom'
    );
    echo json_encode( $b );

 

这两个条件的任意一个没有获得满足,那么 json_encode 方法才真正的返回 json 字符串:

 

    $c = array(
        'person-1' => 'Jack',
        'person-2' => 'Sam',
        'person-3' => 'Tom'
    );
    echo json_encode( $c );

 

这时前端得到的结果如下:

 

    {
        'person-1' : 'Jack',
        'person-2' : 'Sam',
        'person-3' : 'Tom'
    };

 

posted @ 2015-04-17 16:21  tangwaikei  阅读(1037)  评论(0编辑  收藏  举报