PHP JSONP跨域实现程序详解
先看一个实例
代码如下 | 复制代码 |
|
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. 写一个函数,尽可能高效的,从一个标准 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;//输出空 ?> |
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;也分别拷贝进这两个目录
phpmailer是一个非常优秀的php邮箱发送插件了,他可以几乎实现任何邮箱登录发送,下面我介绍163邮箱 126邮箱 yahoo邮箱的发送方法。准备工作:
我们必须注册一个邮箱(163邮箱 126邮箱 yahoo邮箱)随便一个
注意事项
这些邮箱必须是支持登录发送才可以,我们配置就一个地方不。
163邮箱 $mail->Host = "smtp.163.com";
126邮箱 $mail->Host = "smtp.126.com";
yahoo邮箱 $mail->Host = "smtp.mail.yahoo.com.cn";
其它的地方一样的写法,用户名密码你当然要写自己的哦。
我下以163邮箱为实例
代码如下 | 复制代码 |
<?php |
注意,红色地方就是根据你自己的需要修改。
SoapClient,php5自带的。当然,也可以使用nusoap.php这个纯php写的类,该类代码行数为7K多行,效率上肯定不如SoapClient。一、寻找WebService来源
WebService可以自己编写,但是也可以从网络上去寻找现成的。我用的是www.xmethods.net里的US Zip Validator。它的WSDL文件位置在:http://www.webservicemart.com/uszip.asmx?WSDL。 它的作用是根据输入的ZIP代码,返回该代码对应的美国地名,州名,经纬度等。
二、创建SoapClient
第二步就是创建SoapClient,并调用WebService中的方法,并获得返回值。PHP代码如下
二、创建SoapClient
第二步就是创建SoapClient,并调用WebService中的方法,并获得返回值。PHP代码如下:
代码如下 | 复制代码 |
$objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL"); $param=array("ZipCode"=>$zip); |
SoapClient的创建有好多方法,我们用的是最标准的(也是最简单的)WSDL方法。由于查询ZIP的方法肯定需要一个参数,所以我们必须创建一个数组,用“参数名=>取值”的方式进行赋值。
也许读者会对这个数组的创建有一定的兴趣。比如,我们怎么知道“参数名”应该是“ZipCode”而不是别的什么呢?为什么没有更多的参数了,而只有一个?OK,这个问题我们稍后解释。因为这牵涉到WSDL的解读。
创建好参数后,同样的,我们调用SoapClient的方法ValidateZip,并传递参数进去;对于返回的结果,我们用$data变量取出我们真正感兴趣的东西。同样的,这里也存在方法名称是如何确定的问题。我们也在稍后介绍。
如果你也使用PhpEd进行PHP的开发和调试,那么从下面的调试窗口截图中,你可以很清除的看到$data和$out之间的关系:
三、解析数据
上面得到的$data中的数据是标准的XML结构的数据。所以在PHP中,我们需要创建一个XML解析器来对这个数据进行分析。代码如下:
代码如下 | 复制代码 |
$ParsedData=array(); function startElement($parser, $name, $attribs) echo " <font color="#009900">$k</font>="<font color="#990000">$v</font>""; function endElement($parser, $name) $xml_parser= xml_parser_create(); echo "<pre>"; xml_parser_free($xml_parser); |
这里的详细操作需要参考PHP函数手册中关于XML函数的那一章。这里不再赘述。一旦数据被解析成功,我们就可以进行进一步的处理。例如下面的代码就遍历该数组,然后输出:
代码如下 | 复制代码 |
foreach ($ParsedData as $k=>$v) { echo $k."=>".$v."<br />"; } |
四、解读WSDL
上面我们留下了两个疑问:如何知道一个WebService提供的方法,以及它的参数?所有的答案都在WSDL描述中。对于本文使用的WSDL来说,我们 从中截取一段来分析。由于我们是通过Soap进行调用,所以我对完整的WSDL进行了节选,只列出关于Soap调用的部分(反相显示的部分):
首先我们注意到<wsdl:message name=”ValidateZipSoapIn”>这一节,它指出了在Soap调用中,入口参数要参照ValidateZip,于是我们接着转到文件上面一点的地方,看ValidateZip方法的定义:
代码如下 | 复制代码 |
<s:element name="ValidateZip"> |
很明显,ValidateZip要求一个参数,名称为ZipCode,类型为string。
同样,我们再看<wsdl:message name=”ValidateZipSoapOut”>这一节,它指出Soap调用的出口参数是ValidateZipResponse。而后者的 传出参数名称是ValidateZipResult。于是,我们就解释了前两节提出的问题:
•怎样找到要调用的函数?
•怎样知道函数的参数、类型?
•怎样得到函数的返回值?
例2,
这里我们使用php5自带的类来操作
我的结构如下:在 webservice 文件夹下有如下三个文件:Personinfo.php,SoapClient.php,SoapServer.php,具体作用可以参照代码中的注释。
代码如下 | 复制代码 |
/** /** } |
代码如下 | 复制代码 |
<?php //根据实际情况修改下行内容 $s->setClass("PersonInfo"); $s->handle(); header(‘Content-Type:text/html;charset=utf-8′); try { //根据实际情况修改下行内容 echo $soap->getName(); } catch(SoapFault $e) { |
相关文章
- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
- 这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文
时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25- 本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
- 这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
- 什么是js跨域呐?js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。要...2015-10-30
- 这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
- 这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- 这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23