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

PHP遍历JSON子数组并插入SQL表的技术求助

PHP遍历JSON并插入SQL Server解决方案

一、先理清楚数据结构

你给出的是RandomUser的API返回结构,核心是results数组里的每个用户对象,包含多层嵌套子数组。不用暴力建大表,按数据逻辑拆分表更合理。

二、数据库表设计(结构化存储)

先建三张关联表,符合数据库范式,方便后续维护:

-- 用户主表:存基础信息
CREATE TABLE users (
    id INT IDENTITY(1,1) PRIMARY KEY,
    gender VARCHAR(10) NOT NULL,
    title VARCHAR(10),
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    dob_date DATETIME,
    dob_age INT,
    registered_date DATETIME,
    registered_age INT,
    phone VARCHAR(20),
    cell VARCHAR(20)
);

-- 用户地址表:关联用户ID,存地址相关的嵌套数据
CREATE TABLE user_locations (
    id INT IDENTITY(1,1) PRIMARY KEY,
    user_id INT NOT NULL FOREIGN KEY REFERENCES users(id),
    street_number INT,
    street_name VARCHAR(100),
    city VARCHAR(50),
    state VARCHAR(50),
    country VARCHAR(50),
    postcode VARCHAR(20),
    latitude DECIMAL(10,4),
    longitude DECIMAL(10,4),
    timezone_offset VARCHAR(10),
    timezone_description VARCHAR(100)
);

-- 用户图片表:关联用户ID,存头像链接
CREATE TABLE user_pictures (
    id INT IDENTITY(1,1) PRIMARY KEY,
    user_id INT NOT NULL FOREIGN KEY REFERENCES users(id),
    large_url VARCHAR(255),
    medium_url VARCHAR(255),
    thumbnail_url VARCHAR(255)
);

三、PHP代码实现

用SQLSRV扩展连接SQL Server,遍历JSON数组拆解数据,用预处理语句插入(防注入):

// 1. 连接SQL Server
$serverName = "你的服务器名";
$connectionOptions = [
    "Database" => "你的数据库名",
    "Uid" => "用户名",
    "PWD" => "密码"
];
$conn = sqlsrv_connect($serverName, $connectionOptions);
if (!$conn) {
    die(print_r(sqlsrv_errors(), true));
}

// 2. 解析JSON文件(假设JSON存在本地文件,也可以是API响应)
$jsonContent = file_get_contents('users.json');
$data = json_decode($jsonContent, true);

// 3. 遍历每个用户数据
foreach ($data['results'] as $user) {
    // 拆解基础信息
    $gender = $user['gender'];
    $title = $user['name']['title'];
    $firstName = $user['name']['first'];
    $lastName = $user['name']['last'];
    $email = $user['email'];
    $dobDate = $user['dob']['date'];
    $dobAge = $user['dob']['age'];
    $registeredDate = $user['registered']['date'];
    $registeredAge = $user['registered']['age'];
    $phone = $user['phone'];
    $cell = $user['cell'];

    // 拆解地址信息
    $streetNumber = $user['location']['street']['number'];
    $streetName = $user['location']['street']['name'];
    $city = $user['location']['city'];
    $state = $user['location']['state'];
    $country = $user['location']['country'];
    $postcode = $user['location']['postcode'];
    $latitude = $user['location']['coordinates']['latitude'];
    $longitude = $user['location']['coordinates']['longitude'];
    $timezoneOffset = $user['location']['timezone']['offset'];
    $timezoneDesc = $user['location']['timezone']['description'];

    // 拆解图片信息
    $picLarge = $user['picture']['large'];
    $picMedium = $user['picture']['medium'];
    $picThumb = $user['picture']['thumbnail'];

    // 4. 插入主用户表,用预处理语句防注入
    $userSql = "INSERT INTO users (gender, title, first_name, last_name, email, dob_date, dob_age, registered_date, registered_age, phone, cell)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $userParams = [$gender, $title, $firstName, $lastName, $email, $dobDate, $dobAge, $registeredDate, $registeredAge, $phone, $cell];
    $stmt = sqlsrv_query($conn, $userSql, $userParams);
    if (!$stmt) {
        die(print_r(sqlsrv_errors(), true));
    }

    // 获取刚插入的用户ID,用于关联子表
    $userId = sqlsrv_get_last_insert_id($stmt);

    // 5. 插入地址表
    $locationSql = "INSERT INTO user_locations (user_id, street_number, street_name, city, state, country, postcode, latitude, longitude, timezone_offset, timezone_description)
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $locationParams = [$userId, $streetNumber, $streetName, $city, $state, $country, $postcode, $latitude, $longitude, $timezoneOffset, $timezoneDesc];
    $stmt = sqlsrv_query($conn, $locationSql, $locationParams);
    if (!$stmt) {
        die(print_r(sqlsrv_errors(), true));
    }

    // 6. 插入图片表
    $pictureSql = "INSERT INTO user_pictures (user_id, large_url, medium_url, thumbnail_url)
                   VALUES (?, ?, ?, ?)";
    $pictureParams = [$userId, $picLarge, $picMedium, $picThumb];
    $stmt = sqlsrv_query($conn, $pictureSql, $pictureParams);
    if (!$stmt) {
        die(print_r(sqlsrv_errors(), true));
    }
}

// 关闭连接
sqlsrv_close($conn);

四、简化方案(不想分表)

如果觉得分表麻烦,SQL Server 2016及以上支持JSON类型,可以把嵌套数组直接转成JSON字符串存在主表字段里:

// 把location、picture等嵌套数组转成JSON
$locationJson = json_encode($user['location']);
$pictureJson = json_encode($user['picture']);

// 主表新增location_json、picture_json字段(类型为JSON或NVARCHAR(MAX))
$userSql = "INSERT INTO users (gender, title, first_name, last_name, email, dob_date, dob_age, registered_date, registered_age, phone, cell, location_json, picture_json)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
// 对应的参数加上$locationJson和$pictureJson即可

内容的提问来源于stack exchange,提问作者imtryingman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:24:29