PHP出现“格式不正确的数值”错误的排查求助
问题:PHP提示“A non well formed numeric value encountered”错误
错误信息
Notice: A non well formed numeric value encountered in C:\xampp\htdocs\backhoe\Controllers\Users.php on line 70
相关代码
控制器Users.php第70行(edit方法)
public function edit(int $id){ //This is my line 70 $data = $this->model->editUser($id); echo json_encode($data, JSON_UNESCAPED_UNICODE); die(); }
模型中的editUser方法
public function editUser(int $id){ $sql = "SELECT * FROM offices WHERE offices.id = $id"; $data = $this->select($sql); return $data; }
Query.php中的select方法
public function select(string $sql){ $this->sql = $sql; $res = $this->conn->prepare($this->sql); $res->execute(); $data = $res->fetch(PDO::FETCH_ASSOC); return $data; }
前端调用代码
function editUser(id){ document.getElementById("myModalTitle").innerHTML = "Actualizar usuario"; document.getElementById("modalActionBtn").innerHTML = "Actualizar"; const url = base_url + "Users/edit/"+id; const http = new XMLHttpRequest(); http.open("GET",url,true); http.send(); http.onreadystatechange = function(){ if(this.readyState==4 && this.status == 200){ console.log(this.responseText); const res = JSON.parse(this.responseText); document.getElementById("officeName").value = res.officeName; document.getElementById("manager").value = res.manager; document.getElementById("userName").value = res.userName; document.getElementById("roleId").value = res.roleId; } } $("#newUser").modal("show"); }
已知信息
- 数据库
id字段为INT类型 - 已检查拼写无误
排查与解决方案
1. 核心原因
错误出现在控制器方法的int $id声明处,说明传递给edit方法的$id不是有效的整数类型。PHP尝试将非数值类型(比如带非数字字符的字符串、空值)强制转为int时,会触发该Notice。
2. 验证方法
- 前端参数检查:在前端
editUser函数开头加日志,确认传入的id值和类型:function editUser(id){ console.log("传入的id值:", id, "类型:", typeof id); // 原有代码... } - 后端参数检查:在控制器方法开头打印参数,确认实际接收的内容:
public function edit(int $id){ var_dump($id); // 原有代码... }
3. 修复方案
方案一:强制验证并转换参数
在控制器中先处理参数,确保是有效整数:
public function edit($id){ // 过滤并验证整数,无效则返回错误 $id = filter_var($id, FILTER_VALIDATE_INT); if(!$id){ echo json_encode(["error" => "无效的ID参数"], JSON_UNESCAPED_UNICODE); die(); } $data = $this->model->editUser($id); echo json_encode($data, JSON_UNESCAPED_UNICODE); die(); }
方案二:修正参数传递环节
- 前端确保传递的id是纯数字(比如从DOM获取时用
parseInt(id)转换),避免传递带空格、非数字字符的值; - 若使用框架路由,检查路由规则,确保id参数被解析为数值类型。
4. 额外优化:解决SQL注入风险
当前模型直接拼接SQL存在注入风险,建议改用参数绑定:
// 修改模型editUser方法 public function editUser(int $id){ $sql = "SELECT * FROM offices WHERE offices.id = ?"; return $this->selectWithParams($sql, [$id]); } // 在Query.php新增带参数的查询方法 public function selectWithParams(string $sql, array $params = []){ $res = $this->conn->prepare($sql); $res->execute($params); return $res->fetch(PDO::FETCH_ASSOC); }
内容的提问来源于stack exchange,提问作者Edgar Gerardo
相关产品推荐
相关产品推荐

