Web应用基础

PHP表单

PHP超级全局变量

什么是PHP超级全局变量

  • PHP中预定义了几个超级全局变量(super globals)
  • 在一个脚本的全部作用域中都可用,不需要特别说明,就可以在函数及类中使用

PHP接收表单数据

$_GET、$POST和$_REQUEST

  • $POST接受所有以post方式发送的请求
  • $_GET接受所有以get方式发送的请求
  • $_REQUEST接受get和post方式发送的请求,但是比较慢

表单get请求

表单提交方式为get请求

  • 创建login.html,关键内容如下
1
2
3
4
5
6
<meta charset="utf-8">
<form action="login.php" method="get">
账户:<input type="text" name="uname">
密码:<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
  • 创建login.php文件,内容如下
1
2
3
4
5
<?php
header("content-type:text/html;charset=utf-8");
echo "账户:".$_GET['uname']."<br>";
echo "密码:".$_GET['pwd']."<br>";
?>

表单post请求

表单提交方式为post请求

  • 修改login.html文件,将提交方式修改为post
1
2
3
4
5
6
<meta charset="utf-8">
<form action="login.php" method="post">
账户:<input type="text" name="uname">
密码:<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
  • 修改login.php文件,使用$_POST接收数据
1
2
3
4
5
<?php
header("content-type:text/html;charset=utf-8");
echo "账户:".$_POST['uname']."<br>";
echo "密码:".$_POST['pwd']."<br>";
?>

为空验证

为了提高安全性,通常需要对用户的表单输入做验证和处理

必需字段

  • 如果是必需字段,可以使用empty函数做验证
1
2
3
4
5
if(empty($_POST["username"])){
$nameErr = '必须填写用户名';
}else{
$username = $_POST["username"];
}

正则验证

正则匹配

如果需要精确验证,可以使用preg_match()函数进行正则匹配

  • 案例:验证名称只能包含字母和空格
1
2
3
4
$username = $_POST["username"];
if(!preg_match("/^[a-zA-Z]*$/",$username)){
$nameErr = '用户名只允许字母和空格'
}

数据处理

对输入的数据处理

  • trim()函数去除用户输入数据中不必要的字符(如:空格,tab,换行)
  • stripslashes()函数去除用户输入数据中的反斜杠(\)
  • htmlspecialchar()函数把一些预定义的字符转换为HTML实体
1
2
3
4
5
6
7
8
9
10
11
$data = 'NTD 123';
echo '|'.$data.'|<br>';
echo '|'.trim($data).'|<br>';

$data = 'NTD\123';
echo '|'.$data.'|<br>';
echo '|'.stripslashes($data).'|<br>';

$data = '<script>alert(123)</script>';
echo '|'.$data.'|<br>';
echo '|'.htmlspecialchars($data).'|<br>';

PHP Cookie和Session

PHP超级全局变量

S_COOKIE和$_SESSION

  • Cookie和Session都是为了保存会话状态
  • $_COOKIE保存设置的cookie值
  • $_SESSION保存和设置session值

PHP Cookie介绍

  • HTTP协议本身是无状态的
  • Cookie是保存会话状态的一种方式
  • Cookie服务器将数据存储在客户端浏览器中

PHP Cookie的使用

创建cookie

  • setcookie()函数用于设置cookie
  • setcookie()函数必须位于<html>标签之前
  • 如果成功,该函数返回true,如果失败则返回false

语法

1
setcookie(name,value,expire)

参数说明

  • name:必选,cookie的名称
  • value:必选,cookie的值
  • expire:可选,cookie的过期时间,默认浏览器关闭后失效

案例

1
2
3
<?php
setcookie("username","ntd",time()+3600);
?>

获取cookie

  • PHP的$_COOKIE变量用于取回cookie的值

在获取前,可以使用isset()函数来确认是否已设置了cookie

1
2
3
4
5
<?php
if(isset($_COOKIE['username'])){
echo '欢迎'.$_COOKIE['username'];
}
?>

删除cookie

  • 通过设置cookie的时间为过去的时间点来删除cookie
1
2
3
4
<?php
// 设置cookie过期时间为过去一小时
setcookie('username','',time()-3600);
?>

PHP Session介绍

  • HTTP协议本身是无状态的
  • Session是另外一种保存会话状态的方式
  • Session将数据存储在服务器端
  • 与Cookie相比,数据相对安全
  • 与Cookie相比,可以存储比较多的数据

PHP Session的使用

启动会话

  • 必须先启动会话,然后才可以使用Session
  • session_start()函数用于启动会话
  • session_start()函数必须位于html标签之前
1
2
3
<?php
session_start();
?>

设置和获取Session

  • 设置和获取Session,都是通过PHP $_SESSION变量实现
1
2
3
4
5
6
7
<?php
session_start();
$_SESSION['name']='tedu';
if(isset($_SESSION['name'])){
$name = $_SESSION['name'];
}
?>

销毁和删除Session

  • 删除某些session数据,可以使用unset()或session_destroy()函数
  • unset()函数用于释放指定的session变量
  • session_destroy()函数用于彻底销毁session
1
2
3
4
5
6
7
<?php
session_start();
if(isset($_SESSION['name'])){
unset($_SESSION['name']);
session_destroy();
}
?>

PHP访问MySQL数据库

PHP访问MySQL数据库

  • 通过PHP,可以连接和操作数据库
  • MySQL是跟PHP配套使用的最流行的开源数据库系统
  • MySQL是非常快速,可靠,且易于使用的

MySQLi介绍

  • MySQLi extension(“ i “ 意为improved)MySQL扩展
  • MySQLi 只针对MySQL数据库
  • MySQLi是面向对象的,但也提供了API 接口
  • MySQLi支持预处理语句

MySQLi使用

创建mysqli连接对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// 连接数据库服务器
/*
method:
数据库服务器IP地址;
数据库登录账号;
登录密码;
数据库名;
**/
$conn = new mysqli('127.0.0.1','root','root','ntd');
if($conn->connect_error){
die('数据库连接失败<br>');
}
?>

使用query()方法插入数据

1
2
3
4
$sql = "insert into user(name,pwd) values('admin','123456')";
if($conn->query($sql)){
echo '插入数据成功<br>';
}

使用query()方法更新数据

1
2
3
4
$sql = "update user set pwd='456789' where name = 'admin'";
if($conn->query($sql)){
echo '修改数据成功<br>';
}

使用query()方法删除数据

1
2
3
4
$sql = "delete from user where id = 1";
if($conn->query($sql)){
echo '删除数据成功<br>';
}

使用query()方法查询数据

1
2
3
4
5
6
7
8
9
10
11
$sql = "select id,name,pwd from user";
// 获取查询结果,是一个对象

$result = $conn->query($sql);
if($result->num_rows>0){
while($row=$result->fetch_assoc()){
echo $row['id'],$row['name'],$row['pwd'],'<br>';
}
}else{
echo '数据为空<br>';
}

关闭数据库

1
$conn->close();

总结

  • 使用query()函数执行增删改操作返回bool值,表示执行是否成功
  • 使用query()函数执行查询操作返回结果集,从结果集中获取数据

MySQLi的预处理

为什么要使用预处理?

  • 预处理语句用于执行多个相同的SQL语句,并且执行效率更高
  • 预处理语句对于防止MySQL注入是非常有用的

预处理的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 预处理及绑定
$stmt = $conn -> prepare("insert into user (name,pwd) values (?,?)");
$stmt -> bind_param("ss",$username,$userpwd);
// 设置参数并执行
$username = 'ntd1';
$userpwd = '123456';
$stmt -> execute();

$username = 'ntd2';
$userpwd = '123456';
$stmt -> execute();

echo '插入成功<br>';
$stmt -> close();
$conn -> close();

代码解析

1
"insert into user (name,pwd) values (?,?)"

在 SQL 语句中,我们使用了问号(?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。

1
$stmt -> bind_param("ss",$username,$userpwd);
  • 该函数绑定了SQL的参数,且告诉数据库参数的值

参数有以下四种类型:

  • i - integer(整形)
  • d - double(双精度浮点型)
  • s - string(字符串)
  • b - BLOG(binary large object:二进制大对象)

每个参数都需要指定类型

  • 通过告诉数据库参数的数据类型,可以降低SQL注入的风险