php中urlencode与rawurlencode的区别
前段时间说自己遇到了个《URL加号引发错误》的BUG,引起这个bug的原因就是自己在URL中使用了 urlencode 函数,该函数会把空格转换成加号,这样就导致URL解析出错,而空格只有转换成 %20 才可以可以正常解析,这时我们就需要使用 rawurlencode 函数。下面就介绍一下 urlencode 函数与 rawurlencode 函数的区别:
urlencode 函数:
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。
rawurlencode 函数:
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 » RFC 3986 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。下面我们来看一下例子:
代码如下 | 复制代码 |
<?php $string = "hello world"; echo urlencode($string) . '<br/>'; //输出:hello+world ?> |
具体例子比较:
代码如下 | 复制代码 |
<?php $asscii = pack("H*",$str); exit; 输出结果: |
---------------------------------------------------------------------------------
比较二者的结果:
1. 数字、大小写字母都不编码
2. 减号、点号、下划线 三个不编码
3. rawurlencode比urlencode多编码一个”加号“
关于JavaScript中escape与encodeURIComponent的区别:
代码如下 | 复制代码 |
>>> console.log(encodeURIComponent("统一注册1")); %E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1 <?php 输出结果: |
结果说明:
1. encodeURIComponent 总是把输入转换成utf8编码处理的,按字节编码
2. escape是按照unicode编码处理的,因为它也对url中不安全的字符做了编码,所以也可以在url中做编码使用,但是,服务器端不会自动解码,下面提供一个PHP版的解码函数,是用手册里找的:
<?php
代码如下 | 复制代码 |
function unescape($str) { ?>
>>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~")); *+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz |
结果比较:
escape未编码的字符: *+-./@_ 共7个
encodeURIComponent未编码的字符: !’()*-._~ 共9个
代码如下 | 复制代码 |
////二纬码 $QRCode_URL="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$ACC_TOKEN; $data ='{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} '; /* $ch = curl_init($MENU_URL); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length:'.strlen($data))); $info = curl_exec($ch); */ function post($url, $params = false, $header = array()){ $ch = curl_init(); $cookieFile = 'sdadsd_cookiejar.txt'; curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE,$cookieFile); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); if($params !== false){ curl_setopt($ch, CURLOPT_POSTFIELDS , $params);} curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0'); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); www.111cn.net $result = curl_exec($ch); curl_close($ch); return $result; } $result = post($QRCode_URL,$data); |
最简单的办法
转换implode
代码如下 | 复制代码 |
数组->字符 字符->数组 |
使用php的serialize函数。
例子:
代码如下 | 复制代码 |
$data = array('上海', '北京', '武汉'); |
如何再将从数据库中取出的数组字符串,转换成数组呢?用unserialize函数:
代码如下 | 复制代码 |
$data = unserialize($data); echo $data; |
当然这样我们还可以直接写入到文件中
serialize和反序列unserialize来实现。
代码如下 | 复制代码 |
<?php |
例子
使用期php的eval函数
string2array,array2string PHP数组转字符串写入数据库,字符串数组转可执行
代码如下 | 复制代码 |
/** |
先用php获取本机的ip,再用php的curl函数来获取用户的详细地区.下面来看一下代码;
代码如下 | 复制代码 |
*/ |
方法一,利用QQWry.Dat IP库,我们只胖乎乎
用简单的办法。
使用示例
示例一:
代码如下 | 复制代码 |
$IpLocation = new IpLocation(); |
示例二:
代码如下 | 复制代码 |
$IpLocation = new IpLocation('../qqwry/QQWry.Dat'); |
具体的IP库与Iplocation类文件这里不介绍了大家百度搜索吧。
方法二,利用api接口
示例一,
代码如下 | 复制代码 |
/** $url = "http://ip168.com/ip/?ip=".$ip; |
示例二,
下面这个函数是用php的curl函数从网路上获取详细地区
代码如下 | 复制代码 |
function lazdf($ip){ $curl= curl_init(); curl_setopt($curl,CURLOPT_URL,"http://www.ip138.com/ips138.asp?ip=".$ip); return "<div class="global_widht global_zj zj" style="background: none repeat scroll 0% 0% rgb(226, 255, 191); font-size: 12px; color: rgb(85, 85, 85); height: 30px; line-height: 30px; border-bottom: 1px solid rgb(204, 204, 204); text-align: left;"> 欢迎来自 <b>".$ipp[1]."</b> 的朋友!</div>"; } echo lazdf(GetIP());//输出ip |
欢迎来自长沙地区的朋友
文章先是给各位普及一下关于cookie与session的两个例子,然后再以利用cookie自动登录为例子给大家介绍了它们之间的关系及后面总结了区别,希望此文章对你理解cookie与session会有所帮助。session的使用:
session_start();定义$_SESSION数组变量。
session_start()使用前,不能有任何形式的输出,包括php中的输出和html代码。
$_SESSION数组不可以使用数值下标,只可以使用字符串下标。
php.ini中的session_save_path配置项决定了session的保存位置。
默认情况下,session是保存在文件中。我们可以使用session_set_save_handler()函数来重写session机制。
设置有效时间
代码如下 | 复制代码 |
SESSION: ini_set('session.gc_maxlifetime',24*3600);//session保存一天 session_start(); $_SESSION[‘web_name’]='网易'; |
说明:好像默认是时间是:20-24分钟,但是关闭浏览器session就自动消失了!
删除session:
删除某个元素 unset($_SESSION[key]);
删除所有session $_SESSION=array();
删除保存session数据的文件 session_destroy();
session_distroy()方法只是删除了服务器端的session文件,并不会释放内存中的$_SESSION变量,如果我们在session_distroy()后,立即var_dump($_SESSION),仍然可以看到session输出。因此如果想完全的释放session,必须配合使用$_SESSION=array()。
cookie的使用:
设置cookie:setcookie(变量名,变量值,生存时间(时间戳))。
删除cookie:setcookie(变量名,值,time()-1)。原理:设置cookie的生存时间过期。
读取cookie:$_COOKIE[变量名]。
$path="/"; //设置cookie存放的路径;1.默认存放是本目录,只有本目录下才能访问,2.“/”表示存放在根目录,3.“/foo/”只有foo文件夹下面文件才能访问
代码如下 | 复制代码 |
|
注意:cookie存放的值只能是string类型的,但是要存放数值怎么解决呢!
存储:
代码如下 | 复制代码 |
$array=array('a','b'); |
读取:
代码如下 | 复制代码 |
//恢复serialize对象 $other = StripSlashes($_COOKIE['snsresult']);//必须执行这步 |
注意:setcookie在代码中存取值时前面是不可以输出任何内容的,空行也不可以,不然cookie是没有值的。
1、$_COOKIE只可以读取cookie的值,并不能对cookie进行设置。
2、在使用setcookie之前,不能有任何类型的输出。
3、在脚本第一次设置cookie后,是不能在当前脚本使用$_COOKIE获取到的。需刷新页面或者在其他脚本中获取。
自动登录
代码如下 | 复制代码 |
//检查用户是否登录
|
两者的联系与区别:
联系:
两者都被成为会话技术,用于解决http的无状态性。
sessionID是保存在cookie中的。默认情况下,session是依赖cookie的,如果浏览器端完全禁用了cookie,那么session也就不能用了。但是我们有其他的方法可以让session继续有用。比如url重写,将sessionID放在url中;给表单增加隐藏域,讲sessionID存放在隐藏域中,发送至浏览器。
区别:
cookie保存早浏览器端,每次访问服务器的时候,都会讲cookie带过去,保证让服务器知道两次请求来自于同一个客户端。安全性较低。
session保存在服务器,每次请求都会通过cookie带来的sessionID去服务器匹配。安全性较高。
session的有效期从session_start()开始,到浏览器关闭结束。
cookie可以设定有效期。默认为浏览器关闭cookie就失效,sessionID丢失,即使服务器端的session文件还在,也不会被找到。
相关文章
mysql_connect与mysql_pconnect的区别详解
在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25js URLdecode()与urlencode方法支持中文解码
下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20php中json_decode()和json_encode()用法与中文不显示解决办法
本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- 这篇文章主要介绍了VSCode 配置uni-app的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了vscode安装git及项目开发过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-19
- 这篇文章主要介绍了Vscode上使用SQL的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-26
- 这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
- 在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<?php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
- 这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
谈谈Jquery中的children find 的区别有哪些
精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21- 这篇文章主要给大家介绍了关于VSCode配置C#运行环境的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
- 这篇文章主要介绍了浅谈Vue开发人员的7个最好的VSCode扩展,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
- 这篇文章主要介绍了vscode和cmake编译多个C++文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
VS Code C/C++环境配置教程(无法打开源文件“xxxxxx.h”或者检测到 #include 错误,请更新includePath)(POSIX API)
这篇文章主要介绍了VS Code C/C++环境配置教程(无法打开源文件“xxxxxx.h” 或者 检测到 #include 错误。请更新includePath) (POSIX API),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-13IntelliJ IDEA 刷题利器 LeetCode 插件详解
这篇文章主要介绍了IntelliJ IDEA 刷题利器 LeetCode 插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-21