You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:27:02