陈力:传智播客古代 珍宝币 泡泡龙游戏开发第40讲:PHP中预定义超全局变量
超全局变量是在全部作用域中始终可用的内置变量。PHP 中的许多预定义变量都是“超全局的”。PHP供提供了九种:$_GET、$_POST、$_REQUEST、$_SERVER、$_ENV、$_FILE、$_COOKIE、$_SESSION、$GLOBALS。本文结合贵阳网站建设的实践经验对这些知识进行介绍。
一、PHP中预定义超全局变量
<?php
$a=23;//全局变量,因为该变量在整个作用域(在这个php文件中),都是可见
function test(){
//如果希望使用到全局$a;
global $a;
$a=45;
}
test();
echo $a;
?>
什么是超全局变量?
超全局变量除了有全局变量的特点外,可以无须申明,直接使用。超全局变量是在全部作用域中始终可用的内置变量。PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 来访问它们。
PHP设计者提供这些超全局数组的目的是为了让PHP程序员可以更方便快捷的编写程序。
快速入门
//超全局变量
$_SERVER['user']="王五";
echo "<pre>";
echo print_r($_SERVER);
echo "</pre>"
提供超全局数组的原因是为了让程序员更方便快捷的写出PHP程序。
PHP供提供了九种:$_GET、$_POST、$_REQUEST、$_SERVER、$_ENV、$_FILE、$_COOKIE、$_SESSION、$GLOBALS。
二、$_GET
$_GET : 通过 URL 参数传递给当前脚本的变量的数组。
客户机(浏览器)通过超链接传送信息给服务器,客户机(浏览器)通过表单传送信息给服务器。
<a href="b.php?city=beijing">传递数据</a>
<a href="b.php?city=北京早">传递数据</a>
$_GET 实际使用,客户机(浏览器)通过超链接传送信息给服务器。
案例:
test.php页面
<?php
echo "<a href='a.php?city=北京好&name=xiaoming'>传送数据</a>";
?>
a.php页面
<?php
echo "<pre>";
echo print_r($_GET);
echo "</pre>";
//如果希望指定取出某个数据,则可以通过下标名
echo $_GET['name'];
?>
看看ie5.5 和 ie 6的中文奇数乱码.
解决方法1.
给奇数中文加一个全角空格,然后到服务器接收是,去掉两头的空行 trim()
解决方法2:
使用urlencode 和 urldecode函数
在test.php页面
<?php
//这句话是对中文url编码.
$str=urlencode("北京好");
echo "<a href='a.php?city=".$str."&name=xiaoming'>传送数据</a>";
?>
//在a.php 页面中,正常接收。
<?php
echo "<pre>";
echo print_r($_GET);
echo "</pre>";
//如果希望指定取出某个数据,则可以通过下标名,如果php版本低,可能看到是中文,需要使用 urldecode() 来解密
echo "--".$_GET['city'];
?>
_GET也可以接收表单以get方式提交数据
<form action=”a.php” method=”get”>
//....
</from>
特别说明如何提交表单数据建议使用POST,不要使用GET
使用细节:
如果判断是否收到值:
a. php
if(empty($_GET['city'])){
echo "没有收到";
}else{
echo "有city";
echo $_GET['city'];
}
//这个方法可以,参看,建议使用empty
if(!isset($_GET['city'])){
echo "没有收到hello";
}else{
echo "有city";
echo $_GET['city'];
}
绝对不要启用register_globals 需要 register_globals = Off
三、$_POST
描述 : 通过Http POST 方式提交的数据,会被封装到$_POST超全局数组中。
$_POST : 通过 HTTP POST 方法传递给当前脚本的变量的数组。
客户机(浏览器)通过表单传送信息给服务器并且需要使用post方式。
有些数据的提交必须使用post,比如上传文件。
举例: 接收表单信息:
各种表单输入项数据的获取
text、password、radio、checkbox、file、select、textarea、hidden、image、button
代码:
代码:
register1.php页面
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<h1>用户注册</h1>
<form action="register2.php" method="post">
用户名:<input type="text" name="username"/><br/>
密码<input type="password" name="passwd"/><br/>
性别:<input type="radio" name="sex" value="female" />女 <input type="radio" name="sex" value="male" />男<br/>
你喜欢什么:
<input type="checkbox" name="hobby[]" value="唱歌">唱歌
<input type="checkbox" name="hobby[]" value="跳舞">跳舞
<input type="checkbox" name="hobby[]" value="游泳">游泳
<input type="checkbox" name="hobby[]" value="骑马">骑马
<br/>
你的所在地是:
<select name="city">
<option value="beijing">北京</option>
<option value="tianjing">天津</option>
<option value="nanjing">南京</option>
</select>
<br/>
个人介绍 :
<textarea rows="10" name="intro" cols="30">
</textarea><br/>
你选择图片<input type="file" name="myphoto"/><br/>
<input type="submit" value="提交"/>
</form>
</html>
**regiseter2.php***
<?php
//看看如何接收
echo "<pre>";
echo print_r($_POST);
echo "</pre>";
//关心爱好
$name=$_POST['username'];
$pwd=$_POST['passwd'];
//如何接收checkbox提交的数据
$hobbies=$_POST['hobby'];
echo "个人信息如下<br/>";
echo "$name--$pwd";
//print_r($hobbies);
echo "该人的爱好";
foreach($hobbies as $key=>$val){
echo "<br/>$key=$val";
}
echo "<br/>你的所在地是";
$city=$_POST['city'];
echo $city;
echo "<br/>个人介绍如下";
$intro=$_POST['intro'];
echo "<br/>$intro";
echo "<a href='#'>查看调查情况</a>"
?>
扩展案例:编写生活幸福度的调查表,然后把调查的信息,存入到数据库.,看看能否获取数据,显示给用户看。
get数据提交主要是
<a></a> 默认是get提交。
<?php
//当这样的方式跳转的时候,也是以get方式提交给ok.php
header(“Location: ok.php?aaa=xiaoming”);
?>
post和get区别:
① 安全性 post>get
② 数据传输大小 [浏览器] post>get
③ 保存到收藏夹 get比较方便。
四、$_REQUST
定义:$_REQUST中可以包括$_GET/$POST/$_COOKIE数组的信息。换一句话说: 就是$_REQUEST超全局数组中,可以获取 get/post/cookie数据。
快速入门:
这里就很好理解,看一个案例 :
<?php
echo "<pre>";
echo print_r($_REQUEST);
echo "</pre>";
//如何取出某个值
//$_REQUEST既可以接收get 请求数据,也可以接收post请求、cookie..
//所以这个变量,比较不可以信,不建议使用. $_GET $_POST
echo $_REQUEST['aa'];
//如果不确定get/post
if($_SERVER['http_method']=="post"){
$echo $_POST['名字'];
}else if($_SERVER['http_method']=="get"){
//用 _GET接收.
}
?>
注意: 由于 $_REQUEST 中的变量通GET,POST 和 COOKIE 输入机制传递给脚本文件,因此可以被远程用户篡改而并不可信。
注意事项:不要经常使用$_REQUEST,如果不确定_GET/POST,你接收数据时候,可以这样:
if($_SERVER[' REQUEST_METHOD’]=="POST"){
$echo $_POST['名字'];
}else if($_SERVER[’ REQUEST_METHOD’]=="GET"){
//用 _GET接收.
}
五、$_SERVER
$_SERVER中主要包含了Http请求行和消息头的信息,同时还有服务器自己的一些信息,比如DOCUMENT_ROOT, SCRIPT_FILENAME ..
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
?>
案例说明:
1. 请获取请求该页面的客户机的ip地址:$_SERVER['REMOTE_ADDR ']
2. 请显示服务器端apache的版本号和php版本号:$_SERVER['???']
3. 请根据$_SERVER的REQUEST_METHOD 来决定使用_GET还是_POST方法接收数据。
4. 请利用$_SERVER 的HTTP_REFERER 来防止盗链行为。
六、$_ENV
该全局数组可以获取环境变量,在php5.3中默认禁用,但是你可以启动,在php.ini文件中启用。
在php5.3.5中,默认情况下不能使用$_ENV 你会得到空值,这是出于对安全的考虑。如果希望使用$_ENV可以通过 修改php.ini 的variables_order = "EGPCS" [EGPCS含义]。但是在开发和生产环境,我们不建议这样配置。
variables_order = "EGPCS"
<?php
echo "<pre>";
print_r($_ENV);
echo "</pre>";
?>
七、$_FILE / $_COOKIE /$_SESSION
$_FILE与文件上传相关
$_COOKIE与COOKIE 相关
$_SESSION与SESSION相关
这几个超全局数组功能强大,在后面详细介绍。
八、$GLOBALS
包含了全部变量的全局组合数组。变量的名字就是数组的键[手册]。
同时一个自定义的全局变量,也会自动的被$_GLOBALS 管理。
案例:
<?php
echo "aaaa";
echo "<pre>";
echo print_r($GLOBALS);
echo "</pre>";
?>
当你定义一个全局变量,该变量也会被$GLOBALS管理。
<?php
$a=900;
echo “<pre>”;
print_r($GLOBALS);
echo “</pre>”
?>
<?php
function test() {
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>
【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第40讲:PHP中预定义超全局变量