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,失败返回falsemysqli_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);
四、额外的安全建议
虽然现在是解决空数据问题,但还是要提醒你:
- 改用预处理语句替代直接拼接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);
- 密码不要明文存储,用
password_hash()加密后再插入:
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);
内容的提问来源于stack exchange,提问作者user9368327
相关产品推荐
相关产品推荐

