标签 - PHP函数

PHP函数    2019-04-25 16:51:09    17    0    0

getenv -- Gets the value of an environment variable, string getenv ( string varname ), Returns the value of the environment variable varname, or FALSE on an error.

1<?php
2  // Example use of getenv()
3  $ip getenv('REMOTE_ADDR');
4  // Or simply use a Superglobal ($_SERVER or $_ENV)
5  $ip $_SERVER['REMOTE_ADDR'];
6?>

这是在PHP官方的manual提供的方法。

但是当Web服务器API是ASAPI (IIS)的时候,getenv函数是不起作用的。这种情况下你如果用getenv来取得用户客户端ip的话,得到的将是错误的ip地址。

因此更为安全和准确的方法是尽量避免使用getenv函数。比如可以用以下的函数来获取ip信息:

程序代码

01<?php
02    function GetIP(){
03        if (getenv("HTTP_CLIENT_IP")
04            && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
05           $ip getenv("HTTP_CLIENT_IP");
06        else if (getenv("HTTP_X_FORWARDED_FOR")
07            && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
08           $ip getenv("HTTP_X_FORWARDED_FOR");
09        else if (getenv("REMOTE_ADDR")
10            && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
11           $ip getenv("REMOTE_ADDR");
12        else if (isset($_SERVER['RE
PHP函数    2019-04-25 16:50:48    11    0    0
01<?php
02$var '';
03// 结果为 TRUE,所以后边的文本将被打印出来。
04if (isset($var)) {
05    print "变量 var 已经设置成功, 所以这句话你可以看得到。".'<br>';
06}
07// 在后边的例子中,我们将使用 var_dump 输出 isset() 的返回值。
08$a "test";
09$b "anothertest";
10echo "变量 a 已经设置,成功的返回值为";
11echo isset($a).'<br>';
12echo "使用 var_dump 输出 isset() 的返回值:";
13var_dump( isset($a) );      // TRUE
14var_dump( isset ($a$b) ); // TRUE
15unset ($a);
16var_dump( isset ($a) );     // FALSE
17var_dump( isset ($a$b) ); // FALSE
18$foo = NULL;
19var_dump( isset ($foo) );   // FALSE
20?>

程序运行结果

变量 var 已经设置成功, 所以这句话你可以看得到。
变量 a 已经设置,成功的返回值为1
使用 var_dump 输出 isset() 的返回值:bool(true) bool(true) bool(false) bool(false) bool(false)

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。

这对于数组中的元素也同样有效:

1<?php
2$a array ('test' => 1, 'hello' => NULL);
3var_dump( isset ($a['test']) );            // TRUE
4var_dump( isset ($a['foo']) );             // FALSE
5var_dump( isset ($a['hello']) );           // FALSE
6// 键 'hello' 的值等
PHP函数    2019-04-25 16:49:54    10    0    0

我们知道,PHP没有提供专门删除一个特定数组元素的方法。但是可以通过unset()函数来完成这种要求,比如下面的程序:

1<?php
2     
3    $arr array('apple','banana','cat','dog');
4     
5    unset($arr[2]);
6    print_r($arr);
7     
8?>

程序运行结果:

1Array ( [0] => apple [1] => banana [3] => dog )

但是这种方法的最大缺点是没有重建数组索引,就是说,数组的第三个元素没了。

经过查资料后,原来PHP提供了这个功能,只不过很间接。这个函数是array_splice()。

为了使用方便,我封装成了一个函数,方便大家使用:

01<?php
02     
03    function array_remove(&$arr$offset)
04    
05        array_splice($arr$offset, 1); 
06    }
07     
08    $arr array('apple','banana','cat','dog');
09     
10    array_remove($arr, 2);
11    print_r($arr);
12?>

经过测试可以知道,2的位置这个元素被真正的删除了,并且重新建立了索引。

程序运行结果:

1Array ( [0] => apple [1] => banana [2] => dog )

PHP array_splice() 函数

array_splice() 函数与 array_slice() 函数类似,选择数组中的一系列元素,但不返回,而是删除它们并用其它值代替。如果提供了第四个参数,则之前选中的那些元素将被第四个参数指定的数组取代。

最后生成的数组将会返回。

语法:array_splice(array,offset,length,array)

  • array:必需。规定数组。
  • offset:必需。数值。如果 offset 为正,则从输入数组中该值指定的偏移量开始移除。如果 offset 为负,则从输入数组末尾倒数该值指定的偏移量开始移除。
  • length:可选。数值。如果省略该参数,则移除数组中从 offset 到 结尾的所有部分。如果指定了 length 并且为正值,则移除这么
PHP函数    2019-04-25 16:49:15    10    0    0

有时候我们需要对二维数组的某个键的值进行排序,这里就是讨论这个问题。我们可以使用array_multisort()这个函数。array_multisort() 函数对多个数组或多维数组进行排序。

参数中的数组被当成一个表的列并以行来进行排序 - 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。

第一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志(排序标志用于更改默认的排列顺序)之一:

  • SORT_ASC - 默认,按升序排列。(A-Z)
  • SORT_DESC - 按降序排列。(Z-A)

随后可以指定排序的类型:

  • SORT_REGULAR - 默认。将每一项按常规顺序排列。
  • SORT_NUMERIC - 将每一项按数字顺序排列。
  • SORT_STRING - 将每一项按字母顺序排列。

语法:array_multisort(array1,sorting order,sorting type,array2,array3...)

  • array1:必需。规定输入的数组。
  • sorting order:可选。规定排列顺序。可能的值是 SORT_ASC 和 SORT_DESC。
  • sorting type:可选。规定排序类型。可能的值是SORT_REGULAR、SORT_NUMERIC和SORT_STRING。
  • array2:可选。规定输入的数组。
  • array3:可选。规定输入的数组。

字符串键名将被保留,但是数字键将被重新索引,从 0 开始,并以 1 递增。可以在每个数组后设置排序顺序和排序类型。如果没有设置,每个数组参数会使用默认值。

下面是一个例子:

01<?php
02     
03    $arr '';
04     
05    echo '二维数组如下:'.'<br / >';
06    for($i=0; $i<=5; $i++)
07    {
08        $arr[$i]['val'] = mt_rand(1, 100);
09        $arr[$i]['num'] = mt_rand(1, 100);
10    }
11     
12    echo '<pre>';
13    print_r($arr);
14    echo '</pre>';
15   
PHP函数    2019-04-25 16:48:48    18    0    0

URLEncode

urlencode函数将传入的字符串参数进行URL编码。其返回的字符串中除了“ˉ—.”之外,所有非字母数字字符都被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此函数便于将字符串编码并将其用于URL的请求部分,同时还便于将变量传递给下一页。

URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu、Google等搜索引擎中输入中文查询时候,生成经过 Encode过的网页URL。URLEncode的方式一般有两种一种是传统的基于GB2312的Encode(Baidu、Yisou等使用),一种是 基于UTF-8的Encode(Google,Yahoo等使用)。本工具分别实现两种方式的Encode与Decode。

  • 中文 -> GB2312的Encode -> %D6%D0%CE%C4
  • 中文 -> UTF-8的Encode -> %E4%B8%AD%E6%96%87

Html中的URLEncode

编码为GB2312的html文件中,http://www.nowamagic.net/中文.rar -> 浏览器自动转换为 -> http://www.nowamagic.net/%D6%D0%CE%C4.rar

注意:Firefox对GB2312的Encode的中文URL支持不好,因为它默认是UTF-8编码发送URL的,但是ftp://协议可以。

编码为UTF-8的html文件中,http://www.nowamagic.net/中文.rar -> 浏览器自动转换为 -> http://www.nowamagic.net/%E4%B8%AD%E6%96%87.rar

PHP中的URLEncode:

1<?php 
2//GB2312的Encode 
3echo urlencode("中文-_. ")."\n"//%D6%D0%CE%C4-_.+ 
4echo urldecode("%D6%D0%CE%C4-_. ")."\n"//中文-_. 
5echo rawurlencode("中文-_. ")."\n"//%D6%D0%CE%C4-_.%20 
6echo rawurldecode("%D6%D0%CE%C4-_. ")."\n"//中文-_. 
7?> 

除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)

PHP函数    2019-04-25 16:48:22    15    0    0

preg_match — 进行正则表达式匹配。

语法:int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )

在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。如果提供了 matches ,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。

参数说明:
参数说明
pattern正则表达式
subject需要匹配检索的对象
matches可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推

flags 可以是下列标记:PREG_OFFSET_CAPTURE。如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。本标记自 PHP 4.3.0 起可用。

flags 参数自 PHP 4.3.0 起可用。

preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。

如果只想查看一个字符串是否包含在另一个字符串中,不要用 preg_match()。可以用 strpos() 或 strstr() 替代,要快得多。

获取Google首页title

比如说要获取google首页的title内容,代码如下:

1<?php
2$str file_get_contents('http://www.google.com');
3preg_match('/<title>(.*)<\/title>/'$str$arr);
4echo $arr[1];
5?>

从网址获取域名

1<?php
2preg_match("/^(http:\/\/)?([^\/]+)/i""http://www.nowamagic.net
PHP函数    2019-04-25 16:47:56    11    0    0

error_reporting() 设置 PHP 的报错级别并返回当前级别。

语法:error_reporting(report_level)

如果参数 level 未指定,当前报错级别将被返回。下面几项是 level 可能的值:

  • ; 错误报告是按位的。或者将数字加起来得到想要的错误报告等级。  
  • ; E_ALL - 所有的错误和警告  
  • ; E_ERROR - 致命性运行时错  
  • ; E_WARNING - 运行时警告(非致命性错)  
  • ; E_PARSE - 编译时解析错误  
  • ; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的, 
  • ;也可能是有意的行为造成的。(如:基于未初始化的变量自动初始化为一个  
  •               ;空字符串的事实而使用一个未初始化的变量) 
  • ; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误  
  • ; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)  
  • ; E_COMPILE_ERROR - 编译时致命性错  
  • ; E_COMPILE_WARNING - 编译时警告(非致命性错)  
  • ; E_USER_ERROR - 用户产生的出错消息  
  • ; E_USER_WARNING - 用户产生的警告消息  
  • ; E_USER_NOTICE - 用户产生的提醒消息 

任意数目的以上选项都可以用“或”来连接(用 OR 或 |),这样可以报告所有需要的各级别错误。例如,下面的代码关闭了用户自定义的错误和警告,执行了某些操作,然后恢复到原始的报错级别:

01<?php
02//禁用错误报告
03error_reporting(0);
04 
05//报告运行时错误
06error_reporting(E_ERROR | E_WARNING | E_PARSE);
07 
08//报告所有错误
09error_reporting(E_ALL);
10?>
1<?php
2error_reporting(255);   // 列出所有提示
3error_reporting(0);     // 不显示所有提示
4error_reporting(7);     // 建议使用
5?>

更详细可以参照下表:

常量描述
1E_ERRORFatal run-time errors. Errors that can not be recov
PHP函数    2019-04-25 16:47:30    13    0    0

get_magic_quotes_gpc

取得 PHP 环境变数 magic_quotes_gpc 的值,属于 PHP 系统功能。

语法: long get_magic_quotes_gpc(void);

返回值: 长整数

这个函数做什么的?

本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。

在php的配置文件中,有个布尔值的设置,就是magic_quotes_runtime。当它打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。 当然如果重复给溢出字符加反斜线,那么字符串中就会有多个反斜线,所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。

为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测该设置的状态决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉该设置。

magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的'"\加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。

一般用法如下:

1if(!get_magic_quotes_gpc())
2{
3    addslashes($prot);
4}

在手册中string addslashes ( string str )介绍的时候有这样一句话说明了get_magic_quotes_gpc的用法以及作用。默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是

PHP函数    2019-04-25 16:46:52    6    0    0

有时候,我们需要在服务器端模拟 POST/GET 等请求,也就是在 PHP 程序中去实现模拟,改怎么做到呢?或者说,在 PHP 程序里,给你一个数组,如何将这个数组 POST/GET 到另外一个地址呢?当然,使用 CURL 很容易办到,那么如果不使用 CURL 库,又该怎么办呢?其实,在 PHP 里已经有相关的函数实现了,这个函数就是接下来要讲的 stream_context_create()

直接 show you the code,这是最好的方法:

01$data array(
02    'foo'=>'bar',
03    'baz'=>'boom',
04    'site'=>'www.nowamagic.net',
05    'name'=>'nowa magic');
06     
07$data = http_build_query($data);
08 
09//$postdata = http_build_query($data);
10$options array(
11    'http' => array(
12        'method' => 'POST',
13        'header' => 'Content-type:application/x-www-form-urlencoded',
14        'content' => $data
15        //'timeout' => 60 * 60 // 超时时间(单位:s)
16    )
17);
18 
20$context = stream_context_create($options);
21$result file_get_contents($url, false, $context);
22 
23echo $result;

http://www.nowamagic.net/test2.php 的代码为:

1$data $_POST;
2 
3echo '<pre>';
4print_r( $data );
5echo '</pre>';

运行结果为:

1Array
2(
3    [foo] => bar
4    [baz] => boom
5    [site] => www.nowamag