15

PHP中extract()的使用方法

年前年后没什么活儿,闲着没事时准备把织梦折采集功能提出来,经过改造移植进Destoon网站系统。在改造的过程中,也碰到了很多新知识来学习。

Destoon源码根目录common.inc.php文件约第80多行,源码如下:

if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);

注:不要对不能信任的数据使用 extract()

测试实例:

form.html

action.php

extract(),它的主要作用是将数组展开,键名(name)作为变量名,元素值(value)为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交过来的内容不用一一赋值。

int extract ( array $var_array [, int $extract_type [, string $prefix ]] )

extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:

EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。

注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。

extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。

Example#1 extract() 例子

上例将输出:

blue, large, sphere, medium

$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $mrdede_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $mrdede_color,$mrdede_size 和 $mrdede_shape。

必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。

十一 07

PHP输出函数有哪些?

1 echo();2 print();3 print_r();4 printf();5 sprintf();6 die();7 var_dump();8 var_export();

echo

返回值是void,可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用。使用的时候不用加括号,加上也可以。只支持基本类型,布尔型除外,echo true的时候显示1,echo false的时候啥都没有。echo不可以输出数组类型

print()

只可以同时输出一个字符串,一个变量,不支持逗号分隔多个显示变量的语法,需要圆括号,print能输出数组类型的数据,返回值是int,当其执行失败时返flase。print  的用法和C语言很像,所以会对输出内容里的%做特殊解释。

print_r()

不仅可以打印变量的的值,还能显示变量类型,而且也可以显示数组和对象这样复杂的变量类型。print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。 Continue reading

十一 07

PHP $_SERVER 相关信息

$_SERVER中存着很多信息,备份待用。

以下四行,是我们相对常用的

  1. $_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言
  2. $_SERVER['REMOTE_ADDR'] //当前用户 IP 。
  3. $_SERVER['REMOTE_HOST'] //当前用户主机名,DNS 反向解析不依赖于用户的 REMOTE_ADDR。
  4. $_SERVER['REQUEST_URI'] //URL

其它:

  1. $_SERVER['SCRIPT_FILENAME'] //当前执行脚本的绝对路径名。
  2. $_SERVER['SCRIPT_URI'] //用来指定访问的页面,如:“/index.html”
  3. $_SERVER['REMOTE_PORT'] //端口。
  4. $_SERVER['SERVER_ADDR'] //当前运行脚本所在的服务器IP
  5. $_SERVER['SERVER_NAME'] //服务器主机的名称。
  6. $_SERVER['PHP_SELF']//正在执行脚本的文件名
  7. $_SERVER['argv'] //传递给该脚本的参数。
  8. $_SERVER['argc'] //传递给程序的命令行参数的个数。
  9. $_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。
  10. $_SERVER['SERVER_SOFTWARE'] //服务器标识的字串,在响应请求时的头信息中给出
  11. $_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本
  12. $_SERVER['REQUEST_METHOD']//访问页面时的请求方法
  13. $_SERVER['REQUEST_TIME'] //请求开始时的时间戳。从 PHP 5.1.0 起可用
  14. $_SERVER['QUERY_STRING'] //查询(query)的字符串,如果有的话,通过它进行页面访问。
  15. $_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录
  16. $_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容,如果存在的话。
  17. $_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容,如果存在的话。
  18. $_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容
  19. $_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
  20. $_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容,如果存在的话。
  21. $_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址,该值并不可信。
  22. $_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。
  23. $_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off
  24. $_SERVER['SERVER_ADMIN'] //管理员信息。该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
  25. $_SERVER['SERVER_PORT'] //服务器所使用的端口,默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
  26. $_SERVER['SERVER_SIGNATURE'] //包含服务器版本和虚拟主机名的字符串。
  27. $_SERVER['PATH_TRANSLATED'] //当前脚本所在文件系统(不是文档根目录)的基本路径。
  28. $_SERVER['SCRIPT_NAME'] //包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。
  29. $_SERVER['PHP_AUTH_USER'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
  30. $_SERVER['PHP_AUTH_PW'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
  31. $_SERVER['AUTH_TYPE'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型
十一 06

PHP使用$_SERVER['HTTP_USER_AGENT'];获取User Agent信息,另附JS方法

PHP使用$_SERVER['HTTP_USER_AGENT'];获取User Agent信息,通过查找信息的异同并加以判断语句来实现只允许页面在微信内置浏览器打开,或只允许在手机QQ内置浏览器打开,或其它浏览器打开等。

安卓系统

手机UC浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/10.7.5.655 U3/0.8.0 Mobile Safari/534.30

手机QQ浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/6.1 Mobile Safari/537.36

手机QQ内置浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025477 Mobile Safari/533.1 V1_AND_SQ_5.9.1_272_YYB_D QQ/5.9.1.2535 NetType/WIFI WebP/0.3.0 Pixel/720

微信内置浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.5.50_r1573191.640 NetType/WIFI Language/zh_CN

手机百度:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0 baiduboxapp/6.9.1 (Baidu; P1 4.2.2)

IOS系统

微信内置浏览器:(iPhone 4S)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN

手机QQ内置浏览器:(iPhone 4S)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN

手机QQ内置浏览器:(iPhone plus)
Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508 QQ/5.9.1.405 Pixel/1080 NetType/WIFI Mem/132

手机QQ内置浏览器:(iPhone plus)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 QQ/5.9.1.405 Pixel/1080 NetType/2G Mem/208

JavaScript和PHP获取后判断信息方法如下:
Continue reading

16

微信支付 V3版

请一定要先看demo

需要申请相应的帐号
后台设置支付目录

js_api_call.php

 

14

WordPress网站提示:Cannot modify header information – headers already sent by出错的原因

WordPress网站提示:Cannot modify header information – headers already sent by出错的原因,就我个人的网站来说,问题是出在之前改过一个文件,我把保存格式改为了utf-8了,因为我回想一下我没改过什么东西,把文件改回来还是不行,后来在网上找来找去,发现可能是文件保存格式问题,转换了一下动过的文件的文件格式,转换为utf-8无MOB格式,好了。

QQ20151014152151

所以,如果碰到这个问题的朋友,可以试着回想一下动过了哪些文件,之后使用notepad ++编辑工具或者其它专业工具查看文件格式是不是utf-8无MOB格式,如果不是就转换过来,最好不用记事本工具。

http://mrdede.com

29

织梦系统会员登录成功后返回之前来路页面

在使用织梦内容管理系统时,为使网站能有更好的用户体验度,我们都会对其进行功能方面的修改。那么会员登录成功后,返回到会员来到登录页面的前一页面的这个功能怎么修改呢?如下:

查找 文件member/templets/login.htm

第68行<input type="hidden" name="gourl" value="<?php if(!empty($gourl)) echo $gourl;?>">

改为<input type="hidden" name="gourl" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER'];?>">

21

织梦网站管理系统禁止会员同一帐号多地登录

修改织梦网站管理系统PHP程序,实现禁止同一会员帐号多地登录,一般来讲就要从判断IP入手。我修改的这个原理是:会员登录后增加创建名为Only的cookie,当会员刷新页或浏览新页面时判断从数据表@_member中当前会员的loginip值md5后与Only比较异同,把此条件加在验证用户是否已经登录函数IsLogin()中,成立返回真,不成立返回假,即可实现。修改如下:

修改文件/include/memberlogin.class.php

构造函数,大约171行左右的$this->OnlyCookie = GetCookie("Only");代码下一行增加代码如下:
$this->OnlyCookie = GetCookie("Only");

验证用户是否已经登录函数IsLogin(),大约第290行 改为
function IsLogin()
{
$loginipCookie = substr(md5($this->fields['loginip']),0,16);
if($this->M_ID > 0 && $this->OnlyCookie == $loginipCookie) return TRUE;
else return FALSE;
}

Continue reading

20

php模拟用户自动在qq空间发表文章的方法

 

21

PHP创建TXT文件

fwrite(file,string,length)

file     必需。规定要写入的打开文件。
string     必需。规定要写入文件的字符串。
length     可选。规定要写入的最大字节数。

fwrite() 返回写入的字符数,出现错误时则返回 false。

fclose(file)

file 参数是一个文件指针。fclose() 函数关闭该指针指向的文件。如果成功则返回 true,否则返回 false。

Posted in PHP