Flutter用户注册数据插入数据库遇FormatException错误求助
Flutter注册时FormatException错误排查与解决
尝试将用户注册数据插入数据库时,出现FormatException错误,打印res.body得到包含<br />的内容,说明后端返回的不是合法JSON,而是HTML错误信息。以下是问题分析和解决办法:
相关代码
Flutter注册类代码
TextEditingController email = TextEditingController(); TextEditingController password = TextEditingController(); TextEditingController name = TextEditingController(); TextEditingController username = TextEditingController(); TextEditingController cPassword = TextEditingController(); final _formKey = GlobalKey<FormState>(); bool isRememberMe = false; validateUserEmail() async { try { var res = await http.post(Uri.parse(API.validateEmail), body: { 'e-mail': email.text.trim(), }); if (res.statusCode == 200) { //connection successful var resBody = await jsonDecode(res.body); if (resBody['emailFound'] == true) { Fluttertoast.showToast( msg: "Email already been used. Please try another email"); } else { //register & save registerAndSaveUserrecord(); } } } catch (e) { print(e.toString()); } } registerAndSaveUserrecord() async { try { var headers = {'Content-Type': 'application/json'}; var url = Uri.parse(API.register); Map body = { 'username': username.text, 'email': email.text.trim(), 'name': name.text, 'password': password.text, 'cPassword': cPassword.text, }; http.Response response = await http.post(url, body: jsonEncode(body), headers: headers); if (response.statusCode == 200) { //connection successful final json = jsonDecode(response.body); if (json['success'] == true) { Fluttertoast.showToast(msg: "Register Successful!"); } else { Fluttertoast.showToast(msg: "Error Occurred. Try Again!"); } } } catch (e) { print(e.toString()); } }
PHP后端注册代码
<?php include '../connection.php'; //POST (send/save data to mysql) //GET (retrieve/read from mysql) $username = $_POST['username']; $email = $_POST['email']; $name = $_POST['name']; $password = md5($_POST['password']); //pass to binary for secure purpose $cPassword = md5($_POST['cPassword']); $sql = "INSERT * INTO user WHERE email = '$email' , name = '$name' , username = '$username' , password = '$password' , cPassword = '$cPassword'"; $result = $connect => query($sql); if($result){ echo json_encode(array("success" => true )); } else { echo json_encode(array("success" => false )); }
问题原因分析
- PHP语法错误:
$result = $connect => query($sql);中箭头使用错误,应该是->而非=>,直接导致PHP报错,输出HTML格式的错误信息,而非预期的JSON。 - SQL语句完全错误:INSERT语法应为
INSERT INTO 表名(字段列表) VALUES(值列表),你写成了类似SELECT的WHERE语法,属于严重语法错误,触发数据库报错。 - 请求格式不匹配:Flutter注册接口用JSON格式发送请求(设置了
Content-Type: application/json并jsonEncodebody),但PHP用$_POST获取参数,而$_POST仅解析application/x-www-form-urlencoded格式的请求,无法获取JSON内容,导致参数为空进而报错。 - 错误输出未控制:PHP默认会输出HTML格式的错误信息,即使后续有
json_encode,错误信息也会先输出,导致返回内容不是合法JSON,触发Flutter的FormatException。
解决办法
1. 修复PHP代码
修正语法、SQL语句、请求解析方式,同时优化安全性:
<?php // 关闭错误输出,避免HTML错误信息干扰JSON error_reporting(0); ini_set('display_errors', 0); include '../connection.php'; // 获取JSON请求体 $input = file_get_contents('php://input'); $data = json_decode($input, true); // 检查参数是否存在 if(!isset($data['username'], $data['email'], $data['name'], $data['password'], $data['cPassword'])){ echo json_encode(["success" => false, "msg" => "缺少必要参数"]); exit; } // 验证密码一致性 if($data['password'] !== $data['cPassword']){ echo json_encode(["success" => false, "msg" => "两次密码不一致"]); exit; } // 使用安全的密码哈希(替代不安全的md5) $hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT); // 正确的INSERT语法,使用预处理防止SQL注入 $sql = "INSERT INTO user (username, email, name, password) VALUES (?, ?, ?, ?)"; $stmt = $connect->prepare($sql); $stmt->bind_param("ssss", $data['username'], $data['email'], $data['name'], $hashedPassword); if($stmt->execute()){ echo json_encode(["success" => true]); } else { echo json_encode(["success" => false, "msg" => "数据库操作失败:" . $stmt->error]); } $stmt->close(); $connect->close(); ?>
2. 统一Flutter请求格式(可选)
如果不想用JSON格式,也可以把Flutter的注册接口改成表单格式发送,这样PHP可以继续用$_POST:
registerAndSaveUserrecord() async { try { var url = Uri.parse(API.register); Map body = { 'username': username.text, 'email': email.text.trim(), 'name': name.text, 'password': password.text, 'cPassword': cPassword.text, }; http.Response response = await http.post(url, body: body); if (response.statusCode == 200) { final json = jsonDecode(response.body); if (json['success'] == true) { Fluttertoast.showToast(msg: "注册成功!"); } else { Fluttertoast.showToast(msg: json['msg'] ?? "发生错误,请重试!"); } } } catch (e) { print(e.toString()); Fluttertoast.showToast(msg: "网络请求失败"); } }
3. 调试建议
- 测试时可以在Flutter中打印
response.body,查看具体的错误信息,帮助定位问题。 - PHP端可以暂时开启错误日志(
error_log()),而非直接输出错误,方便排查问题。
内容的提问来源于stack exchange,提问作者syaf_
相关产品推荐
相关产品推荐

