Flutter应用向PHP后端提交数据时出现FormatException异常
问题根源分析
你遇到的FormatException: Unexpected character (at character 1),本质是Flutter请求期望接收JSON格式响应,但PHP后端返回的内容不是有效JSON——这是因为PHP代码存在SQL语法错误和预处理逻辑错误,触发了PHP报错,输出了错误信息而非正确的JSON结构。
修复步骤
1. 修正PHP代码的核心问题
你的PHP代码有两个致命错误:SQL语句引号拼接混乱、错误使用预处理(直接拼接变量到SQL,既存在注入风险又会导致语法错误),同时自动递增的ID无需手动插入。修正后的代码如下:
<?php require("db.php"); // 先校验必填参数是否存在 if(isset($_POST["name"]) && isset($_POST["last"])){ $firstName = $_POST["name"]; $lastName = $_POST["last"]; // 自动递增id无需在INSERT中指定,仅写入需要赋值的列 // 使用预处理占位符,避免SQL注入和语法错误 $querySt = "INSERT INTO project1 (firstName, lastName) VALUES(?, ?)"; $statement = $connection->prepare($querySt); // 绑定字符串类型参数,"ss"对应两个字符串变量 $statement->bind_param("ss", $firstName, $lastName); // 执行并返回结构化JSON响应 if($statement->execute()){ echo json_encode(["status" => "success", "message" => "数据插入成功"]); } else { echo json_encode(["status" => "error", "message" => $statement->error]); } } else { echo json_encode(["status" => "error", "message" => "缺少必填参数"]); } ?>
2. 完善Flutter的响应处理逻辑
原Flutter代码未做异常捕获和响应校验,当后端返回非JSON内容时会直接抛出异常。添加错误捕获和解析逻辑:
import 'dart:convert'; import 'package:http/http.dart' as http; postData() async { name = nameField.text; lastName = lastField.text; var urlWeb = Uri.parse('https://sqlfinalproject.000webhostapp.com/insert.php'); try { var res = await http.post( urlWeb, headers: {"Accept": "application/json"}, body: { "name": name, "last": lastName, }, ); // 先校验HTTP响应状态码 if (res.statusCode == 200) { var responseData = jsonDecode(res.body); print(responseData["message"]); // 这里可以添加成功后的业务逻辑,比如清空输入框、提示用户等 } else { print("请求失败,状态码: ${res.statusCode}"); } } catch (e) { // 捕获格式异常、网络异常等 print("请求错误: $e"); } }
额外注意事项
- 确保
db.php中的数据库连接配置正确,且project1表的id字段已设置为自动递增主键 - 测试时可以用Postman直接发送POST请求到PHP接口,先确认返回的JSON是否有效
- 永远不要直接将用户输入拼入SQL语句,预处理语句是避免SQL注入的标准方案
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

