PHP留言板

一.数据库启动(bd.php)

代码

php
1
2
3
4
5
6
7
8
9
10
11
<?php
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'ROIS_PHP';

$conn = new mysqli($host,$username,$password,$database);
if($conn->connect_error) {
die('Connection failed:'. $conn->connect_error);
}
?>

学习

四个配置没啥说的

创建$conn对象实现MySQL数据库操作:new mysqli()

connect_error是$conn的一个属性

二.注册账户(register.php)

代码

php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
session_start();
require_once 'db.php';

if($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);

$stmt = $conn->prepare('INSERT INTO users (username, password) values (?, ?)');
$stmt->bind_param('ss', $username, $password);

if($stmt->execute()) {
//echo 'Registration successful. <a href="login.php">Login</a>';
header('Location: login.php');
} else {
echo 'Registration failed. Please try again.';
}

$stmt->close();
}
?>


<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>REGISTER</title>
<style>
body{
text-align: center;
background-image: url("./1.jpg");
background-size: auto 870px;
}
</style>
</head>
<body>
<h1>也许你想要一个账号</h1>
<form method="post" action="">
你想要个名字:<input type="text" name="username" required>
你又多了个蜜🐎:<input type="password" name="password" required>
<input type="submit" value="点我一下">
</form><br>
<a href="login.php">登入哦</a>
</body>
</html>

学习

session_start()函数开启或恢复会话,之后可以使用$_SESSION超全局数组

require_once 是 PHP 中用于包含文件的语句,它确保被包含的文件在整个脚本执行过程中只被包含一次,即使在多个地方调用也不会重复包含。

password_hash($pwd, method),使密码哈希化,保证密码安全

预编译:

准备:$stmt = $conn->prepare($str); 其中变量部分用 ? 占位

插入:$stmt->bind_param(‘model’, var1,···,varn);

执行:$stmt->excute();

绑定:$stmt->bind_result($a,$b,···);

传递:$stmt->fetch;

关闭:$stmt->close();

header(‘Location: example.php’)

header() 函数是 PHP 中用于发送原始的 HTTP 头的函数。它通常用于在服务器端发送 HTTP 头信息,如设置重定向、设置页面编码、设置缓存控制等。这些头信息会在服务器响应浏览器请求时一同发送给浏览器。

基本的语法为:

plaintext
1
2
phpCopy code
header(header, replace, http_response_code);
  • header 要发送的头信息,形式为 “header_name: header_value”。例如,header('Content-Type: text/html'); 表示设置响应内容的类型为 HTML。
  • replace 一个可选的布尔参数,指示是否替换之前相同头的值。默认是 true,表示替换;如果设置为 false,则会追加到之前相同头的值后面。
  • http_response_code 一个可选的 HTTP 响应状态码。如果提供了该参数,它会替代之前设置的响应状态码。

三.登入账户(login.php)

代码

php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
session_start();
require_once 'db.php';

if($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];

$stmt = $conn->prepare('SELECT id, username, password FROM users WHERE username=?');
$stmt->bind_param('s', $username);
$stmt->execute();//启动
$stmt->bind_result($id, $username, $hash_password);
$stmt->fetch();

if(password_verify($password, $hash_password)) {
$_SESSION['username'] = $username;
$_SESSION['user_id'] = $id;
header('Location: message.php');
exit();//终止脚本运行
} else {
echo '总有一个错了吧,高考不会给你机会哈哈哈哈哈······';
}

$stmt->close();
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<style>
body{
text-align: center;
background-image: url("./1.jpg");
background-size: auto 870px;
}
</style>
</head>
<body>
<h1>看来你是想进来看看的,帅气的我答应了</h1>
<form action="" method="post">
你有个名字:<input type="text" name="username">
你的蜜🐎呢:<input type="password" name="password">
<input type="submit" value="点我一下">
</form>
<br>
<a href="register.php">注册一个呗</a>
</body>
</html>

学习

哈希密码验证:password_verify($password, $hash_password)

语法:bool password_verify ( string $password , string $hash )

password_verify() 函数用于验证密码是否和散列值匹配。

  • password: 用户的密码。
  • 散 列: 一个由 password_hash() 创建的散列值。

留言(message.php)

代码

php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
session_start();
require_once 'db.php';

if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit();
}

if($_SERVER['REQUEST_METHOD'] == 'POST') {
$user_id = $_SESSION['user_id'];
$message = htmlspecialchars($_POST['message']);
$to_user = htmlspecialchars($_POST['to_user']);
$username = $_SESSION['username'];
$stmt = $conn->prepare('INSERT INTO messages (user_id, message, to_user, post_user) VALUES (?, ?, ?, ?)');
$stmt->bind_param('isss', $user_id, $message, $to_user, $username);

if ($stmt->execute()) {
echo '我记住了';
} else {
echo "你失败了,反正不是我的原因";
}

$stmt->close();
}
?>

<!DOCTYPE HTML>
<html>
<meta charset="UTF-8">
<title>MESSAGE</title>
<style>
body{
text-align: center;
background-image: url("./1.jpg");
background-size: auto 870px;
}
</style>
<body>
<h2>Welcome, <?php echo htmlspecialchars($_SESSION['username']);?></h2>
<form action="" method="post">
写给谁:<select name="to_user">
<?php
$usernames = $conn->query('SELECT username FROM users');
while($row = $usernames->fetch_assoc()) {
echo '<option value="' . $row['username'] . '">' . $row['username'] . '</option>';
} ?>
</select>
<br><br>
<label for="message">写什么:</label>
<textarea name="message" required></textarea>
<input type="submit">
</form>


<h3>康康大家给你的留言</h3>
<?php
$stmt_1 = $conn->prepare('SELECT message, post_user FROM messages WHERE to_user = ?');
$stmt_1->bind_param('s', $_SESSION['username']);
$stmt_1->execute();
$result = $stmt_1->get_result();
while ($row = $result->fetch_assoc()) {
echo htmlspecialchars($row['post_user']).':';
echo htmlspecialchars($row['message']).'<br>';}
$result->close();
?>
<br>
<h3>公共留言</h3>
<?php
$str = "SELECT message, post_user FROM messages WHERE to_user = '全部'";
$result = $conn->query($str);
while ($row = $result->fetch_assoc()) {
echo htmlspecialchars($row['post_user']).':';
echo htmlspecialchars($row['message']).'<br>';}
$result->close();
?>
<br>
<a href="logout.php">也许你想退出了</a>
</body>
</html>

学习

细讲一下:

php
1
2
3
4
5
<?php
$usernames = $conn->query('SELECT username FROM users');
while($row = $usernames->fetch_assoc()) {
echo '<option value="' . $row['username'] . '">' . $row['username'] . '</option>';
} ?>

fetch_assoc()函数:

fetch_assoc() 是 PHP 中用于从数据库中获取关联数组的函数。这个函数通常与 MySQLi(MySQL Improved)扩展一起使用,用于执行查询并返回结果集中的下一行作为关联数组。

echo:

echo可以用来实现PHP与HTML的拼接,因为echo的字符串输出在HTML文档,会执行相关的操作。

htmlspecialchars():

htmlspecialchars 是一个用于在处理 HTML 输出时防止跨站脚本攻击(XSS)的 PHP 函数。该函数将字符串中的特殊字符转换为对应的 HTML 实体,从而确保这些字符不被解释为 HTML 标记,而是以原始的文本形式显示在页面上。

注销账户(logout.php)

代码

plaintext
1
2
3
4
5
6
7
<?php
session_start();
session_unset();
session_destroy();
header("Location: login.php");
exit();
?>

学习

  1. session_start();: 开始或恢复会话。在使用会话功能之前,必须先调用此函数,以确保能够使用 $_SESSION 变量来存储和检索会话数据。
  2. session_unset();: 释放 $_SESSION 变量中的所有会话数据。这并不会结束会话,只是清空会话数据,以确保用户在下次访问时不再保持之前的会话状态。
  3. session_destroy();: 销毁会话。此函数会删除服务器上存储的会话文件,并且将会话 cookie 设置为过期。这意味着当前用户的会话已经结束,下次访问时将会创建一个新的会话。
  4. header("Location: login.php");: 发送一个原始的 HTTP 头信息,用于重定向浏览器到指定的 URL(在这里是 login.php)。这会告诉浏览器去访问新的页面。
  5. exit();: 立即终止脚本的执行。在这里,它确保在重定向之后不会执行任何额外的代码。