HTML页面与数据库交互原理
HTML是静态标记语言,无法直接操作数据库,需通过以下流程实现:
基础实现示例(PHP+MySQL)
数据库准备
CREATE DATABASE user_db; USE user_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(255) NOT NULL );
后端连接代码(PHP)
<?php $host = 'localhost'; $user = 'root'; $pass = 'password'; $db = 'user_db'; // 创建连接 $conn = new mysqli($host, $user, $pass, $db); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 处理前端请求 $action = $_POST['action'] ?? ''; if ($action == 'register') { $username = $conn->real_escape_string($_POST['username']); $password = password_hash($_POST['password'], PASSWORD_BCRYPT); $sql = "INSERT INTO users (username, password) VALUES ('$username', '$password')"; if ($conn->query($sql) === TRUE) { echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'error', 'message' => $conn->error]); } } $conn->close(); ?>
前端请求代码(JavaScript)
document.getElementById('registerBtn').addEventListener('click', () => { const username = document.getElementById('username').value; const password = document.getElementById('password').value; fetch('api.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'register', username, password }) }) .then(response => response.json()) .then(data => { if (data.status === 'success') { alert('注册成功'); } else { alert('错误: ' + data.message); } }); });
安全注意事项
风险类型 | 防范措施 |
---|---|
SQL注入 | 使用预编译语句(如PDO)或ORM框架 |
密码明文存储 | 采用bcrypt/argon2等加密算法哈希密码 |
CSRF攻击 | 添加CSRF令牌验证 |
XSS攻击 | 对用户输入进行HTML实体编码 |
敏感信息泄露 | 使用HTTPS传输,数据库连接信息存入环境变量 |
常见问题解决方案
问题现象 | 解决方案 |
---|---|
跨域请求被阻止 | 后端设置CORS头:header('Access-Control-Allow-Origin: '); |
数据库连接超时 | 检查持久连接设置,优化查询语句,增加mysqli_options 中的超时参数 |
JSON数据解析失败 | 确保后端使用header('Content-Type: application/json') 并输出有效JSON |
中文乱码问题 | 设置数据库字符集:SET NAMES utf8mb4 ,前端声明<meta charset="UTF-8"> |
相关问题与解答
Q1:如何选择前端与数据库的通信方式?
解答:根据项目需求选择:
- 建立索引:对高频查询字段创建B+Tree/Hash索引
- 查询缓存:启用Redis/Memcached缓存频繁查询结果
- 连接池:使用数据库连接池(如HikariCP/DBCP)复用连接
- 读写分离:主从复制架构分散读写压力
- 分库分表:按业务维度拆分数据库(如订单库/