PHP表单的验证详解
首先我们对用户所有提交的数据都通过 PHP 的 htmlspecialchars() 函数处理。把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
当用户提交表单时,我们将做以下两件事情,:
使用 PHP trim() 函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
使用PHP stripslashes()函数去除用户输入数据中的反斜杠 (\)
格式匹配
1、匹配姓名
“/^[a-zA-Z ]*$/”
只允许空格和字母,”^”表示开头,”$”表示结尾,[a-zA-Z ]表示a-z或者A-Z或者空格中的一个字符。
其实例代码如下:
<?PHP $name = $_POST['name']; if(!preg_match('/^[a-zA-Z]*$/',$name)){ echo '只允许字母和空格'; }
2、匹配E-mail
“/([\w-]+\@[\w-]+.[\w-]+)/”
“\w”匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’;
+匹配前面的子表达式一次或多次;
“-“匹配”-“。
3、匹配URL
“/\b(?:(?:https?|ftp):\/\/|www.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i”
保留表单中的值
在用户点击提交按钮后,为确保字段值是否输入正确,我们在HTML的input元素中插添加PHP脚本, 各字段名为: name,email,和 website。 在评论的 textarea 字段中,我们将脚本放于 <textarea> 和 </textarea> 标签之间。 PHP脚本输出值为: $name,$email,$website,和 $comment 变量。
<!DOCTYPE HTML> <html> <head> <Meta charset="utf-8"> <title>form</title> <style> .error {color: #FF0000;} </style> </head> <body> <?PHP // 定义变量并默认设置为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的"; } else { $name = test_input(]); 检测名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",1)">)) { $nameErr = "只允许字母和空格"; } } $_POST["email"$emailErr = "邮箱是必需的"$email = test_input( 检测邮箱是否合法 preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",1)">$email$emailErr = "非法邮箱格式"$_POST["website"$website = test_input( 检测 URL 地址是否合法 preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",1)">$website$websiteErr = "非法的 URL 的地址"$_POST["comment"$comment = ""$comment = test_input(]); } $_POST["gender"$genderErr = "性别是必需的"$gender = test_input(]); } } function test_input($data) { $data = trim(); stripslashes(htmlspecialchars(); return ; } ?> <form method="post" action="<?PHP echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?PHP echo $name;?>"> <span class="error">* <?PHP echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?PHP echo $email;?>"> <span $emailErr;?></span> <br><br> 网址: <input type="text" name="website" value="<?PHP echo $website;?>"> <span class="error"><?PHP $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"><?PHP $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?PHP isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?PHP $gender=="male") echo "checked";?> value="male">男 <span $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?echo "<h2>您输入的内容是:</h2>"echo "<br>"$comment$gender; ?> </body> </html>
结果如下:
以上这些将展示如何安全地处理 PHP 表单。对 HTML 表单数据进行适当的验证对于防范黑客和垃圾邮件很重要!
PHP表单怎么提交到数据库?(详解)
使用PHP创建一个简单的数据库和表,创建MysqL数据库和表。例如创建一个test数据库,其示例的代码如下所示:
<?PHP 创建连接 $conn = new MysqLi('localhost','root','123456'); 检测连接 if($conn->connect_error){ die('连接失败:'.connect_error); } 创建数据库 $sql = 'CREATE DATABASE test'; $conn->query($sql) === TRUE){ echo '数据库创建成功'; }{ echo '数据库创建失败:'.error; } $conn->close();
结果如下:
然后使用CREATE TABLE 语句用于创建 MysqL 表,设置如下几个字段。
id : 它是唯一的,类型为 int ,并选择主键。
uesrname : 用户名,类型为 varchar, 长度为30。
password : 密码,类型为 varchar, 长度为30。
confirm:确认密码,类型为 varchar, 长度为30。
email : 邮箱,类型为 varchar, 长度为30。
<?创建数据表 $sql = "CREATE TABLE login( id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(30) NOT NULL,password VARCHAR(30) NOT NULL,confirm VARCHAR(30) NOT NULL,email VARCHAR(30) NOT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8"; echo '数据表创建成功'echo '数据表创建失败:'.$conn->close();
结果如下:
@H_590_403@
下面建立一个简单的表单注册的前端页面,这里的表单页面很简单,用户名,密码,密码确认,注册邮箱等等几个简单的文本框。其代码如下:
<!DOCTYPE HTML> <html> <head> <Meta charset="utf-8"> <title>form</title> <style type="text/css"> *{margin:0px;padding:0px;} ul{ width:400px; list-style:none; margin:50px auto; } li{ padding:12px; position:relative; } label{ width:80px; display:inline-block; float:left; line-height:30px; } input[type='text'],input[type='password']{ height:30px; } img{ margin-left:10px; } input[type="submit"]{ margin-left:80px; padding:5px 10px; } </style> </head> <body> <form action="zhuce.PHP" method="post"> <ul> <li> <label>用户名:</label> <input type="text" name="username" placeholder="请输入注册账号"/> </li> <li> <label>密 码:</label> <input type="password" name="password" placeholder="请输入密码" /> </li> <li> <label>确认密码:</label> <input type="password" name="confirm" placeholder="请再次输入密码" /> </li> <li> <label>邮 箱:</label> <input type="text" name="email" placeholder="请输入邮箱"/> </li> <li> <input type="submit" value="注册" /> </li> </ul> </form> </body> </html>
页面如下:
将表单提交的数据都存入变量,然后进行密码和验证码的判断,都正确以后,将用户信息存入数据库并将数据库存放用户信息的表中所有数据提取打印出来。
<?PHP session_start(); header('Content-Type:text/html;charset=utf-8'); $link = MysqLi_connect('localhost',1)">if(!$linkdie('连接失败'.MysqLi_connect_error()); } 接收数据 $username = $_POST['username']; $password = $_POST['password'$confirm = $_POST['confirm'$_POST['email']; 检验数据 $username == '' || $password == '' || $confirm == '' || $email == ''echo "<script>alert('信息不能为空');window.location.href='test.PHP'</script>"elseif((strlen($username) < 3) || (!preg_match('/^\w+$/',1)">$username))){用户名 echo "<script>alert('用户名不小于3位且不包含非法字符,请重新填写');window.location.href='test.PHP'</script>"elseif($password) < 5){密码 echo "<script>alert('密码不小于5位,请重新填写');window.location.href='test.PHP'</script>"elseif($password != $confirm){重复密码 echo "<script>alert('两次密码不一致,请重新填写');window.location.href='test.PHP'</script>"elseif(!preg_match('/^[\w\.]+@\w+\.\w+$/i',1)">$email)){邮箱 echo "<script>alert('邮箱不合法,请重新填写');window.location.href='test.PHP'</script>"MysqLi_fetch_array(MysqLi_query($link,"select * from login where username = '$username'"))){用户名重复 echo "<script>alert('用户名已存在');window.location.href='test.PHP'</script>"{ 插入数据库 $sql = "insert into login(username,password,confirm,email) values('$username','$password',1)">$confirm',1)">$email')"; if($sql)){ echo '注册成功'; }{ echo "<script>alert('注册失败');window.location.href='test.PHP'</script>"; } }
结果如下: