[PHP初级]手把手教你写注册程序 2
输入界面以及取得输入信息请看第一章
信息的验证
这一章说信息的验证。
为什么要验证输入信息?
验证!!!很重要!!!
简单来说:
- 验证可以过滤不符合规则的信息,减少整形处理,提高效率;
- 验证可以在一定程度上过滤有害信息,保护服务器和数据库内的信息。
说网站安全什么的,我们能用php做的最最基础的,就是在有用户输入的地方加上适当的验证!
比如说按照下面的实例要求,输入框中即使输入了a or 1=1--
这样的mysql注入信息,会在验证的时候就被拦下来,并不会被送往数据库,更不会“不经意的”取出数据库中重要的信息。
验证
接上一章。
获取到正确的POST值了,我们将根据以下的规则对输入信息进行验证:
项目 | 必须 | 验证内容 |
---|---|---|
用户名 | YES | 不超过20字 / 只允许输入半角英文及数字 |
密码 | YES | 8-20字 / 只允许输入半角英文及数字 |
确认密码 | YES | 8-20字 / 只允许输入半角英文及数字 / 与密码一致 |
这里可以看出,我们需要写以下4个验证方法:
- 字数上限验证
- 字数下限验证
- 只允许输入半角英文及数字的验证
- 一致与否的验证
process.php
/**
* 字数上限
*
* @param int $max 字数上限
* @param string $input 输入信息
* @return string 不符合要求时返回错误信息,符合要求时返回空文字列
*/
public function checkMaxLength($max, $input)
{
return (mb_strlen($input) > $max) ? '最多只能输入' . $max . '字。' : '';
}
/**
* 字数下限
*
* @param int $min 字数下限
* @param string $input 输入信息
* @return string 不符合要求时返回错误信息,符合要求时返回空文字列
*/
public function checkMinLength($min, $input)
{
return (mb_strlen($input) < $min) ? '至少输入' . $min . '字。' : '';
}
/**
* 只允许输入半角英文及数字的验证
*
* @param string $input 输入信息
* @return string 不符合要求时返回错误信息,符合要求时返回空文字列
*/
public function checkEnNum($input)
{
$pattern = '/^[a-zA-Z0-9]+$/';
return (!preg_match($pattern, $input)) ? '只可以输入英文及数字。' : '';
}
/**
* 一致与否
*
* @param string $source 参照信息
* @param string $input 输入信息
* @return string 不符合要求时返回错误信息,符合要求时返回空文字列
*/
public function checkSameValue($source, $input)
{
return ($input !== $source) ? '输入信息不一致' : '';
}
现在准备一个放置错误信息的数组,并在数组内呼出验证方法:
process.php -> 注册按钮被按下时的if文内
// 放置错误信息的数组
$errMess = [
'userNm' => [
'maxLength' => checkMaxLength(20, $userNm),
'EnNum' => checkEnNum($userNm)
],
'pass' => [
'minLength' => checkMinLength(8, $pass),
'maxLength' => checkMaxLength(20, $pass),
'EnNum' => checkEnNum($pass)
],
'confirmPass' => [
'minLength' => checkMinLength(8, $confirmPass),
'maxLength' => checkMaxLength(20, $confirmPass),
'EnNum' => checkEnNum($confirmPass),
'SameToPass' => checkSameValue($pass, $confirmPass)
]
];
如果什么都不输入直接按注册的话,这个数组会是这样:
<输出信息>
array (size=3)
'userNm' =>
array (size=2)
'maxLength' => string '' (length=0)
'EnNum' => string '只可以输入英文及数字。' (length=33)
'pass' =>
array (size=3)
'minLength' => string '至少输入8字。' (length=19)
'maxLength' => string '' (length=0)
'EnNum' => string '只可以输入英文及数字。' (length=33)
'confirmPass' =>
array (size=4)
'minLength' => string '至少输入8字。' (length=19)
'maxLength' => string '' (length=0)
'EnNum' => string '只可以输入英文及数字。' (length=33)
'SameToPass' => string '' (length=0)
接下来我们要对数组进行判断:
- 数组中有错误信息的时候在注册界面显示错误信息
- 数组中没有错误信息的时候将输入信息保存到数据库
为了查看上面这个多元数组中是否有错误信息,我写了下面这个方法:
process.php
/**
* 是否有错误信息
*
* @param array $errMess 错误信息的数组
* @return bool 无错 - TRUE | 有错 - FALSE
*/
function isErr($errMess)
{
foreach ($errMess as $val) {
if (!empty(array_filter($val))) {
return false;
}
}
return true;
}
有了这个方法以后,我们判定是否有错误可以这样写:
process.php -> 注册按钮被按下时的if文内
if (!isErr($errMess)) {// isErr的值为false(即有错)的时候
require_once('index.php');// 显示注册页面
exit;
}
// isErr的值为true(即无错)的时候
// 将信息保存至数据库
有错误信息的情况下,php什么都不用做,所以我们也什么都不用写。
显示错误信息
关于验证,最后一步就是将错误信息输出到前台,告诉用户“你输错了哪里”。
这一步我们需要写一个可以输出红色字体的方法:
process.php
/**
* 有错误的话输出红色的错误信息
*
* @param array $errMess 各个输入项目的错误信息的数组
* @return string 红色字体的错误信息的html文
*/
function displayRedErr($errMess)
{
$start = '<p style="color:red">';
$end = '</p>';
return $start . implode('<br />', $errMess) . $end;
}
输出错误信息的方法写好了,这时候我们需要翻出index.php,添加4行php文:
index.php:
<?php require_once('process.php'); ?>
<!DOCTYPE html>
<html>
<head>
<title>注 册</title>
</head>
<body>
<form action="process.php" method="POST">
用户名 : <input name="userNm"><br />
<?= (isset($errMess) && !empty(array_filter($errMess['userNm']))) ? displayRedErr($errMess['userNm']) : null; ?>
密码 : <input name="pass" type="password"><br />
<?= (isset($errMess) && !empty(array_filter($errMess['pass']))) ? displayRedErr($errMess['pass']) : null; ?>
确认密码 : <input name="confirmPass" type="password"><br />
<?= (isset($errMess) && !empty(array_filter($errMess['confirmPass']))) ? displayRedErr($errMess['confirmPass']) : null; ?>
<input type="submit" name="register" value="注册">
</form>
</body>
</html>
<?=
是<?php echo
的缩写,php5.4.0开始官方推荐写法。
需要注意的是,使用php5.4.0之前的版本的朋友不一定能够使用哦(´-ω-`)
到此,验证的写法就结束啦~
下一章是数据的保存٩(ˊᗜˋ*)و