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

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 ));
 }

问题原因分析

  1. PHP语法错误:$result = $connect => query($sql); 中箭头使用错误,应该是->而非=>,直接导致PHP报错,输出HTML格式的错误信息,而非预期的JSON。
  2. SQL语句完全错误:INSERT语法应为INSERT INTO 表名(字段列表) VALUES(值列表),你写成了类似SELECT的WHERE语法,属于严重语法错误,触发数据库报错。
  3. 请求格式不匹配:Flutter注册接口用JSON格式发送请求(设置了Content-Type: application/json并jsonEncode body),但PHP用$_POST获取参数,而$_POST仅解析application/x-www-form-urlencoded格式的请求,无法获取JSON内容,导致参数为空进而报错。
  4. 错误输出未控制: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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:40:19