PHP留言板
一.数据库启动(bd.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)
代码
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()) { 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 头信息,如设置重定向、设置页面编码、设置缓存控制等。这些头信息会在服务器响应浏览器请求时一同发送给浏览器。
基本的语法为:
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)
代码
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() 函数用于验证密码是否和散列值匹配。
留言(message.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>
|
学习
细讲一下:
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)
代码
1 2 3 4 5 6 7
| <?php session_start(); session_unset(); session_destroy(); header("Location: login.php"); exit(); ?>
|
学习
session_start();
: 开始或恢复会话。在使用会话功能之前,必须先调用此函数,以确保能够使用 $_SESSION
变量来存储和检索会话数据。
session_unset();
: 释放 $_SESSION
变量中的所有会话数据。这并不会结束会话,只是清空会话数据,以确保用户在下次访问时不再保持之前的会话状态。
session_destroy();
: 销毁会话。此函数会删除服务器上存储的会话文件,并且将会话 cookie 设置为过期。这意味着当前用户的会话已经结束,下次访问时将会创建一个新的会话。
header("Location: login.php");
: 发送一个原始的 HTTP 头信息,用于重定向浏览器到指定的 URL(在这里是 login.php
)。这会告诉浏览器去访问新的页面。
exit();
: 立即终止脚本的执行。在这里,它确保在重定向之后不会执行任何额外的代码。