2014-10-01 4 views
0

У меня есть следующая таблицаКак вставить переменную с плавающей точкой в ​​базе данных правильно

CREATE TABLE IF NOT EXISTS `payment_data` (
    `orderid` int(11) NOT NULL, 
    `orderDesc` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `name` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `email` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `orderAmount` float NOT NULL, 
    UNIQUE KEY `orderid` (`orderid`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

и я пытаюсь вставить строку в его с помощью PHP.

$sql = 'INSERT INTO payment_data '. 
      '(orderid, orderDesc, name, email, orderAmount) '. 
      'VALUES ('.$form_order_id.', "'.$form_order_desc.'", "'.$form_name.'", "'.$form_email.'", '.number_format($form_order_amount, 2, '.', ',').')'; 

Проблема заключается в том, что «orderAmount» вставлен без десятичной части. Например, если $ form_order_amount = 30,45, то 30 - это то, что вставлено в базу данных.

Я использовал number_format(), потому что он должен преобразовать «30,45» в «30,45».

+0

Вы должны десятичную точность для поплавка 'orderAmount' поплавок (7,2)' или что-то желательны –

+0

'30,45' с' 'десятичного не является допустимым числом к ​​компьютеру; вам понадобится десятичная точка ('.') при вставке в MySQL –

+2

Тем не менее, не используйте' float' для денег в базе данных, используйте [decimal] (http://dev.mysql.com/doc/refman/5.6/ ru/precision-math-decimal-characteristics.html) .... или даже лучше, настройте значение на центы, чтобы вы работали с целыми числами, если вам когда-либо понадобится корректировка для налоговых расчетов и т. д., где точность с плавающей запятой может вызвать проблемы –

ответ

1

Преобразовать form_order_amount плавать первым, с помощью этого:

$form_order_amount = floatval(str_replace(',', '.', $form_order_amount)); 
0

У меня была аналогичная проблема. Вот как я это сделал. Источник PHP manuals

public static function tofloat($num) { 
    $dotPos = strrpos($num, '.'); 
    $commaPos = strrpos($num, ','); 
    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos : 
      ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false); 

    if (!$sep) { 
     return floatval(preg_replace("/[^0-9]/", "", $num)); 
    } 

    return floatval(
     preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' . 
     preg_replace("/[^0-9]/", "", substr($num, $sep + 1, 
     strlen($num))) 
    ); 
} 
Смежные вопросы