如何将$scope.table = []及$scope.decks数据插入MySQL数据库?
实现$scope.decks和$scope.table插入MySQL的简便方法
首先得明确:前端AngularJS没法直接操作MySQL,必须通过后端API接口中转,这是最安全也最标准的做法。下面给你一套简单可行的流程,我用Node.js(Express)做后端示例,你也可以换成PHP/Python这些你熟悉的语言。
第一步:前端打包数据,发送请求到后端
在你的AngularJS控制器里,新增一个函数把$scope.decks和$scope.table的数据打包,用$http服务发给后端接口:
// 假设你的控制器结构如下 app.controller('DeckBuilderCtrl', function($scope, $http) { // 你已有的卡片推入逻辑... // 新增保存到数据库的函数 $scope.saveToDatabase = function() { // 把需要保存的两个数组打包成一个对象 const payload = { decks: $scope.decks, table: $scope.table }; // 发送POST请求到后端接口 $http.post('/api/save-deck', payload) .then(res => { alert('卡组数据已成功保存到数据库!'); console.log('保存详情:', res.data); }) .catch(err => { console.error('保存失败:', err); alert('保存出错了,可查看控制台日志排查'); }); }; });
然后在页面里加个触发按钮:
<button ng-click="saveToDatabase()">保存卡组到数据库</button>
第二步:后端搭建API接口(Node.js/Express示例)
- 先安装依赖:
npm install express mysql2 cors
- 编写
server.js后端文件:
const express = require('express'); const mysql = require('mysql2'); const cors = require('cors'); const app = express(); // 配置跨域(解决前后端端口不同的跨域问题) app.use(cors()); // 解析JSON格式的请求体 app.use(express.json()); // 配置MySQL连接信息 const db = mysql.createConnection({ host: 'localhost', // 你的数据库地址 user: 'your_db_user', // 数据库用户名 password: 'your_db_pwd', // 数据库密码 database: 'deck_db' // 你要使用的数据库名 }); // 连接数据库 db.connect(err => { if (err) { console.error('数据库连接失败:', err); return; } console.log('成功连接到MySQL数据库'); }); // 处理前端的保存请求 app.post('/api/save-deck', (req, res) => { const { decks, table } = req.body; // 1. 插入decks数组到decks表(请根据你的卡片字段调整表结构和字段) const deckInsertQuery = 'INSERT INTO decks (card_name, card_type, card_cost) VALUES ?'; // 把数组对象转换成MySQL批量插入需要的二维数组格式 const deckValues = decks.map(card => [card.name, card.type, card.cost]); db.query(deckInsertQuery, [deckValues], (err, deckRes) => { if (err) return res.status(500).json({ error: '插入卡组失败', details: err }); // 2. 插入table数组到table_data表(同理,根据你的table字段调整) const tableInsertQuery = 'INSERT INTO table_data (col1, col2) VALUES ?'; const tableValues = table.map(item => [item.col1, item.col2]); db.query(tableInsertQuery, [tableValues], (err, tableRes) => { if (err) return res.status(500).json({ error: '插入table数据失败', details: err }); // 两个表都插入成功,返回结果 res.json({ message: '数据保存成功', decksInserted: deckRes.affectedRows, tableInserted: tableRes.affectedRows }); }); }); }); // 启动后端服务 const PORT = 3001; app.listen(PORT, () => console.log(`后端服务运行在 http://localhost:${PORT}`));
第三步:创建MySQL数据库表
先在MySQL里创建对应的数据表,示例SQL如下(请根据你的实际字段调整):
-- 创建存储卡组的decks表 CREATE TABLE decks ( id INT AUTO_INCREMENT PRIMARY KEY, card_name VARCHAR(255) NOT NULL, card_type VARCHAR(100), card_cost INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建存储table数据的table_data表 CREATE TABLE table_data ( id INT AUTO_INCREMENT PRIMARY KEY, col1 VARCHAR(255), col2 TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
可选:PHP后端简化版本
如果你更熟悉PHP,可以写一个简单的接口文件save_deck.php:
<?php header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json"); header("Access-Control-Allow-Methods: POST"); // 连接数据库 $conn = new mysqli('localhost', 'your_db_user', 'your_db_pwd', 'deck_db'); if ($conn->connect_error) die(json_encode(['error' => '数据库连接失败'])); // 接收前端传来的JSON数据 $data = json_decode(file_get_contents("php://input"), true); $decks = $data['decks']; $table = $data['table']; // 插入decks数据 $stmt = $conn->prepare("INSERT INTO decks (card_name, card_type, card_cost) VALUES (?, ?, ?)"); foreach ($decks as $card) { $stmt->bind_param("ssi", $card['name'], $card['type'], $card['cost']); $stmt->execute(); } // 插入table数据 $stmtTable = $conn->prepare("INSERT INTO table_data (col1, col2) VALUES (?, ?)"); foreach ($table as $item) { $stmtTable->bind_param("ss", $item['col1'], $item['col2']); $stmtTable->execute(); } echo json_encode(['message' => '数据保存成功']); $conn->close(); ?>
此时前端的$http.post地址改成'/save_deck.php'即可。
重要注意事项
- 数据验证:后端一定要校验前端传来的数据,比如卡片名称不能为空、数字字段必须是合法数字,避免脏数据插入。
- 事务处理:如果
decks和table的数据是关联的,建议使用数据库事务,确保要么都插入成功,要么都回滚,避免数据不一致。 - 安全防护:不要把数据库密码硬编码在代码里,用环境变量管理;生产环境要限制CORS的允许域名,只开放你的前端域名;始终使用参数化查询(示例中已使用)防止SQL注入。
内容的提问来源于stack exchange,提问作者can1
相关产品推荐
相关产品推荐

