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