网站怎么连接数据库
打开一个网页,网站你看到的连接是HTML、CSS和JavaScript在浏览器里跑。数据但数据——用户信息、网站商品列表、连接评论内容——全在服务器那头的数据数据库里躺着。网站怎么把这两头接上的网站?靠后端代码。没有后端,连接前端就是数据个空壳。 比如你登录一个网站,网站输入邮箱和密码,连接点“登录”。数据浏览器把这两个值打包成一个HTTP请求,网站发给服务器。连接服务器上跑着PHP、数据Python、Node.js或者Java代码,它收到请求后,要去数据库里查:这个邮箱存在吗?密码哈希对得上吗? 数据库不是随便连的。以MySQL为例,后端代码里通常会写这么一行(PHP): 这行代码干了什么?它告诉PHP:去本机找MySQL,用指定用户名密码登录,选中叫mydb的库。连上之后,才能发SQL语句。比如: 注意,这里直接把变量塞进SQL里,是危险的。有人输入 这样数据库先编译SQL结构,再填值,注入就失效了。我见过不少小网站图省事,直接拼字符串,结果被拖库。去年有个电商站,就是因为评论框没过滤,攻击者用SQL注入把用户表全导走了。 连数据库不只有MySQL。PostgreSQL、MongoDB、Redis,各有各的连法。Node.js里用MongoDB,常见的是Mongoose: 这里没有SQL,用的是对象模型。MongoDB存的是BSON,类似JSON。适合字段不固定的场景,比如日志、爬虫数据。 再说连接池。每次请求都新建一个数据库连接,开销很大。一个连接要TCP握手、认证、分配内存。网站流量一上来,数据库直接被打满。所以生产环境用连接池。比如Java的HikariCP,配置好最小最大连接数,请求来了从池里借,用完还回去。我见过一个日活十万的站,没配连接池,MySQL的max_connections调到1000还是不够,后来加了池,降到50就稳了。 还有一层:ORM。像Django的Model、Spring Data JPA,让你用Python或Java对象操作数据库,不用手写SQL。方便,但容易写出N+1查询。比如查所有订单,再循环查每个订单的用户,就是1次加N次查询。数据库往返几百回,页面卡死。得用select_related或join fetch预加载。 安全方面,数据库连接串不能硬编码在代码里。有人把密码写在GitHub上,结果数据库被挖矿。正确做法是用环境变量: 代码里读 最后,连不上怎么办?常见错误: 所以,网站连数据库,核心就三步:后端代码用驱动建立连接,通过SQL或ORM发查询,拿结果返回给前端。中间要管连接池、防注入、藏密码。每一步出问题,网站就白屏。$conn = new mysqli("localhost", "user", "pass", "mydb"); $result = $conn->query("SELECT * FROM users WHERE email='$email'"); ' OR '1'='1,就能绕过密码。所以实际项目里用预处理语句:$stmt = $conn->prepare("SELECT * FROM users WHERE email=?"); $stmt->bind_param("s", $email); $stmt->execute(); mongoose.connect('mongodb://localhost/mydb'); const User = mongoose.model('User', { name: String }); User.find({ name: '张三' }).then(users => console.log(users)); DB_HOST=localhost DB_USER=app DB_PASS=xxxx process.env.DB_PASS。部署时通过CI/CD注入。另外,数据库端口不要对公网开放。只允许后端服务器IP访问。我扫过一些IP段,3306端口直接暴露的MySQL不少,弱密码一猜就中。ECONNREFUSED——数据库没启动,或者防火墙挡了。ER_ACCESS_DENIED_ERROR——用户名密码错。ER_BAD_DB_ERROR——库名写错。看日志,别瞎猜。后端代码里加个重试和超时,别让一个数据库抖动拖垮整个网站。
-
上一篇
-
下一篇