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

Swift 4中数据无法正常插入数据库,仅插入空白空数据问题排查

我来帮你排查这个插入空数据的问题——这种情况大概率是PHP没正确接收到Swift端发送的POST参数,或者代码里有逻辑错误导致的,咱们一步步来解决:

一、先排查Swift端的请求格式

很多Swift新手容易踩的坑:发送POST请求时,没有设置正确的请求头或参数格式,导致PHP的$_POST拿不到数据。

给你一个标准的Swift POST请求示例,确保参数能被PHP正确解析:

let apiUrl = URL(string: "你的PHP接口地址")!
var request = URLRequest(url: apiUrl)
request.httpMethod = "POST"
// 关键:设置Content-Type为url编码格式,对应PHP默认的$_POST解析规则
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

// 构造参数,注意键名要和PHP里的`name`/`email`/`mobile`/`password`完全一致
let postParams = [
    "name": "测试用户名",
    "email": "test@example.com",
    "mobile": "13800138000",
    "password": "your_password"
]

// 将参数转为url编码的字符串
let paramString = postParams.map {
    let encodedValue = $0.value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
    return "\($0.key)=\(encodedValue)"
}.joined(separator: "&")

request.httpBody = paramString.data(using: .utf8)

// 发送请求
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let data = data {
        if let responseJson = try? JSONSerialization.jsonObject(with: data) {
            print("接口响应:\(responseJson)")
        }
    }
}
task.resume()
二、调试PHP端的参数接收

在你的PHP代码开头加一段调试代码,先确认$_POST是否真的拿到了数据:

header('Content-Type: application/json');
// 先打印POST数据,看是否为空
var_dump($_POST);
exit;

// 下面是你原来的代码
$return_arr = array();
$username=mysqli_real_escape_string($link,$_POST["name"]);
// ... 剩余代码

如果var_dump输出是空数组,那肯定是Swift端的请求格式不对,回到第一步调整;如果有数据,再检查参数名是否和你PHP里的$_POST["name"]完全匹配(比如Swift传的是username但PHP写的是name,就会拿到空值)。

三、修复PHP代码里的逻辑错误

你的代码里有个明显的错误:mysqli_num_rows($result)不能用来判断INSERT操作是否成功!

  • mysqli_query执行INSERT成功时返回true,失败返回false
  • mysqli_num_rows是用来统计SELECT查询结果的行数的,用在这里完全不对

正确的判断方式应该是这样:

$result=mysqli_query($link,"insert into users(name,email,mob,password) values('$username','$email','$mobile','$password')");
if($result) {
    // 插入成功
    $row_array['status'] = "success";
    $row_array['message'] = "用户创建成功";
} else {
    // 插入失败,返回错误信息方便调试
    $row_array['status'] = "error";
    $row_array['message'] = mysqli_error($link);
}
array_push($return_arr, $row_array);
echo json_encode($return_arr);
四、额外的安全建议

虽然现在是解决空数据问题,但还是要提醒你:

  1. 改用预处理语句替代直接拼接SQL,彻底避免SQL注入风险:
$stmt = mysqli_prepare($link, "INSERT INTO users(name, email, mob, password) VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, "ssss", $username, $email, $mobile, $password);
$result = mysqli_stmt_execute($stmt);
  1. 密码不要明文存储,用password_hash()加密后再插入:
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:37