【问题标题】:Using Mysqli prepared statements for currency / money values使用 Mysqli 为货币/货币值准备的语句
【发布时间】:2015-08-04 02:51:58
【问题描述】:

我接手了一个项目,因为之前的开发人员使用的是 Mysqli,所以我一直坚持使用它。不过我已经改用准备好的语句了。

我想知道处理来自用户的货币价值的最佳方法是什么。当将变量绑定为双精度时,当输入类似于 5.99 时,它可以正常工作,这是预期的。但是我们在这里讨论的是用户的输入,所以我可以想象他们输入 $5.99100,000(使用美元符号或逗号)的情况。仅使用绑定,存储的值最终分别为 0.00100.00。数据库中列类型为十进制(10,2)。

可能有几种不同的方法可以解决此问题,例如阻止用户键入这些字符或从前端进行验证,或者可能在后端进行某种其他形式的数据清理。但我想了解其他人会为这个案子做些什么。我不能让它保持原样,因为我知道有人会忽略这个值不是他们最初输入的值。

感谢任何输入。谢谢!

【问题讨论】:

    标签: php mysqli prepared-statement


    【解决方案1】:

    不要在 MySQL 方面这样做,您的应用程序应该能够理解用户的意思。我会建议

    http://php.net/manual/en/numberformatter.parsecurrency.php

    如果它很重要,我还建议将用户输入的原始字符串存储为 varchar,以便稍后进行验证/错误修复。

    $fmt_cur = numfmt_create( 'en_US', NumberFormatter::CURRENCY );
    $fmt = numfmt_create( 'en_US', NumberFormatter::DECIMAL );
    
    $amounts = array("$5.99", "100,000");
    foreach ($amounts as $a) {
      ($b = numfmt_parse_currency($fmt_cur, $a, $curr)) ||
      ($b = numfmt_parse($fmt, $a));
    
      var_dump( $b );
    
    }
    

    返回

    double(5.99)
    double(100000)
    

    【讨论】: