PHP中合并数据插入SQL的最优方法,如何格式化duration为指定数组结构
问题修复方案
你当前输出和预期不符有三个核心原因:
position字段拼写错误,代码里写的是positon,少了字母i,和预期字段名不符duration_get返回的是PDO默认查询结果,同时带关联键和数字索引,没有按你要的顺序提取字段值- 用
fetchAll获取单条记录会返回二维数组,导致duration外层多套了一层数组结构
代码调整步骤
1. 修改duration_get函数的返回逻辑
function duration_get($userID_selection) { $conn = connect(); try { $sql = "SELECT isDuration1, isDuration3, isDuration5, isDuration10 ,isDuration15, isDuration20 FROM music_work WHERE music_work_ID = :userID_selection "; $statement = $conn->prepare($sql); $statement->bindParam(':userID_selection', $userID_selection, PDO::PARAM_INT); $statement->execute(); // 单条记录用fetch,只取关联数组格式 $data = $statement->fetch(PDO::FETCH_ASSOC); $conn = null; if (!$data) return []; // 按你要的顺序提取字段值,组成纯数值数组 return [ $data['isDuration1'], $data['isDuration3'], $data['isDuration5'], $data['isDuration10'], $data['isDuration15'], $data['isDuration20'] ]; } catch(PDOException $e) { echo $e->getMessage(); return []; } }
2. 修正业务逻辑的拼写错误
header('Content-type: Application/JSON'); $work_data = music_work_get(); $userInput = array(); $id = $_POST['music_work_ID']; $recieved = duration_get($id); $userInput['music_work_ID'] = $_POST['music_work_ID']; // 修正拼写错误:positon → position $userInput['position'] = $_POST['position']; $userInput['duration'] = $recieved; if(isset($_POST['insert'])){ if(!empty($_POST["checkbox"])){ $userInput['music_tag_ID'] = $_POST["checkbox"]; } } // 现在输出即可得到预期结构 echo json_encode($userInput, JSON_PRETTY_PRINT);
数据库插入建议
根据你的表结构选择存储方式:
- 如果duration字段是字符串类型,插入前用
json_encode($userInput['duration'])转成JSON字符串存储即可 - 如果music_tag_ID需要后续查询筛选,建议拆成多对多关联表存储,不要存在主表单个字段中
- 插入时务必用PDO预处理绑定参数,避免SQL注入,示例代码:
// 示例:主表为user_music,字段对应music_work_ID、position、duration、music_tags $insertStmt = $conn->prepare("INSERT INTO user_music (music_work_ID, position, duration, music_tags) VALUES (:wid, :pos, :dur, :tags)"); $insertStmt->bindValue(':wid', $userInput['music_work_ID'], PDO::PARAM_INT); $insertStmt->bindValue(':pos', $userInput['position'], PDO::PARAM_INT); $insertStmt->bindValue(':dur', json_encode($userInput['duration']), PDO::PARAM_STR); $insertStmt->bindValue(':tags', json_encode($userInput['music_tag_ID']), PDO::PARAM_STR); $insertStmt->execute();
内容的提问来源于stack exchange,提问作者Coding_Fish
相关产品推荐
相关产品推荐

