一、表单处理
PHP 超全局变量 $_GET
和 $_POST
用于收集表单数据(form-data)。
使用 <form>
标记创建表单
<form name="表单名称" method="get | post" action="URL" target="target_window">
在这里放置各种表单控件
</form>
1.简单HTML表单——如何发送并接收表单数据
$_POST["表单控件名称"]
对应name属性
$_GET["表单控件名称"]
对应name属性
下面的例子显示了一个简单的 HTML 表单,它包含两个输入字段和一个提交按钮:
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>
表单数据是通过 HTTP POST 方法发送的。
如需显示出被提交的数据,可以简单地输出(echo
)所有变量。
welcome.php:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>
</body>
</html>
输出:
Welcome Bill
Your email address is Bill.Gates@example.com
使用 HTTP GET 方法也能得到相同的结果:
<html>
<body>
<form action="welcome_get.php" method="get">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>
welcome_get.php:
<html>
<body>
Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>
</body>
</html>
2.GET vs. POST
GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...)
)。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。
GET 和 POST 被视作 $_GET
和 $_POST
。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,可以从任何函数、类或文件访问它们。
$_GET
是通过 URL
参数传递到当前脚本的变量数组。
$_POST
是通过 HTTP POST
传递到当前脚本的变量数组。
$_GET
、$_POST
和$_REQUEST
的区别?
$_GET
变量接受所有以get
方式发送的请求,及浏览器地址栏中的?
之后的内容。
$_POST
变量接受所有以post
方式发送的请求,例如,一个form
以method=post
提交,提交后 php 会处理post
过来的全部变量。
$_REQUEST
支持两种方式发送过来的请求,即post
和get
它都可以接受,显示不显示要看传递方法,get
会显示在url
中(有字符数限制),post
不会在url
中显示,可以传递任意多的数据(只要服务器支持)。
3.使用方式
(1)GET 可用于发送非敏感的数据
通过 GET 方法从表单发送的信息 对任何人都是可见的(所有变量名和值都显示在 URL 中)。
GET 对所发送信息的数量也有限制。限制在大约 2000 个字符。
不过,由于变量显示在 URL 中,把页面添加到书签中也更为方便。
注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
注释:HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。
(2)POST 可用于发送表单数据(密码、敏感信息)
通过 POST 方法从表单发送的信息 对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也无限制。
此外 POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part
二进制输入。
不过,由于变量未显示在 URL 中,也就无法将页面添加到书签。
4.PHP 获取数据
PHP 下拉菜单单选
表单使用 GET
方式获取数据,action
属性值为空表示提交到当前脚本,我们可以通过 select
的 name
属性获取下拉菜单的值。
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鸟教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?>
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
PHP 下拉菜单多选
如果下拉菜单是多选的( multiple="multiple"
),我们可以通过将设置 select name="q[]"
以数组的方式获取,以下使用 POST
方式提交,代码如下所示:
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鸟教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
?>
<form action="" method="post">
<select multiple="multiple" name="q[]">
<option value="">选择一个站点:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
单选按钮表单
PHP 单选按钮表单中 name 属性的值是一致的,value 值是不同的。
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鸟教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?><form action="" method="get">
<input type="radio" name="q" value="RUNOOB" />Runoob
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form>
<?php
}
?>
checkbox 复选框
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鸟教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
?><form action="" method="post">
<input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form>
<?php
}
?>
二、PHP 表单验证
1.表单元素
HTML 表单代码如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
该表单使用 method="post"
方法来提交数据。
$_SERVER["PHP_SELF"]
是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。
所以, $_SERVER["PHP_SELF"]
会发送表单数据到当前页面,而不是跳转到不同的页面。
htmlspecialchars()
函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
当用户提交表单时,我们将做以下两件事情:
使用 PHP trim()
函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
使用PHP stripslashes()
函数去除用户输入数据中的反斜杠 ()
接下来让我们将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。
将函数命名为 test_input()
,通过$_SERVER["REQUEST_METHOD"]
来检测表单是否被提交 。如果 REQUEST_METHOD
是 POST,
表单将被提交 - 数据将被验证。如果表单未提交将跳过验证并显示空白。
<?php
// 定义变量并默认设置为空值
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
2.必须字段
用html的required
属性,也可以用php的empty()
。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "名字是必需的。";
} else {
$name = test_input($_POST["name"]);
}
}
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
名字: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
</form>
3.PHP表单—验证邮件和URL
用正则表达式验证信息。
preg_match
— 进行正则表达式匹配。
语法:
int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )
在 subject 字符串中搜索与 pattern
给出的正则表达式相匹配的内容。
如果提供了 matches
,则其会被搜索的结果所填充。$matches[0]
将包含与整个模式匹配的文本,$matches[1]
将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
// 检测名字是否只包含字母跟空格
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允许字母和空格";
}
// 检测邮箱是否合法
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "非法邮箱格式";
}
// 检测 URL 地址是否合法
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "非法的 URL 的地址";
}
//性别
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男
<span class="error">* <?php echo $genderErr;?></span>
三、PHP变量——resquest、cookie和Session
1.PHP $_REQUEST 变量
预定义的
R
E
Q
U
E
S
T
变
量
包
含
了
‘
_REQUEST 变量包含了 `
REQUEST变量包含了‘_GET、
P
O
S
T
‘
和
‘
_POST` 和 `
POST‘和‘_COOKIE` 的内容。
$_REQUEST
变量可用来收集通过 GET 和 POST 方法发送的表单数据。
例子:接受 $_GET
、$_POST
等数据:
欢迎 <?php echo $_REQUEST["fname"]; ?>!<br>
你的年龄是 <?php echo $_REQUEST["age"]; ?> 岁。
2.PHP Cookie
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
(1)创建cookie
setcookie()
函数用于设置 cookie。
注释:setcookie()
函数必须位于 <html>
标签之前。
语法:setcookie(name, value, expire, path, domain);
例子:创建名为 “user” 的 cookie,把为它赋值 “Alex Porter”。我们也规定了此 cookie 在一小时后过期。
<?php
setcookie("user", "Alex Porter", time()+60*60);
?>
(2)取回cookie
PHP 的 $_COOKIE
变量用于取回 cookie 的值。
<?php
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
使用 isset()
函数来确认是否已设置了 cookie:
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "欢迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通访客!<br>";
?>
</body>
</html>
(3)删除cookie
当删除 cookie 时,应当使过期日期变更为过去的时间点。
<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
?>
(4)如果浏览器不支持 Cookie
如果应用程序需要与不支持 cookie 的浏览器打交道,可使用其他的办法在您的应用程序中的页面之间传递信息:通过表单传递数据。
3.PHP Session
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。
Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
(1)开始 PHP Session
把用户信息存储到 PHP session 中之前,首先必须启动会话。
session_start()
函数必须位于 <html>
标签之前:
<?php session_start(); ?>
它会向服务器注册用户的会话,可以开始保存用户信息,同时会为用户会话分配一个 UID。
<html>
<body>
</body>
</html>
(2)存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION
变量。
简单的 page-view 计数器:
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1; //浏览量
}
else
{
$_SESSION['views']=1; //没有设定session值就这里设定
}
echo "浏览量:". $_SESSION['views'];
?>
(3)销毁Session
删除某些 session 数据,可以使用 unset()
,删除所有使用 session_destroy()
函数。
unset()
函数用于释放指定的 session 变量:
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
session_destroy()
函数将重置 session,从而彻底销毁 session,会失去所有已存储的 session 数据。
<?php
session_destroy();
?>