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

PHP实现字符串转Decimal/Float并写入MySQL数据库问题求助

解决PHP千分位格式字符串转数值写入MySQL的问题

我需要用PHP将类似1.279,35格式的字符串转换为Decimal(10,2)或Float类型后写入MySQL数据库,尝试用str_replace替换逗号为点但没生效,附上代码请求排查:

<?php

include_once "conexao.php";

$dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);

if (empty($dados['descricao'])) {
    $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger' role='alert'>Erro, é necessário preencher o campo descricao.</div>"];
} elseif (empty($dados['valor'])) {
    $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger' role='alert'>Erro, é necessário preencher o campo valor.</div>"];
} else {
    $valtemp = $dados['valor']);
    $valtemp = str_replace(".", "", $valtemp);
    $valtemp = str_replace(",", ".", $valtemp);
    $dados['valor']) = $valtemp;
    $query_peca = "INSERT INTO pecas 
                            (descricao, modelo, nserie, fornecedor, 
                            datacompra, valor, condicao, observacao) 
                    VALUES (:descricao, :modelo, :nserie, :fornecedor, 
                            :datacompra, :valor, :condicao, :observacao)";
    $cad_peca = $conn->prepare($query_peca);
    $cad_peca->bindParam(':descricao', $dados['descricao']);
    $cad_peca->bindParam(':modelo', $dados['modelo']);
    $cad_peca->bindParam(':nserie', $dados['nserie']);
    $cad_peca->bindParam(':fornecedor', $dados['fornecedor']);
    $cad_peca->bindParam(':datacompra', $dados['datacompra']);
    $cad_peca->bindParam(':valor', $dados['valor']);    
    $cad_peca->bindParam(':condicao', $dados['condicao']);
    $cad_peca->bindParam(':observacao', $dados['observacao']);
    $cad_peca->execute();   

    if ($cad_peca->rowCount()) {
        $retorna = ['erro' => false, 'msg' => "<div class='alert alert-success' role='alert'>Peça cadastrada com sucesso.</div>"];
    } else {
        $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger' role='alert'>Erro: peça não cadastrada.</div>"];
    }
}

echo json_encode($retorna);

问题排查与修复

你的替换逻辑本身是正确的,但代码存在语法错误导致替换逻辑根本没被执行:

  1. 第12行:$valtemp = $dados['valor']); 多了一个右括号,应改为$valtemp = $dados['valor'];
  2. 第15行:$dados['valor']) = $valtemp; 同样多了右括号,应改为$dados['valor'] = $valtemp;

修复后的代码如下:

<?php

include_once "conexao.php";

$dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);

if (empty($dados['descricao'])) {
    $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger' role='alert'>Erro, é necessário preencher o campo descricao.</div>"];
} elseif (empty($dados['valor'])) {
    $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger' role='alert'>Erro, é necessário preencher o campo valor.</div>"];
} else {
    // 修复语法错误:移除多余的右括号
    $valtemp = $dados['valor'];
    $valtemp = str_replace(".", "", $valtemp);
    $valtemp = str_replace(",", ".", $valtemp);
    // 修复语法错误:移除多余的右括号
    $dados['valor'] = $valtemp;
    
    $query_peca = "INSERT INTO pecas 
                            (descricao, modelo, nserie, fornecedor, 
                            datacompra, valor, condicao, observacao) 
                    VALUES (:descricao, :modelo, :nserie, :fornecedor, 
                            :datacompra, :valor, :condicao, :observacao)";
    $cad_peca = $conn->prepare($query_peca);
    $cad_peca->bindParam(':descricao', $dados['descricao']);
    $cad_peca->bindParam(':modelo', $dados['modelo']);
    $cad_peca->bindParam(':nserie', $dados['nserie']);
    $cad_peca->bindParam(':fornecedor', $dados['fornecedor']);
    $cad_peca->bindParam(':datacompra', $dados['datacompra']);
    $cad_peca->bindParam(':valor', $dados['valor']);    
    $cad_peca->bindParam(':condicao', $dados['condicao']);
    $cad_peca->bindParam(':observacao', $dados['observacao']);
    $cad_peca->execute();   

    if ($cad_peca->rowCount()) {
        $retorna = ['erro' => false, 'msg' => "<div class='alert alert-success' role='alert'>Peça cadastrada com sucesso.</div>"];
    } else {
        $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger' role='alert'>Erro: peça não cadastrada.</div>"];
    }
}

echo json_encode($retorna);

额外优化建议

  • 可以在替换后用floatval($valtemp)或(float)$valtemp强制转换为数值类型,确保存入数据库的是数值而非字符串
  • 绑定参数时可以指定类型,比如$cad_peca->bindParam(':valor', $dados['valor'], PDO::PARAM_STR);(Decimal类型用字符串绑定更精准,避免浮点精度问题)

内容的提问来源于stack exchange,提问作者Cristiano Figueiredo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:15:32