PHP如何以post形式发送xml数据

内容提示:

PHP如何以POST形式发送XML数据,PHP如何接收XML文件

发送XML: postXml.php

1
2
3
4
5
6
7
8
$xmlData = "
< xml >ad775b217< /ToUserName >
< FromUserName >tWy3zC3xUgQMR5coXif5SA< /FromUserName >
< CreateTime >1366181013< /CreateTim e>
< MsgType >text< /MsgType >
< Content >我的测试< /Content >
< MsgId >5867702771251151243< /MsgId >
< /xml >";

第一种发送方式,也是推荐的方式:curl

1
2
3
4
5
6
7
8
9
10
11
12
13
$url = 'http://cnwyt.net/xml/getXml.php'; //接收xml数据的文件
$header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlData);
$response = curl_exec($ch);
if(curl_errno($ch)){
print curl_error($ch);
}
curl_close($ch);

第二种发送方式:fsockopen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$url = 'http://cnwyt.net/xml/getXml.php';
$header[] = "Content-type: text/xml";//定义content-type为xml
$server ='http://wang.net/';
$contentLength = strlen($xml_data);
$fp = fsockopen('127.0.0.1', 80);
fputs($fp, "POST $url HTTP/1.0\r\n");
fputs($fp, "Host: $server\r\n");
fputs($fp, "Content-Type: text/xml\r\n");
fputs($fp, "Content-Length: $contentLength\r\n");
fputs($fp, "Connection: close\r\n");
fputs($fp, "\r\n"); // all headers sent
fputs($fp, $xmlData );
$result = '';
while (!feof($fp)) {
$result .= fgets($fp, 128);
}
var_dump($result);

接收XML: getXml.php

1
2
3
4
5
//$xml = $HTTP_RAW_POST_DATA;
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//将xml数据写入文本文件"a.txt"中
$handle = fopen('a.txt','a+');
fwrite($handle,$xml);

FAQ

问题:为什么不使用$_POST接收?
解答:由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,对型如text/xml的内容无法解析为$_POST数组,故保留原型,交给$GLOBALS[‘HTTP_RAW_POST_DATA’] 来接收。注意,$HTTP_RAW_POST_DATA 对于 enctype=”multipart/form-data” 表单数据不可用。

扩展阅读:

使用PHP CURL的POST数据
http://www.nowamagic.net/librarys/veda/detail/124
$HTTP_RAW_POST_DATA
http://www.cnblogs.com/xwblog/archive/2011/12/23/2299672.html

更新记录

  • 2013-04-25 新增此文档 (wangyt)
  • 2017-04-12 重新整理本文档 (wangyt)

[END]

PHP如何判断接收到的是否为正确的图片二进制数据

PHP如何判断接收到的是否为正确的图片二进制数据

(一)、如果存在GD库,可以使用imagecreatefromstring ()函数:

格式:resource imagecreatefromstring ( string $image )
imagecreatefromstring() 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。
返回值:成功则返回图像资源,如果图像格式不支持,数据不是认可的格式,或者图像已损坏则返回 FALSE。
代码示例:

1
2
3
4
5
6
7
8
9
10
11
<?php代码开始
$imgUrl = "http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif";
$data = file_get_contents($imgUrl);
//echo ($data);
$im = imagecreatefromstring($data);
if($im != false){
echo '<p>图片正常...</p>';
}else{
echo '<p>图片已损坏...</p>';
}
代码结束?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php代码开始
$data = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl'
. 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr'
. 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r'
. '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
$data = base64_decode($data);
$im = imagecreatefromstring($data);
if ($im !== false) {
header('Content-Type: image/png');
imagepng($im);
} else {
echo 'An error occured.';
}
代码结束?>

(二)、如果没有GD库可以使用下边的方法:

正常的JPG文件都是以FFD8开头,FFD9结尾的,如果丢失了文件尾部,JPG仍然可以被识别,但是就会丢失部分图像数据。

代码如下:

1
2
3
4
5
6
7
8
9
function check_img_by_source($source) {
switch(bin2hex(substr($source,0,2))){
case 'ffd8' : return 'ffd9' === bin2hex(substr($source,-2));
case '8950' : return '6082' === bin2hex(substr($source,-2));
case '4749' : return '003b' === bin2hex(substr($source,-2));
default : return false;
}
}
var_dump(check_img_by_source(file_get_contents('11.gif'));

大概是这个样子的吧,只针对了jpg,png,gif做了判断。
想加其他的按照以上规则增加即可。
不过上边这个判断不够严谨,别人可以根据以上判断规则构造一个假数据。

(三)、使用 getimagesize 函数

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。

函数拓展:

imagecreatefromjpeg() - 从 JPEG 文件或 URL 新建一图像
imagecreatefrompng() - 从 PNG 文件或 URL 新建一图像
imagecreatefromgif() - 从 GIF 文件或 URL 新建一图像
imagecreatetruecolor() - 新建一个真彩色图像
exif_read_data() — 从 JPEG 或 TIFF 文件中读取 EXIF 头信息(别名:read_exif_data )
file_get_contents() — 将整个文件读入一个字符串
base64_decode() — 对使用 MIME base64 编码的数据进行解码
bin2hex() — 将二进制数据转换成十六进制表示

参考链接:
德问:http://www.dewen.org/q/2643

更新记录

  • 2013-03-22 新增此文档 (wangyt)
  • 2017-04-12 重新整理本文档 (wangyt)

[END]

JS-关于jQuery的AJAX不兼容IE的解决办法

关于jQuery的AJAX不兼容IE的解决办法

在使用jQuery的AJAX:get方法去检测数据是否存在时,会发现IE会出现不兼容的情况。

用AJAX:post方法时,使用Chrome/FireFox/IE均能出现正确的结果,但是在使用AJAX:get方法时,IE却不能返回正确的结果。

难道是数据超出了get方法的限制的长度,这个也不可能,我总共才传了一点点数据。排除。

网上一些网友说是IE缓存的问题,在请求数据后边加上随机数就行,比如加上时间数new Date().getTime()。
先前的代码中我已经添加了随机数,用的是“Math.random()”也不行。难道用时间比较靠谱?

那就改成获取时间试试,在参数后加“new Date().getTime()”后反复测试还是不行,真是百思不得其解!这个错误也排除了。

反复查看手册后发现请求的数据格式还是有一种JSON格式,如{foo:[“bar1”, “bar2”]} ,然后就按照这种格式书写,还真的返回了正确的查询结果。真不知道IE还有这点要求。(完)

先前的格式:

1
2
type: "get",
data: "bid="+my_bid+"&name_cn="+name_cn+"&timeStamp="+new Date().getTime(),

改进后格式:

1
2
type: "get",
data: {'bid':my_bid,'name_cn':name_cn,'timeStamp':new Date().getTime()},

在jQuery手册中是这样描述的:

1
2
3
4
data Object,String
发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。
查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。
如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 "&foo=bar1&foo=bar2"。

代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var siteUrl="http://blog.sina.com.cn/cnwyt";
jQuery.ajax({
type: "get",
url: siteUrl+"cosmetics/product/ajax_check?",
//data: "bid="+my_bid+"&name_cn="+name_cn+"&timeStamp=" + new Date().getTime(),
data: {'bid':my_bid,'name_cn':name_cn,'timeStamp':new Date().getTime()},
dataType: 'json',
error: function (err) {
alert('网络故障,请与管理员联系!');
},
success: function (message) {
if (message!=false){
//ture的代码
} else {
//false的代码
}
}
});

问题描述:jQuery.get()方法在FireFox下可以正常获取值并显示,但是在IE下不行。

原因1:因为IE的缓存问题

解决:在URL后面加一个随机数或时间参数

1
url = "chek.php?timeStamp="+new Date().getTime();

或者写成:

1
data:{'type':type,'name':name,'timeStamp':new Date().getTime()},

获取随机数
Math.random()

获取时间数
new Date().getTime()

原因2:数据格式问题

先前的格式:

1
2
3
4
5
type:"get",
data:"bid="+my_bid+"&name_cn="+name_cn+"&timeStamp="+new
Date().getTime(),
dataType:'json',

改进后的格式:

1
2
3
4
5
type:"get",
data:{'bid':my_bid,'name_cn':name_cn,'timeStamp':new
Date().getTime()},
dataType:'json',

参考链接:

jQuery 的 .get和.post和.ajax方法IE的兼容问题
http://blog.csdn.net/muziduoxi/article/details/7541800

jquery ajax在IE下失效
http://www.im87.cn/blog/256

更新记录

  • 2012-11-02 新增此文档 (wangyt)
  • 2017-04-12 重新整理本文档 (wangyt)

[END]

PHP去除字符串中的最后一个字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//PHP去除字符串中的最后一个字符
$str="aaaa,bbb,ccc,ddd,eee,";
echo rtrim($str,','); //第一种方法 trim($str,$chsrlist)去除两边的
echo substr($str,0,strlen($str)-1); //第二种方法
echo substr($str,0,-1); //第三种方法
echo $str{strlen($str)-1} == ',' ? substr($str, 0, -1) : $str; //第四种方法
?>

我觉得使用rtrim()函数还是比较好的,推荐使用!

如去除右边的逗号:

1
$new_str = rtrim( trim($str), ',' );

去除多个字符:

1
$new_str = rtrim( trim($str),',.;' );

拓展阅读:

代码中用到的函数:

rtrim — 删除字符串末端的空白字符(或者其他字符)
string rtrim ( string $str [, string $charlist ] )
该函数删除 str 末端的空白字符并返回。
string rtrim ( string $str [, string $charlist ] )
通过指定 charlist,可以指定想要删除的字符列表。简单地列出你想要删除的全部字符。使用 .. 格式,可以指定一个范围。

substr — 返回字符串的子串
string substr ( string $string , int $start [, int $length ] )
返回字符串 string 由 start 和 length 参数指定的子字符串。

strlen — 获取字符串长度
int strlen ( string $string )
返回给定的字符串 string 的长度。

[END]

PHP知识点:session和cookie的区别

知识点:session和cookie的区别

session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述和辨析,希望能与大家共同探讨下。

  session和cookie的最大区别在于session是保存在服务端的内存里面,而cookie保存于浏览器或客户端文件里面;session是基于访问的进程,记录了一个访问的开始到结束,当浏览器或进程关闭之后,session也就“消失”了,而cookie更多地被用于标识用户,它可以是长久的,用于用户跟踪和识别唯一用户(Unique Visitor)。

【关于session】

  session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。

  session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。

  但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。
  这里有一个很关键性的注意点,即session失效时间的设置,这里要分两方面来看:浏览器端和服务端。对于浏览器端而言,session与访问进程直接相关,当浏览器被关闭时,session也随之消失;而服务器端的session失效时间一般是人为设置的,目的是能定期地释放内存空间,减小服务器压力,一般的设置为当会话处于非活动状态达20或30分钟时清除该 session,所以浏览器端和服务端的session并非同时消失的,session的中断也并不一定意味着用户一定离开了该网站。目前Google Analytics和Omniture都定义当间隔30分钟没有动作时,算作一次访问结束,所以上图中session的最后一步不只是离开,也有可能是静止、休眠或者发呆的状态。

  还有一点需要注意,就是现在的浏览器好像趋向于多进程的session共享,即通过多个标签或页面打开多个进程访问同一网站时共享一个 session cookie,只有当浏览器被关闭时才会被清除,也就是你有可能在标签中关闭了该网站,但只要浏览器未被关闭并且在服务器端的session未失效前重新开启该网站,那么就还是使用原session进行浏览;而某些浏览器在打开多页面时也可能建立独立的session,IE8、Chrome默认都是共享 session的,在IE8中可以通过菜单栏中的文件->新建会话来建立独立session的浏览页面。

【关于cookie】

  cookie 是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。用户每次访问站点时,Web应用程序都可以读取cookie包含的信息。

  session的实现机制里面已经介绍了常见的方法是使用会话cookie(session cookie)的方式,而平常所说的cookie主要指的是另一类cookie——持久cookie(persistent cookies)。持久cookie是指存放于客户端硬盘中的 cookie信息(设置了一定的有效期限),当用户访问某网站时,浏览器就会在本地硬盘上查找与该网站相关联的cookie。如果该cookie 存在,浏览器就将它与页面请求一起通过HTTP报头信息发送到您的站点,然后在系统会比对cookie中各属性和值是否与存放在服务器端的信息一致,并根据比对结果确定用户为“初访者”或者“老客户”。

  持久cookie一般会保存用户的用户ID,该信息在用户注册或第一次登录的时候由服务器生成包含域名及相关信息的cookie发送并存放到客户端的硬盘文件上,并设置cookie的过期时间,以便于实现用户的自动登录和网站内容自定义。

  Apache自带的mod_usertrack模块可以在用户首次来到当前网站的时候给用户种下一个唯一的cookie(较长时间过期),这个 cookie是用户首次来当前网站的IP地址加上一个随机字符串组成的。同时在自定义WEB日志中在最后增加%{cookie}n字段可以实现 cookie在apache日志中的输出,用于数据统计与用户跟踪。

(内容整理自网络)

更新记录

  • 2012-06-01 新增此文档 (wangyt)
  • 2017-04-12 重新整理本文档 (wangyt)

[END]

PHP-如何不使用临时变量来交换两个数值变量?

PHP-如何不使用临时变量来交换两个数值变量?

在PHP面试题目中,关于变量交换的出现了很多次,现在总结一下!

[题目] 如何在PHP中不使用临时变量来交换两个数值变量?

[解析]

正常是交换两个变量的值应该使用中间变量:

1
2
3
4
5
function swap($a, $b){
$temp = $a;
$a = $b;
$b = $temp;
}

1.这个方法很容易想到,但是只限于交换数值类型的变量:

1
2
3
4
5
function swap (&$a,&$b){
$a = $a+$b;
$b = $a-$b;
$a = $a-$b;
}

2.这方法是语言结构,想法很奇妙:

1
list($a, $b) = array($b, $a);

注:list — 把数组中的值赋给一些变量

3.通过数组函数 array_reverse

1
2
3
4
$arr=array($a,$b);
$arr=array_reverse($arr);
$a=$arr[0];
$b=$arr[1];

注:array_reverse — 返回一个单元顺序相反的数组

4.直接使用数组操作:

1
2
3
4
5
$a = "aaa";
$b = "bbb";
$b = array($a, $b);
$a = $b[1];
$b = $b[0];

更新记录

  • 2012-06-01 新增此文档 (wangyt)
  • 2017-04-12 重新整理本文档 (wangyt)

[END]