PHP 5.2版本之后,默认增加了一组针对数据进行JSON互转的函数:
json_decode() :JSON到PHP变量的转换
本文用一个实例讨论一下PHP 的JSON数据函数在jquery中的应用。
jquery中有一个方法:$.getJSON,这个用来从服务器脚本页面取得JSON格式的数据的。
首先,建立一个名为json.php的PHP脚本:
<?php
//创建一个联合数组,这里我们尽量真实的模拟了一个从数据库中读取的记录
$a=array('name'=>'dog','sex'=>'f','par'=>array('li','wang','lian'));
$b=array('name'=>'pig','sex'=>'m','par'=>array('liv','wange','liang'));
$array = array(0=>$a,1=>$b);
//将数组转化为一个json数据串
echo json_encode($array); //by www.
?>
前台页面jquery代码:
<script>
$(document).ready(function(){
$.getJSON(
'json.php',
function(data){
var content="";
for(var i=0;i<data.length;i++){//循环读取后台的取得的JSON数据
content+=data[i].name;
var par="排挡:";
for(var j=0;j<data[i].par.length;j++){//循环读取数据中的par集合
par+=data[i].par[j]+"、";
}
content+=par+"<br/>";
}
alert(content);
}
);
});
</script>
本例在循环读取数据的时候应用了js的基本流程控制for循环方法,在jquery中也提供了一个遍历方法each,底层实现也是基于for循环的。
但按由于json_encode json_decode两个函数是在PHP5.2之后才有的,早于此前的版本使用将会报一个找不到json_encode函数的错误!
优化后的代码:
<?php
/*
* 自定义my_json_encode函数
* @params array $arr 欲转json的数组
*/
function my_json_encode($arr){
if (!function_exists('json_encode')){
return json_encode($arr);
}else{
require_once 'lib/json.class.php';
$json = new Services_JSON();
return $json->encode($arr);
}
}
?>
自定义一个my_json_encode函数,当php版本为5.2之前,找不到son_encode函数时,载入json.class.php类文件。
使用my_json_encode等价于json_encode。
附:json.class.php下载地址
使用.htaccess更改PHP的错误显示的设置,相当于更改PHP.ini的参数,相当方便。
将以下代码放到对应目录中的.htaccess文件。
1,关闭错误显示 :
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
2,只显示PHP错误 :
php_flag display_startup_errors on
php_value error_reporting 2047
其中,“2047”为要显示的错误的级别。
错误代码与错误类型的对应关系,如下:
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
3,把错误保存到日志文件中,可以这样设置:
php_flag log_errors on
php_value error_log /home/path/public_html/domain/PHP_errors.log
然后,可以设置不允许访问.log文件 :
<Files PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>
设置错误日志的最大体积,以bytes为单位:
setting max error size
log_errors_max_len integer
4,.htaccess的PHP错误显示设置汇总 :
# PHP error handling for production servers
# disable display of startup errors
php_flag display_startup_errors off
# disable display of all other errors
php_flag display_errors off
# disable html markup of errors
php_flag html_errors off
# enable logging of errors
php_flag log_errors on
# disable ignoring of repeat errors
php_flag ignore_repeated_errors off
# disable ignoring of unique source errors
php_flag ignore_repeated_source off
# enable logging of php memory leaks
php_flag report_memleaks on
# preserve most recent error via php_errormsg
php_flag track_errors on
# disable formatting of error reference links
php_value docref_root 0
# disable formatting of error reference links
php_value docref_ext 0
# specify path to php error log
php_value error_log /home/path/public_html/domain/PHP_errors.log
# specify recording of all php errors
php_value error_reporting 999999999
# disable max error string length
php_value log_errors_max_len 0
# protect error log by preventing public access
<Files /home/path/public_html/domain/PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>
5,附适合开发者应用的设置:
# PHP error handling for
development servers
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/path/public_html/domain/PHP_errors.log
php_value error_reporting 999999999
php_value log_errors_max_len 0
<Files /home/path/public_html/domain/PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>
以上介绍了几种不同情况下,通过.htaccess设置显示PHP错误来控制PHP错误是否显示的方法,简便好用,建议朋友们试试。
用静态函数实现获取一年内的星期列表及每周起始时间,如下:
<?php
/**
* func: getWeeks
* 功能:获取一年内星期列表、每周起始时间
* 编辑:www.
*/
public static function getWeeks($format="second",$year=null){
if($year == null){
$year=date('Y');
}
$second_of_day = 24*3600;
$year_start = $year . "-01-01 00:00:00";
$year_end = $year . "-12-31 23:59:59";
$startday = strtotime($year_start);
$day_of_week = date('N', $startday);
$first_week_start=$startday;
$first_week_end = $startday+(7-$day_of_week)*$second_of_day+$second_of_day-1;
$week_array[0]=array($first_week_start,$first_week_end);
$endday = strtotime($year_end);
$day_of_week = date('N', $endday);
$last_week_start=$endday-$day_of_week*$second_of_day+1;
$last_week_end = $endday;
$last_week=array($last_week_start,$last_week_end);
$during = $last_week_start - $first_week_end;
$during_total_week = intval($during/(7*$second_of_day));
for($i=0;$i<$during_total_week;$i++){
$week_array[$i+1]=array($first_week_end+(7*$i*$second_of_day)+1,$first_week_end+(($i+1)*$second_of_day*7));
}
$week_array[$during_total_week+1]=$last_week;
if($format !="second"){
foreach($week_array as $i => $week){
$week_array_of_date_format[$i]=array(date($format,$week[0]),date($format,$week[1]));
}
return $week_array_of_date_format;
}
return $week_array;
}
?>