如何解决Flutter通过PHP向MySQL传递Integer类型变量失败问题
解决方案
1. 修正Flutter/Dart代码:确保整数转为字符串传递
http.post的body参数要求键值对为字符串类型,直接传递int类型可能导致编码异常,PHP端无法正确接收。修改edad的传递方式:
Future PrividerPruebaRegistroCliente(String Contrasena,String correo,String apodo,String apellido, int edad ) async { try{ var Url= Uri.parse("http://192.168.0.105/PruebaRati/Prueba Php/Modelo_Php/RatiDemo/ProviderPrueba.php"); var response = await http.post(Url, body:{ 'contrasena' : Contrasena, 'correo' : correo, 'apodo' : apodo, 'apellido' : apellido, 'edad' : edad.toString() // 将整数转为字符串传递 }, ).timeout(const Duration(seconds: 90)) ; // 新增:打印响应内容,方便排查问题 print(response.body); }on TimeoutException catch(e){ print("Tardo mucho la conexion"); }on Error catch(e){ print("Error de Http: ${e.toString()}"); } }
2. 修正PHP代码:优化SQL语句并使用预处理(避免注入+类型匹配)
原问题点:
- 给整数类型的
edad字段加了单引号,导致MySQL需要隐式转换,可能引发类型不匹配 - 直接拼接SQL存在严重的SQL注入风险
- 未处理参数缺失的情况
修改后的PHP代码:
<?php require("database connection"); // 先检查是否接收到所有必要参数 if(!isset($_POST['contrasena'], $_POST['correo'], $_POST['apodo'], $_POST['apellido'], $_POST['edad'])){ echo "缺少必要参数"; exit; } if(!$conex){ echo("conexion incorrecta"); exit; } // 使用预处理语句,避免SQL注入,同时保证类型匹配 $consulta = "INSERT INTO nametable(contrasenia, correo, apodo, apellido, edad) VALUES (?, ?, ?, ?, ?)"; $stmt = mysqli_prepare($conex, $consulta); if(!$stmt){ echo "预处理失败: " . mysqli_error($conex); exit; } // 绑定参数:s代表字符串,i代表整数,对应5个参数的类型 mysqli_stmt_bind_param($stmt, "ssssi", $_POST['contrasena'], $_POST['correo'], $_POST['apodo'], $_POST['apellido'], $_POST['edad']); // 执行语句 if(mysqli_stmt_execute($stmt)){ echo("插入成功"); }else{ echo("插入失败: " . mysqli_stmt_error($stmt)); } // 关闭资源 mysqli_stmt_close($stmt); mysqli_close($conex); ?>
3. 数据库字段验证
确认MySQL表nametable中的edad字段类型为整数类型(如INT、TINYINT等),不要设置为VARCHAR或其他字符串类型。
调试建议
- 在Flutter中打印
response.body,查看PHP返回的具体错误信息,快速定位问题 - 在PHP中临时添加
var_dump($_POST),检查接收到的参数是否正确
内容的提问来源于stack exchange,提问作者Michael Antonio
相关产品推荐
相关产品推荐

