如何将Bootstrap Table对应的JavaScript数组保存到数据库?
如何将Bootstrap Table对应的JavaScript数组保存到数据库?
看起来你已经用Bootstrap Table搭好可编辑表格了,要把数据存到数据库其实分两种常见场景:单个单元格编辑后自动保存,或者一次性批量保存整个表格的数组,我给你分别捋清楚步骤:
场景1:单个单元格编辑后自动保存
你已经通过$proj_table.editable.defaults.url = "php/save.php"指定了保存接口,Bootstrap Table的editable插件会在你编辑完单元格后,自动把修改的数据以POST请求发送到这个PHP文件。你只需要在save.php里处理接收参数并更新数据库就行。
后端save.php示例代码
<?php // 替换成你自己的数据库连接信息 $db_host = 'localhost'; $db_user = '你的数据库用户名'; $db_pass = '你的数据库密码'; $db_name = '你的数据库名'; $table_name = '你的数据表名'; // 建立数据库连接(这里用mysqli,你也可以用PDO) $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if (!$conn) { die(json_encode(['status' => 'error', 'msg' => '数据库连接失败: ' . mysqli_connect_error()])); } // 接收前端发送的参数:pk是行主键(你的ID字段),name是编辑的字段名,value是新值 $pk = isset($_POST['pk']) ? intval($_POST['pk']) : 0; $field = isset($_POST['name']) ? mysqli_real_escape_string($conn, $_POST['name']) : ''; $value = isset($_POST['value']) ? mysqli_real_escape_string($conn, $_POST['value']) : ''; // 校验参数合法性 if ($pk <= 0 || empty($field)) { echo json_encode(['status' => 'error', 'msg' => '参数错误']); exit; } // 用预处理语句防止SQL注入,这一步很重要! $sql = "UPDATE `{$table_name}` SET `{$field}` = ? WHERE ID = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "si", $value, $pk); // s表示字符串,i表示整数,根据字段类型调整 // 执行更新并返回结果 if (mysqli_stmt_execute($stmt)) { echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'error', 'msg' => '更新失败: ' . mysqli_error($conn)]); } // 关闭连接和语句 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
场景2:批量保存整个表格的JavaScript数组
如果你想一次性把表格所有数据(也就是bootstrapTable('getData')获取到的JS数组)保存到数据库,可以用AJAX把数组发送到后端,然后批量处理。
前端代码(添加批量保存按钮事件)
// 假设你有一个ID为save-all-btn的按钮 $('#save-all-btn').on('click', function() { // 获取表格所有数据的JS数组 const tableData = $proj_table.bootstrapTable('getData'); // 发送AJAX请求到后端 $.ajax({ url: 'php/save_all.php', method: 'POST', data: { table_data: JSON.stringify(tableData) }, // 把数组转成JSON字符串发送 dataType: 'json', success: function(res) { if (res.status === 'success') { alert('批量保存成功!'); } else { alert('保存失败:' + res.msg); } }, error: function() { alert('请求服务器失败,请稍后再试'); } }); });
后端save_all.php示例代码
<?php $db_host = 'localhost'; $db_user = '你的数据库用户名'; $db_pass = '你的数据库密码'; $db_name = '你的数据库名'; $table_name = '你的数据表名'; $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if (!$conn) { die(json_encode(['status' => 'error', 'msg' => '数据库连接失败'])); } // 接收并解析前端发送的JSON数据 if (!isset($_POST['table_data'])) { echo json_encode(['status' => 'error', 'msg' => '未接收到数据']); exit; } $tableData = json_decode($_POST['table_data'], true); if (!is_array($tableData)) { echo json_encode(['status' => 'error', 'msg' => '数据格式错误']); exit; } // 开启事务,保证批量操作的原子性(要么全成功,要么全失败) mysqli_begin_transaction($conn); try { foreach ($tableData as $row) { $id = isset($row['ID']) ? intval($row['ID']) : 0; $project = isset($row['project']) ? mysqli_real_escape_string($conn, $row['project']) : ''; $owner = isset($row['owner']) ? mysqli_real_escape_string($conn, $row['owner']) : ''; $name1 = isset($row['name_1']) ? mysqli_real_escape_string($conn, $row['name_1']) : ''; if ($id > 0) { // 如果ID存在,执行更新操作 $sql = "UPDATE `{$table_name}` SET project = ?, owner = ?, name_1 = ? WHERE ID = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "sssi", $project, $owner, $name1, $id); } else { // 如果ID不存在,执行新增操作 $sql = "INSERT INTO `{$table_name}` (project, owner, name_1) VALUES (?, ?, ?)"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "sss", $project, $owner, $name1); } if (!mysqli_stmt_execute($stmt)) { throw new Exception('处理数据失败: ' . mysqli_error($conn)); } mysqli_stmt_close($stmt); } // 提交事务 mysqli_commit($conn); echo json_encode(['status' => 'success']); } catch (Exception $e) { // 出错则回滚所有操作 mysqli_rollback($conn); echo json_encode(['status' => 'error', 'msg' => $e->getMessage()]); } mysqli_close($conn); ?>
几个重要注意事项
- 防止SQL注入:一定要用预处理语句(mysqli_prepare),绝对不能直接把用户输入拼进SQL语句里,否则会有严重安全风险。
- 参数替换:把代码里的数据库连接信息、表名、字段名替换成你自己的实际信息。
- 事务的使用:批量保存时用事务可以避免部分数据成功、部分失败的情况,保证数据一致性。
- 字段类型匹配:绑定参数时的类型(比如
s字符串、i整数)要和数据库字段类型对应,避免出错。
内容的提问来源于stack exchange,提问作者The_Babu
相关产品推荐
相关产品推荐

