接受来自文本输入框的数据
需要两个文件,一个文件名叫index.php用于展示文本框表单(发起请求);另一个文件名叫welcome.php用于接收请求并作出响应。
- 其中作为请求方的index.php文件内代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHP表单</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
</body>
</html>
- 其中作为响应方的welcome.php文件内代码如下:
<?php
echo <<<eof
欢迎{$_POST['fname']}!您的年龄是{$_POST['age']}岁。
<br />
eof;
测试过程:先通过浏览器访问127.0.0.1:80/index.php,在页面输入信息后点击提交即可查看表单请求的响应页面。
接收来自下拉菜单的数据(请求与响应同文件)
直接使用代码:
<?php
$q = isset($_GET['q']) ? htmlspecialchars($_GET['q']) : '';
if ($q)
{
if ($q == 'PHP')
{
echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE')
{
echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO')
{
echo '淘宝<br>http://www.taobao.com';
}
}
else
{
echo <<<eof
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="PHP">PHP</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
eof;
}
这里需要注意的是,form表单部分被放置到php的else代码块中。倘若不使用if{}else{}语句分离接收判断部分和请求表单部分的代码的话,比如如下代码:
<?php
$q = isset($_GET['q']) ? htmlspecialchars($_GET['q']) : '';
if ($q == 'PHP') {
echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
echo <<<eof
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="PHP">PHP</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
eof;
运行查看一下效果
再比如更改一下代码块的顺序:
<?php
echo <<<eof
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="PHP">PHP</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
eof;
$q = isset($_GET['q']) ? htmlspecialchars($_GET['q']) : '';
if ($q == 'PHP') {
echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
尝试更改一下请求方式为post:
<?php
echo <<<eof
<form action="" method="post">
<select name="q">
<option value="">选择一个站点:</option>
<option value="PHP">PHP</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
eof;
$q = isset($_POST['q']) ? htmlspecialchars($_POST['q']) : '';
if ($q == 'PHP') {
echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
尝试不使用三目运算符对变量q赋值,而是直接使用$_POST[‘q’],比如这样:
<?php
echo <<<eof
<form action="" method="post">
<select name="q">
<option value="">选择一个站点:</option>
<option value="PHP">PHP</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
eof;
$q =$_POST['q'];
if ($q == 'PHP') {
echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
此时就会报错:原因是第一次访问该页面时没有提交任何下拉菜单数据,或者说请求没有带任何参数,于是语句“$q =$_POST[‘q’]; 赋值号右边无法从POST数组中解析出key为q的value,于是赋值失败,导致报错。”
这一现象强调了原本的三目运算符的重要性
$q = isset($_POST['q']) ? htmlspecialchars($_POST['q']) : '';
该三目运算符解决了初次访问没有参数时的处理。同样地,通过if{}else{}来分割表单请求部分和响应部分有同样的思想在里面
接收多选下拉菜单的数据
<?php
$q = isset($_POST['q']) ? $_POST['q'] : '';
if (is_array($q)) {
$sites = array(
'PHP' => 'php中文网: http://www.php.cn',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach ($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
echo <<<eof
<form action="" method="post">
<select multiple="multiple" name="q[]">
<option value="">选择一个站点:</option>
<option value="PHP">PHP</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
eof;
}
第一次使用多选下拉菜单者需要注意:要实现多选,需要按住键盘Ctrl键!!!
接收单选按钮表单
<?php
$q = isset($_POST['q']) ? $_POST['q'] : '';
if ($q) {
if ($q == 'PHP') {
echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
echo <<<eof
<form action="" method="post">
<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>
eof;
}
接收复选框表单
<?php
$q = isset($_POST['q']) ? $_POST['q'] : '';
if (is_array($q)) {
$sites = array(
'PHP' => 'php中文网教程: http://www.php.cn',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach ($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
echo <<<eof
<form action="" method="post">
<input type="checkbox" name="q[]" value="PHP"> PHP<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form>
eof;
}
数据验证
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>PHP中文网(php.cn)</title>
<style>
.error {
color: #FF0000;
}
</style>
</head>
<body>
<?php
// 定义变量并默认设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) $nameErr = "名字是必需的";
else {
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/", $name)) $nameErr = "只允许字母和空格";
}
if (empty($_POST["email"])) $emailErr = "邮箱是必需的";
else {
$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email)) $emailErr = "非法邮箱格式";
}
if (empty($_POST["website"])) $website = "";
else {
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website)) {
$websiteErr = "非法的 URL 的地址";
}
}
if (empty($_POST["comment"])) $comment = "";
else $comment = test_input($_POST["comment"]);
if (empty($_POST["gender"])) $genderErr = "性别是必需的";
else $gender = test_input($_POST["gender"]);
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$address = htmlspecialchars($_SERVER["PHP_SELF"]);//防止被恶意攻击的一种手段
$femaleIsChecked = (isset($gender) && $gender == "female") ? "checked" : "";
$maleIsChecked = (isset($gender) && $gender == "male") ? "male" : "";
echo <<<eof
<h2>PHP 表单验证实例</h2>
<p><span class="error">* 必需字段。</span></p>
<form method="post" action="{$address}">
名字: <input type="text" name="name" value="{$name}">
<span class="error">* {$nameErr}</span>
<br><br>
E-mail: <input type="text" name="email" value="{$email}">
<span class="error">* {$emailErr}</span>
<br><br>
网址: <input type="text" name="website" value="{$website}">
<span class="error">{$websiteErr}</span>
<br><br>
备注: <textarea name="comment" rows="5" cols="40">{$comment}</textarea>
<br><br>
性别:
<input type="radio" name="gender" {$femaleIsChecked} value="female">女
<input type="radio" name="gender" {$maleIsChecked} value="male">男
<span class="error">* {$genderErr}</span>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<h2>您输入的内容是:</h2>
{$name}<br>
{$email}<br>
{$website}<br>
{$comment}<br>
{$gender}
eof;
?>
</body>
</html>
综合说明一下,从这段代码中看出:
- if ($_SERVER[“REQUEST_METHOD”] == “POST”):用于判断请求类型和是否具有请求参数
- if (empty($_POST[“name”])):判空(这个和其他语言一样)
- if (!preg_match("/^[a-zA-Z ]*$/", $name)):正则表达式判断
额外需要注意一个自定义功能函数
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
这个函数在每次通过了判空之后,每次进行格式判定前都进行了调用。通过查询资料知道:函数内部调用的trim()、stripslashes()、htmlspecialchars()三个函数的作用如下:
- trim() :调用的效果——移除字符串两端的空格,详见:trim()函数功能说明
- stripslashes() :调用的效果——处理转义字符(也就是反斜杠),详见:stripslashes函数功能说明
- htmlspecialchars() :详见:htmlspecialchars()函数功能说明
- 另外还有一个用到的函数isset() :详见:isset()函数功能说明
特别说明:代码中第54行: $address = htmlspecialchars($_SERVER["PHP_SELF"]); 是一种防止网站被恶意攻击的手段,详见:
在获取$_SERVER[“PHP_SELF”]时,使用函数 htmlspecialchars()进行防恶意攻击说明