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' };