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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:45:32