当前位置:首页 > 探索

web网页连接mysql数据库

浏览器直接连MySQL?页连这事从技术上讲——不可能。前端JavaScript跑在用户的数据机器上,MySQL的页连3306端口只对后端服务器开放,你让浏览器去连数据库,数据等于让路人直接推开金库大门搬钱。页连但很多人第一次做Web项目时确实会冒出这个念头,数据我见过不止一个新手在HTML里写`mysql_connect()`,页连然后对着报错发呆。数据

正确的页连链路只有一条:浏览器发HTTP请求,后端服务器接收,数据后端再去查MySQL,页连把结果转成JSON丢回来。数据中间这层后端,页连你可以用PHP、数据Node.js、页连Python、Java,随便挑。选哪个不重要,重要的是理解这个隔离层的意义。

PHP方案:老派但管用

PHP配MySQL是经典组合,部署简单到令人发指。装个XAMPP,把下面这段代码存成api.php扔进htdocs目录,就能跑。

<?php header('Content-Type: application/json'); $conn = new mysqli('localhost', 'root', 'password', 'test_db'); if ($conn->connect_error) {  echo json_encode(['error' => 'connection failed']); exit; } $result = $conn->query('SELECT id, name FROM users LIMIT 10'); $rows = []; while ($row = $result->fetch_assoc()) {  $rows[] = $row; } echo json_encode($rows); $conn->close(); ?> 

前端这边一个fetch就完事:

fetch('/api.php') .then(res => res.json()) .then(data => console.log(data)); 

注意几个坑。数据库密码别用root裸奔,生产环境必须单独建用户、限制权限。还有,mysqli的预处理语句一定要用,直接拼SQL字符串等于把注入漏洞写在脸上。我见过一个后台系统,登录框输入' OR 1=1 --就能进管理员页面,就是因为PHP里在拼字符串。

Node.js方案:前后端统一语言

如果你本来就写JavaScript,用Node做中间层更顺手。装个mysql2包,代码大概长这样:

const express = require('express'); const mysql = require('mysql2/promise'); const app = express(); const pool = mysql.createPool({  host: 'localhost', user: 'app_user', password: 'your_password', database: 'test_db', waitForConnections: true, connectionLimit: 10 }); app.get('/api/users', async (req, res) => {  const [rows] = await pool.query('SELECT id, name FROM users LIMIT 10'); res.json(rows); }); app.listen(3000); 

连接池这个东西值得说一句。每次请求都新建一个MySQL连接,在高并发下会把数据库连接数打满。连接池维持一组长连接反复用,性能差距不是一点半点。我之前压测过一个接口,不用池子QPS跑到200就开始报Too many connections,换成池子直接上到1500。

安全边界不能省

后端接口暴露在外面,任何参数都可能是攻击载荷。几个硬性要求:数据库账号只给必要的库和表的权限,别用root;所有用户输入走参数化查询;接口加频率限制,防止有人拿脚本狂刷。CORS配置也别图省事写*,指定具体域名。

还有个容易忽略的点:错误信息不要原样返回给前端。数据库报错里可能包含表名、字段名甚至SQL语句片段,这些对攻击者来说是免费情报。统一返回“服务器错误”就够了,详细日志写进后端文件。

说到底,Web连MySQL的核心就是一句话:后端做桥,前端只跟后端说话。桥怎么搭、用什么材料搭,看你项目实际情况。但桥墩子——也就是安全措施——一根都不能少。

分享到: