如何创建运行自定义数据库及实现宠物站货币系统数据库操作?
我来一步步帮你解决这两个问题,都是PHP+数据库开发里的基础但关键的点:
1. 创建并运行自定义数据库的完整流程
咱们用最常用的MySQL/MariaDB + PHP组合来实现,这也是你宠物网站最适配的技术栈:
第一步:准备数据库环境
本地开发的话,直接装XAMPP或者WAMP,自带MySQL、PHP和phpMyAdmin(可视化管理工具);线上部署的话,找你的主机服务商提供的数据库管理面板(一般都有phpMyAdmin)。第二步:创建数据库
打开phpMyAdmin,输入数据库名(比如pet_website),点击「创建」就行;或者用SQL命令执行:CREATE DATABASE pet_website;第三步:创建业务需要的表
比如先创建用户表(货币数据可以存在这里,小项目合并更方便,不用单独建货币表):USE pet_website; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, -- 用户唯一ID username VARCHAR(50) NOT NULL UNIQUE, -- 用户名 coins INT DEFAULT 50, -- 初始货币50,和你之前的硬编码对应 created_at DATETIME DEFAULT CURRENT_TIMESTAMP );第四步:PHP连接数据库
推荐用PDO(比mysqli更安全、灵活),创建一个db_connect.php文件:<?php $host = 'localhost'; // 本地是localhost,线上看主机配置 $dbname = 'pet_website'; $username = 'root'; // 本地默认root,线上用主机给的用户名 $password = ''; // 本地默认空,线上填主机给的密码 try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("数据库连接失败: " . $e->getMessage()); } ?>
2. 货币系统的数据库实现方案(替代硬编码)
你之前的$coin=50是固定值,没法区分不同用户,也没法持久化,现在改成数据库存储后,就能实现每个用户独立的货币数据,并且支持增减操作:
核心逻辑梳理
用户点击物品→后端验证用户身份+货币余额→执行增减操作→返回结果给前端
具体实现步骤
先确保用户已登录(获取用户ID)
你需要有登录逻辑,把用户ID存在Session里,比如登录成功后:session_start(); $_SESSION['user_id'] = $user_id; // 从数据库查询到的当前登录用户ID查询用户当前货币
在需要展示货币的页面,引入db_connect.php后查询:session_start(); require 'db_connect.php'; if (!isset($_SESSION['user_id'])) { die("请先登录"); } $user_id = $_SESSION['user_id']; $stmt = $pdo->prepare("SELECT coins FROM users WHERE id = ?"); $stmt->execute([$user_id]); $user = $stmt->fetch(PDO::FETCH_ASSOC); $current_coins = $user['coins']; echo "当前货币: " . $current_coins;实现货币增减操作(比如购买道具扣币)
创建一个update_coins.php处理请求:session_start(); require 'db_connect.php'; if (!isset($_SESSION['user_id']) || !isset($_POST['action'])) { echo json_encode(['success' => false, 'msg' => '参数错误']); exit; } $user_id = $_SESSION['user_id']; $action = $_POST['action']; // 比如'add'或'deduct' $amount = (int)$_POST['amount']; try { // 开启事务,保证数据一致性 $pdo->beginTransaction(); if ($action === 'deduct') { // 先检查余额是否足够 $stmt = $pdo->prepare("SELECT coins FROM users WHERE id = ?"); $stmt->execute([$user_id]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user['coins'] < $amount) { throw new Exception("余额不足"); } $sql = "UPDATE users SET coins = coins - ? WHERE id = ?"; } else if ($action === 'add') { $sql = "UPDATE users SET coins = coins + ? WHERE id = ?"; } else { throw new Exception("无效操作"); } $stmt = $pdo->prepare($sql); $stmt->execute([$amount, $user_id]); $pdo->commit(); // 返回更新后的余额 $stmt = $pdo->prepare("SELECT coins FROM users WHERE id = ?"); $stmt->execute([$user_id]); $new_coins = $stmt->fetchColumn(); echo json_encode(['success' => true, 'new_coins' => $new_coins]); } catch(Exception $e) { $pdo->rollBack(); echo json_encode(['success' => false, 'msg' => $e->getMessage()]); }前端点击事件(用AJAX异步更新)
比如页面上的购买按钮:<div>当前货币: <span id="coins-display"><?php echo $current_coins; ?></span></div> <button class="buy-item" data-cost="10">购买宠物零食(10币)</button> <script> document.querySelectorAll('.buy-item').forEach(button => { button.addEventListener('click', async () => { const cost = parseInt(button.dataset.cost); const response = await fetch('update_coins.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: `action=deduct&amount=${cost}` }); const result = await response.json(); if (result.success) { document.getElementById('coins-display').textContent = result.new_coins; alert('购买成功!'); } else { alert(result.msg); } }); }); </script>
关键注意事项
- SQL注入防护:全程用PDO的预处理语句(
prepare+execute绑定参数),绝对不要直接把用户输入拼到SQL里。 - 用户身份验证:必须通过Session验证用户ID,不能让用户随便修改别人的货币。
- 事务处理:在更新货币时开启事务,避免中途出错导致数据不一致。
内容的提问来源于stack exchange,提问作者EchoDino
相关产品推荐
相关产品推荐

