PHP JSON数据的创建和解析程序代码
具体操作
JSON是什么?
JSON一种用于在互联网络中传输超量数据的数据交换格式。虽然在Internet中交换数据XML占主要地位,然而JSON却更加的简单并且适用于轻型的数据。
尽管JSON当初是被JavaScript发明并且用于访问远程数据的,它现在却被广泛适用于各种语言,因为JSON是一种于平台无关的数据格式。
JSON数据的数据类型和实例
JSON支持各种各样的数据类型,包括数字、字符串、布尔值、数组数据甚至对象数据(是一个集合,每个元素都是键:值对形式,使用逗号分隔,并且使用大括号包裹)。
让我们看一个JSON数据的简单例子,该例子表示一个雇员的详细信息:
代码如下 | 复制代码 |
{“id”:”1″,”name”:”mike”,”country”:”usa”,”office”:["microsoft","oracle"]} |
使用PHP创建和解析JSON数据的方法
PHP从5.2.0版本以后提供了JSON扩展来处理JSON数据,通过PHP有两个函数json_encode()和json_decode非常方便的对JSON数据进行转换和解析。
首先,让我们看一段PHP用数组创建如上各式的JSON的代码:
代码如下 | 复制代码 |
$json_data = array ('id'=>1,'name'=>"mike",'country'=>'usa',"office"=>array("microsoft","oracle")); echo json_encode($json_data); |
该代码直接产生了JSON数据。现在让我们用PHP将上面的JSON解码:
代码如下 | 复制代码 |
$json_string='{"id":1,"name":"mike","country":"usa","office":["microsoft","oracle"]} '; $obj=json_decode($json_string); |
现在变量$obj包含了使用PHP解析后的JSON数据,你可以使用以下的方法来输出和访问:
代码如下 | 复制代码 |
echo $obj->name; //displays mike echo $obj->office[0]; //displays microsoft |
你猜的没错$obj->office是一个数组,你能够使用PHP的foreach方法遍历它:
代码如下 | 复制代码 |
foreach($obj->office as $val) echo $val; |
ajax时返回JSON格式的数据
原来的数据就是JSON格式
下例来自《锋利的jQuery
代码如下 | 复制代码 |
你需要做的就是将数据存储为格式正确的 .json或者.js 文件。以下为示例所传送的json格式的数据
|
php输出JSON格式
那么php如何输出json格式?php 使用json_encode函数,然后jQuery使用datatype:json 就可以了嘛? 它的输出如下:
显然并非所愿。还是字符串,到底怎么实现?其实很简单,只要在php文件头部加入以下代码:
代码如下 | 复制代码 |
|
这个头就是告知此文件输出类型为 json,这种形式我们见的最多的是验证码——php输出验证图片,有时php可以输出css文件,js文件等做一些有趣的事情。好的,我们测试一下吧
代码如下 | 复制代码 |
<?php $fruits = array ( |
在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法:
1.使用Flash, Java, ActiveX
2.使用PHP的APC扩展
3.使用HTML5的File API
第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患。不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案。
第二种方法的不足在于,它需要安装PHP的APC扩展库,要求用户能够控制服务器端的配置。另外,如果安装APC仅仅是为了实现一个上传进度条,那么显然有点杀鸡用牛刀的意思。
第三种方法应该是最为理想的方法,不需要服务器端的支持,仅在浏览器端使用Javascript即可。但是由于HTML5标准尚未确立,各浏览器厂商的支持也不相同,所以暂时这种方法还难以普及。
PHP 5.4中引入的基于session的上传进度监视功能(session.upload_progress),它提供了一个服务器端的上传进度监视解决方案。升级到PHP 5.4之后,可以不必安装APC扩展,仅使用原生PHP和前端的Javascript即可实现上传进度条。
下面我们就详细介绍一下 PHP 5.4 的这个 session.upload_progress 新特性。
原理介绍
当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中。然后,随着上传的进行,周期性的更新session中的信息。这样,浏览器端就可以使用Ajax周期性的请求一个服务器端脚本,由该脚本返回session中的进度信息;浏览器端的Javascript即可根据这些信息显示/更新进度条了。
那么,文件上传信息具体是如何存储的?我们要如何访问它呢?下面我们来详细说明。
PHP 5.4 中引入了一些配置项(在php.ini中进行设置)
代码如下 | 复制代码 |
session.upload_progress.enabled = "1" |
其中enabled控制upload_progress功能的开启与否,默认开启;cleanup 则设置当文件上传的请求提交完成后,是否清除session的相关信息,默认开启。
prefix 和 name 两项用来设置进度信息在session中存储的变量名/键名。关于这两项的详细使用见下文。
freq 和 min_freq 两项用来设置服务器端对进度信息的更新频率。合理的设置这两项可以减轻服务器的负担。
在上传文件的表单中,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。具体的,在上传表单中需要有一个隐藏的input,它的name属性为php.ini中 session.upload_progress.name 的值;它的值为一个由你自己定义的标识符。如下:
代码如下 | 复制代码 |
<input type="hidden" name="<?php echo ini_get('session.upload_progress.name'); ?>" value="test" /> |
接到文件上传的表单后,PHP会在$_SESSION变量中新建键,键名是一个将session.upload_progress.prefix的值与上面你自定义的标识符连接后得到的字符串,可以这样得到:
代码如下 | 复制代码 |
$name = ini_get('session.upload_progress.name'); |
$_SESSION[$key]; // 这里就是此次文件上传的进度信息了
$_SESSION[$key]这个变量的结构是这样的:
代码如下 | 复制代码 |
<?php |
这样,我们就可以使用其中的 content_length 和 bytes_processed 两项来得到进度百分比。
原理介绍完了,下面我们来完整的实现一个基于PHP和Javascript的文件上传进度条。
上传表单
首先,来编写我们的上传表单页面 index.php,代码如下:
代码如下 | 复制代码 |
<form id="upload-form" |
注意表单中的session.upload_progress.name隐藏项,值设置为了test。表单中仅有一个文件上传input,如果需要,你可以添加多个。
这里需要特别注意一下表单的target属性,这里设置指向了一个当前页面中的iframe。这一点很关键,通过设置target属性,让表单提交后的页面显示在iframe中,从而避免当前的页面跳转。因为我们还得在当前页面显示进度条呢。
#progress 这个div是用来显示进度条的。
注意 别忘了在index.php的最开始加上session_start()。
处理上传的文件
表单的action指向upload.php,我们在upload.php中处理上传的文件,将它转存到当前目录。这里与通常情况下的上传处理没有区别。
代码如下 | 复制代码 |
<?php |
Ajax获取进度信息
这一步是关键,我们需要建立一个 progress.php 文件,用来读取session中的进度信息; 然后我们在 index.php 中增加Javascript代码,向 progress.php 发起Ajax请求,然后根据获得的进度信息更新进度条。
progress.php 的代码如下:
代码如下 | 复制代码 |
<?php |
在这里我们获得$_SESSION变量中的进度信息,然后输出一个进度百分比。
在 index.php 中,我们将如下代码添加到页面底部 (为简便,这里使用jQuery):
代码如下 | 复制代码 |
function fetch_progress(){ $.get('progress.php',{ '<?php echo ini_get("session.upload_progress.name"); ?>' : 'test'}, function(data){ var progress = parseInt(data); $('#progress .label').html(progress + '%'); $('#progress .bar').css('width', progress + '%'); if(progress < 100){ setTimeout('fetch_progress()', 100); }else{ $('#progress .label').html('完成!'); } }, 'html'); } $('#upload-form').submit(function(){ $('#progress').show(); setTimeout('fetch_progress()', 100); }); |
当#upload-form被提交时,我们把进度条显示出来,然后反复调用 fetch_progress() 获得进度信息,并更新进度条,直到文件上传完毕,显示'完成!'
注意事项
input标签的位置
name为session.upload_progress.name的input标签一定要放在文件input <input type="file" /> 的前面。
取消上传
通过设置 $_SESSION[$key]['cancel_upload'] = true 可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除。
setTimeout vs. setInterval
应该通过 setTimeout() 来调用 fetch_progress(),这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval() 则不能保证这一点,有可能导致进度条出现’不进反退’。
1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
例如: /abc/de/fg.php?id=1 需要取出 php 或 .php
答:我是直接用PHP内置函数搞定的,不重复造轮子,估计出题者也是想考察基础知识,主要是解析url和一个返回文件信息的函数(扩展:取得文件后缀名的多种方法):
代码如下 | 复制代码 |
<?php |
2. 在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句
<META http-equiv='Content-Type' content='text/html; charset=gbk'>
请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5
请注意:
(1) 需要处理完整的 html 页面,即不光此 meta 语句
(2) 忽略大小写
(3) ' 和 " 在此处是可以互换的
(4) 'Content-Type' 两侧的引号是可以忽略的,但 'text/html; charset=gbk' 两侧的不行
(5) 注意处理多余空格
答:表示我正则表达式(PHP正则详解)忘记差不多了,弄了半天。
代码如下 | 复制代码 |
<?php |
3. 写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上
答案:
代码如下 | 复制代码 |
<?php |
4.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
答:这个我之前就在博客中写过(PHP文件遍历及文件拷贝),只是实现的方法很多,效率不一定最高
代码如下 | 复制代码 |
|
5.简述论坛中无限分类的实现原理。
答:无限极分类,那么应该是考察递归函数吧!
第一步:建立测试数据库:
代码如下 | 复制代码 |
CREATE TABLE `category` ( |
第二步:插入测试数据:
代码如下 | 复制代码 |
INSERT INTO `category` ( `fid`, `value`) VALUES |
第三步:递归输出分类:
代码如下 | 复制代码 |
|
6.设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示!
答案:尼玛。都没明白出这题目是干嘛的,新浪工程师脑子进水了吗?考察js的window对象?亲们告诉我?
index.html
代码如下 | 复制代码 |
<html> |
fullwin.html
代码如下 | 复制代码 |
|
unset引用
代码如下 | 复制代码 |
<?php |
这个我很清楚,unset($b),只是断开了变量名和值得绑定,但是神奇的是:
代码如下 | 复制代码 |
<?php $a = "test"; $b = & $a; unset($a); echo $b;//test ?> |
但是我销毁$a了,为嘛$b的值还在呢?晕了,求解!
感谢下面网友回复,让我明白了:
关于unset()函数使用注意:只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放,如下:
代码如下 | 复制代码 |
<?php /** by www.111cn.net */ $a = "test"; $b = & $a; unset($a); unset($b); echo $b;//输出空 ?> |
先看一个实例
代码如下 | 复制代码 |
|
php部分:
代码如下 | 复制代码 |
$jsonp_callback=$_GET['jsonp_callback']; //... //如果正确 echo $jsonp_callback,'({"msg":"ok"})'; 5.//如果错误 echo $jsonp_callback,'({"msg":"err","info":"因人品问题,发送失败"})'; |
//...值得注意的是采用jsonp 方式,beforeSend / error 都不能用了,所以beforeSend里面用js实现的验证只能用ajax在服务器端test.php上面验证了。
域名下面有这么个html文件testjsonp.html:
代码如下:
代码如下 | 复制代码 |
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN“ “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“> |
注意,要真正运行上面的代码可能需要jquery的文件,你可以将
代码如下 | 复制代码 |
<script type=“text/javascript“ src=“jquery-1.7.2.min.js“></script> |
改为你目录中jquery的文件路径:
如:
代码如下 | 复制代码 |
<script type=“text/javascript“ src=“js/jquery.js“></script> |
然后,你可以再找个另外一个域名的web目录,将文件jsonp.php:
代码如下:
代码如下 | 复制代码 |
<?php $callback = $_GET[“callback“]; $a = array( 'code'=>'CA1998', 'price'=>'6000', 'tickets'=>20, 'func'=>$callback, ); $result = json_encode($a); echo “flightHandler($result)“; exit; |
放到这个目录下面去。这样就可以测试了。
直接在浏览器访问testjsonp.html.就可以看到效果了
1,首先,我们就来检查PHP配置文件 php.ini
打开PHP所安装目录下的 php.ini 文件,Ctrl+F搜索“php_mysql.dll”,将“;extension=php_mysql.dll”前的“;”删除以取消注释,同时搜索并修改“extension_dir”的值为“php_mysql.dll”文件所在文件夹。即:
extension_dir = "D:PHPext"
extension=php_mysql.dll
2,然而通过这一页所使用的安装版是没有保存PHP扩展DLL文件的ext文件夹的,所以也就没有php_mysql.dll,我们运行phpMyAdmin当然会有问题
继续打开http:\www.php.netdownloads.php 选择“PHP 5.2.3 zip package”压缩包文件,将其中的ext文件夹全部解压到PHP的安装目录下,所以才有了extension_dir = "D:PHPext"(注:前提是你的PHP安装在D盘)
3,完成了对php.ini文件的修改和包含有php_mysql.dll的ext文件夹的添加,建议重新启动下计算机,再来调试phpMyAdmin
4,当然,对于phpMyAdmin文件夹内的config.inc.php文件进行MySQL帐号和密码的修改。
另外,在网络上搜索了下本问题的相关解决方法,有的解决还需要把“php.ini文件和php_mysql.dll拷贝到了c:windows 以及c:windowssystem32目录”内,这是由于PHP是非安装版,一般安装版则不需要了,你可以在“我的电脑”属性“高级”中选择“环境变量”查看系统变量“Path”其中就指明了PHP的安装路径。
phpMyAdmin“无法载入mysql扩展,请检查PHP配置”的问题解决
总结一下
然后大费周折的实验php安装文件夹里面的三个文件,php.ini;libmysql.dll;extphp_mysql.dll;
其中php.ini中
;extension=php_mysql.dll改成了extension=php_mysql.dll
extension_dir = "." 这个不重要,不一定非要改成extension_dir = "c:phpext"
最后我把php.ini拷贝到了c:windows目录;c:windowssystem32目录
把libmysql.dll;extphp_mysql.dll;也分别拷贝进这两个目录
相关文章
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
- 这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
Antd-vue Table组件添加Click事件,实现点击某行数据教程
这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17- 这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- 这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- 这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
Vue生命周期activated之返回上一页不重新请求数据操作
这篇文章主要介绍了Vue生命周期activated之返回上一页不重新请求数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-26