PHP知识点——2
2016-02-21 22:26
585 查看
表单处理:
写法:
<html>
<body>
<form action="welcome.php"method="post">
Name: <input type="text"name="fname">
Age: <input type="text"name="age">
<input type="submit">
</form>
</body>
</html>
Welcome.php文件:
<html>
<body>
Welcome <?php echo$_POST["fname"]; ?>!<br>
You are <?php echo $_POST["age"];?> years old.
</body>
</html>
注意:加了entype=”text/plain”后会收不到数据。
表单验证:
应该在任何可能的时候对用户输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的负载。
如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。
<form method="post" action="<?php echohtmlspecialchars($_SERVER["PHP_SELF"]);?>">
$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,会发送表单数据到当前页面,而不是跳转到不同的页面。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML
实体。
预定义的字符是:
· &
(和号)成为 &
· "
(双引号)成为 "
· '
(单引号)成为 '
· <
(小于)成为 <
· >
(大于)成为 >
通过 htmlspecialchars()
函数来避免被利用$_SERVER["PHP_SELF"]
变量有可能会被黑客使用!当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。 任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上等。
htmlspecialchars() 把一些预定义的字符转换为 HTML
实体。现在如果用户想利用 PHP_SELF
变量,
结果将输出如下所示:
<formmethod="post" action="test_form.php/"><script>alert('hacked')</script>">
又如:
当我们使用htmlspecialchars()
函数时,在用户尝试提交以下文本域:
<script>location.href('http://www.runoob.com')</script>
- 该代码将不会被执行,因为它会被保存为HTML转义代码,如下所示:
<script>location.href('http://www.runoob.com')</script>
以上代码是安全的,可以正常在页面显示或者插入邮件中。
当用户提交表单时,我们将做以下两件事情,:
1. 使用 PHP trim()
函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
2. 使用PHP stripslashes()函数去除用户输入数据中的反斜杠 (\)
<?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;
}
?>
必需字段写法:
…
if (empty($_POST["name"])) //使用php的
empty() 函数是否为空
{$nameErr = "Name isrequired";}
else
{$name = test_input($_POST["name"]);}
…
Name:<input type="text" name="name">
<span class="error">* <?phpecho $nameErr;?></span>
…
结合正则表达式进行格式判定:
preg_match — 进行正则表达式匹配
<?php
// 定义变量并设为空值
$nameErr = $emailErr = $genderErr = $websiteErr= "";
$name = $email = $gender = $comment = $website ="";
if ($_SERVER["REQUEST_METHOD"] =="POST")
{
if (empty($_POST["name"]))
{$nameErr = "Name isrequired";}
else
{
$name =test_input($_POST["name"]);
// check if name onlycontains letters and whitespace
if(!preg_match("/^[a-zA-Z ]*$/",$name))
{
$nameErr ="Only letters and white space allowed";
}
}
if (empty($_POST["email"]))
{$emailErr = "Email isrequired";}
else
{
$email =test_input($_POST["email"]);
// check if e-mail addresssyntax is valid
if(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr ="Invalid email format";
}
}
if (empty($_POST["website"]))
{$website = "";}
else
{
$website = test_input($_POST["website"]);
// check if URL addresssyntax is valid (this regular expression also allows dashes in the URL)
if(!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
{
$websiteErr ="Invalid URL";
}
}
if (empty($_POST["comment"]))
{$comment = "";}
else
{$comment =test_input($_POST["comment"]);}
if (empty($_POST["gender"]))
{$genderErr = "Gender isrequired";}
else
{$gender = test_input($_POST["gender"]);}
}
?>
综合实例,html加php写在同一个php文件即可。
$_GET:
预定义的 $_GET
变量用于收集来自 method="get"
的表单中的值。
从带有 GET
方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
在 HTML
表单中使用 method="get"
时,所有的变量名和值都会显示在 URL
中。
http://www.w3cschool.cc/welcome.php?fname=Peter&age=37
注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL
中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
注释:HTTP GET
方法不适合大型的变量值。它的值是不能超过 2000
个字符的。
$_POST:
预定义的 $_POST
变量用于收集来自 method="post"
的表单中的值。
从带有 POST
方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。然而,由于变量不显示在 URL
中,所以无法把页面加入书签。
注释:然而,默认情况下,POST
方法的发送信息的量最大值为 8 MB(可通过设置 php.ini
文件中的 post_max_size
进行更改)。
预定义的 $_REQUEST
变量包含了 $_GET、$_POST
和 $_COOKIE
的内容。
$_REQUEST 变量可用来收集通过 GET
和 POST
方法发送的表单数据。
写法:
<html>
<body>
<form action="welcome.php"method="post">
Name: <input type="text"name="fname">
Age: <input type="text"name="age">
<input type="submit">
</form>
</body>
</html>
Welcome.php文件:
<html>
<body>
Welcome <?php echo$_POST["fname"]; ?>!<br>
You are <?php echo $_POST["age"];?> years old.
</body>
</html>
注意:加了entype=”text/plain”后会收不到数据。
表单验证:
应该在任何可能的时候对用户输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的负载。
如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。
<form method="post" action="<?php echohtmlspecialchars($_SERVER["PHP_SELF"]);?>">
$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,会发送表单数据到当前页面,而不是跳转到不同的页面。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML
实体。
预定义的字符是:
· &
(和号)成为 &
· "
(双引号)成为 "
· '
(单引号)成为 '
· <
(小于)成为 <
· >
(大于)成为 >
通过 htmlspecialchars()
函数来避免被利用$_SERVER["PHP_SELF"]
变量有可能会被黑客使用!当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。 任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上等。
htmlspecialchars() 把一些预定义的字符转换为 HTML
实体。现在如果用户想利用 PHP_SELF
变量,
结果将输出如下所示:
<formmethod="post" action="test_form.php/"><script>alert('hacked')</script>">
又如:
当我们使用htmlspecialchars()
函数时,在用户尝试提交以下文本域:
<script>location.href('http://www.runoob.com')</script>
- 该代码将不会被执行,因为它会被保存为HTML转义代码,如下所示:
<script>location.href('http://www.runoob.com')</script>
以上代码是安全的,可以正常在页面显示或者插入邮件中。
当用户提交表单时,我们将做以下两件事情,:
1. 使用 PHP trim()
函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
2. 使用PHP stripslashes()函数去除用户输入数据中的反斜杠 (\)
<?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;
}
?>
必需字段写法:
…
if (empty($_POST["name"])) //使用php的
empty() 函数是否为空
{$nameErr = "Name isrequired";}
else
{$name = test_input($_POST["name"]);}
…
Name:<input type="text" name="name">
<span class="error">* <?phpecho $nameErr;?></span>
…
结合正则表达式进行格式判定:
preg_match — 进行正则表达式匹配
<?php
// 定义变量并设为空值
$nameErr = $emailErr = $genderErr = $websiteErr= "";
$name = $email = $gender = $comment = $website ="";
if ($_SERVER["REQUEST_METHOD"] =="POST")
{
if (empty($_POST["name"]))
{$nameErr = "Name isrequired";}
else
{
$name =test_input($_POST["name"]);
// check if name onlycontains letters and whitespace
if(!preg_match("/^[a-zA-Z ]*$/",$name))
{
$nameErr ="Only letters and white space allowed";
}
}
if (empty($_POST["email"]))
{$emailErr = "Email isrequired";}
else
{
$email =test_input($_POST["email"]);
// check if e-mail addresssyntax is valid
if(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr ="Invalid email format";
}
}
if (empty($_POST["website"]))
{$website = "";}
else
{
$website = test_input($_POST["website"]);
// check if URL addresssyntax is valid (this regular expression also allows dashes in the URL)
if(!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
{
$websiteErr ="Invalid URL";
}
}
if (empty($_POST["comment"]))
{$comment = "";}
else
{$comment =test_input($_POST["comment"]);}
if (empty($_POST["gender"]))
{$genderErr = "Gender isrequired";}
else
{$gender = test_input($_POST["gender"]);}
}
?>
综合实例,html加php写在同一个php文件即可。
$_GET:
预定义的 $_GET
变量用于收集来自 method="get"
的表单中的值。
从带有 GET
方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
在 HTML
表单中使用 method="get"
时,所有的变量名和值都会显示在 URL
中。
http://www.w3cschool.cc/welcome.php?fname=Peter&age=37
注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL
中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
注释:HTTP GET
方法不适合大型的变量值。它的值是不能超过 2000
个字符的。
$_POST:
预定义的 $_POST
变量用于收集来自 method="post"
的表单中的值。
从带有 POST
方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。然而,由于变量不显示在 URL
中,所以无法把页面加入书签。
注释:然而,默认情况下,POST
方法的发送信息的量最大值为 8 MB(可通过设置 php.ini
文件中的 post_max_size
进行更改)。
预定义的 $_REQUEST
变量包含了 $_GET、$_POST
和 $_COOKIE
的内容。
$_REQUEST 变量可用来收集通过 GET
和 POST
方法发送的表单数据。
相关文章推荐
- PHP知识点——1
- PHP之代码片段收集
- PHP2
- PHP面向对象魔术方法总结
- php面向对象魔术方法总结
- Php函数安全Windows系列之FindFirstFile
- php cookie用法之 setcookie()函数
- PHP中常量和变量的区别
- PHP小集锦(二)数组去除空值
- php课程---随机数
- php实现上传图片保存到数据库的方法
- php课程---Ajax(老师详解)
- file_get_contents("php://input")的使用方法
- php大文件上传php.ini配置
- php课程---初学PDO
- TP:CF71BDB9
- php课程---练习(联系人信息表)
- 阿里云服务器中FTP以及Navicat的使用(自己用)
- php课程---练习(发布新闻)
- PHP Database ODBC 之 ODBC