2015-05-22 3 views
2

Я взял на себя проект и, поскольку предыдущий разработчик использовал Mysqli, я застрял с ним. Однако я перешел на использование подготовленных инструкций.Использование подготовленных отчетов Mysqli для валютных/денежных значений

Мне было интересно, какой лучший подход для обработки валютных ценностей от пользователя. При привязке переменной как двойной, она отлично работает, когда ввод представляет собой что-то вроде 5.99, что ожидается. Но мы говорим о вкладе от пользователя здесь, поэтому я могу представить случаи, когда они вводят $ 5.99 или (с использованием знака доллара или запятой). Только с привязкой сохраненные значения в конечном итоге составляют 0,00 и 100,00 соответственно. Тип столбца десятичный (10,2) в базе данных.

Возможно, существует несколько разных способов приблизиться к этому, например, запретить пользователю вводить эти символы или выполнять валидацию с внешнего интерфейса или, возможно, другую защиту данных на бэкэнд. Но я хотел получить представление о том, что другие будут делать для этого случая. Я не могу оставить это как есть, потому что я знаю, что кто-то упустит из виду тот факт, что стоимость не та, из которой они первоначально были введены.

Любой ввод оценивается. Благодаря!

ответ

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) 
Смежные вопросы