Как обработать число 56.1234 , чтобы в БД MySQL оно сохранилось как 56.12

Гриша К.

Новичок
Как обработать число 56.1234 , чтобы в БД MySQL оно сохранилось как 56.12

Подскажите пожалуйста, как мне сохранить в базе число с 4 знаками после точки (56.1234), если в базе данных поле в которое записывается это число должно содержать 2 знака после запятой (56.12).
Т.е. как мне обработать $_SESSION['total_price'] = 56.1234;
чтобы в базе данных переменная сохранилась как 56.12.
Какую функцию применить.

PHP:
@ $query = "insert into orders values
            ('', $customerid, ".$_SESSION['total_price'].",'$date')";
 

Мутник

Новичок
думаю, что то из этого тебе должно помочь,

да и еще, в mysql-eесть встроенный ROUND() мож он тебе поможет.
 

Гриша К.

Новичок
Мутник, -=KPOT=-, Фанат спасибо большое за ответы.

В БД поле где сохраняется $_SESSION['total_price'] установлено как float(6, 2), но переменная сохраняется, только если становится целым числом.
Функции round, ceil, floor не помогли, они скорее всего отображают только число целым или с нужным количеством знаков, при использовании echo или print, а при сохранение число не меняют. Они помойму схожи с number_format ().

Подскажите пожалуйста почему несохраняются числа с десятичными знаками в БД, а сохраняются только целые.
 

dnes

Новичок
Сдается мне, и во FLOAT должно замечательно войти. Заодно и округлится, если надо.

Я бы в query одинарных кавычек для переменной не избегал.
 

Фанат

oncle terrible
Команда форума
вот, как всегда, я стою перед дилеммой.
с одной стороны, у форума просветительская функция.
всем неразумным надо объяснять их заблуждения.
НО СМЫСЛ?
Если одному неразумному УЖЕ объяснили, что он делает неправильно, а другой вылезает с тем же самым - даже не вопросом(!!!) - а ошибочным утверждением.

Именно поэтому я обычно просто молча выкидываю такие сообщения в корзину. Если человек не понял с первого раза, и берётся утверждать противоположное, то не поймёт всё равно.
может быть, я слишком суров? Может, надо нянчиться, и разжёвывать по 5-10 раз, пока не дойдёт?
Может быть, тот, кто кто ЗНАЕТ, кто пробовал НА ПРАКТИКЕ, должен СПОРИТЬ с человеком, который высасывает свои советы из пальца?
Но почему-то мне претит это. Ну ведь любой человек, который хоть раз в жизни сталкивался с хранинием десятичных чисел в поле типа флоат, с тех пор понимает разницу. Значит, если он советует флоат - он не сталкивался. Ну как можно, если ты не сталкивался, влезать с советами?!
 

dnes

Новичок
Фанат

Каюсь - на практике не сталкивался. Сам всегда употреблял decimal. Но чисто в меркантильных интересах, успешно отработав подобный запрос через phpMyАdmin, хотел напроситься на разжевывание. Не вышло - пойду сталкиваться ;)
 

Гриша К.

Новичок
macroz, спасибо за ответ.
sprintf() все таки для целей печати(echo) большо подходит.
Я использовал round(), и делал поля в БД decimal (10), но все равно ошибка, хотя сохранение идет в первой таблице нормально, но из-за того, что в ней не целые чила, сохранени во втарую таблицу не идет, а если я по умолчанию поставлю целые чилса, то сохранени идет в две таблицы.
Ничего не понимаю, почему так.
 

Фанат

oncle terrible
Команда форума
а теперь ещё раз, но внятно.
есди для тебя фраза
хотя сохранение идет в первой таблице нормально, но из-за того, что в ней не целые чила, сохранени во втарую таблицу не идет
то для окружающих - нет.

какая ещё вторая таблица? откуда она взялась?
почему попадание во вторую зависит от первой?

Зачем тут вообще раунд, если всё и так обрежется?
 

Гриша К.

Новичок
Фанат, вы правы Фанат.


Таблица orders:
- orderid
- customerid
- amount [decimal(10)] (cюда записывается переменная $_SESSION['total_price'] (итого), которая равна например, 1215.3404)
- amount_delivery [decimal(10)] (cюда записывается переменная $_SESSION['total_delivery'] (итого с дочтавкой), которая равна например, 1295.3404)
- date

Таблица order_items
- orderid
- id
- item_price [decimal(10)] (Сюда записывается переменная $detail['price'] (цена товара) равная например 350.3114)
- quantity

Запись в таблицу orders идет так:
PHP:
  $date = date('Y-m-d');

@ $query = "insert into orders values
            ('', $customerid, ".$_SESSION['total_price'].", ".$_SESSION['total_delivery'].", '$date')";
  $result = mysql_query($query);

  if (!$result)
    return false;
Вот так передается переменная $orders (поле orderid) из orders в order_items
PHP:
@ $query = "select orderid from orders where 
               customerid = $customerid and 
               amount = ".$_SESSION['total_price']." and
			   amount_delivery = ".$_SESSION['total_delivery']." and
               date = '$date'";
  $result = mysql_query($query);

  if(mysql_numrows($result)>0)
    $orderid = mysql_result($result, 0, 'orderid');
  else
    return false;
Запись в таблицу order_items идет так:
PHP:
  foreach($_SESSION['cart_redox'] as $idredox => $quantity_redox)
  {
    $detail = get_redox_details($idredox);

    $query = "delete from order_items where  
              orderid = '$orderid' and id = '$idredox'";
    $result = mysql_query($query);
    $query = "insert into order_items values
              ('$orderid', '$idredox', ".$detail['price'].", $quantity_redox)";
    $result = mysql_query($query);
    if(!$result)
      return false;
  }

В итоге получается так, что если $_SESSION['total_price'] и $_SESSION['total_delivery'] равны целым числам изначально, то все необходимые данные сохраняются в двух таблицах хорошо, и не важно какое чило записывается во вторую таблицу (order_items) целое или нецелое ($detail['price']).

Но если в первую таблицу (orders) записываюся $_SESSION['total_price'] и $_SESSION['total_delivery'] равные не целым числам, то во вторую таблицу запись не идет вообще.
 

Фанат

oncle terrible
Команда форума
непонятно.
у тебя, вроде, раньше размер был 6,2?
а почему сейчас - 10?
 

Гриша К.

Новичок
Фанат, я просто увеличел размер числа, сделал decimal(10), вы в начале говорили, что неважно указал я количество десятичных знаков или нет, чило будет записываться, и оно действительно записывается.

И даже когда я в таблице orders делал например числовое поле float(6,2) или float(10) или float(6) или decimal(10), и туда записывались переменные с двумя знаками после точки (1250.22), то в таблицу order_items ничего не записывалось.
А если буду записывать в таблицу orders целое чило, то в таблицу order_items записывается любое чило, и неважно какое там будет поле float(6,2) или float(6) или decimal(10).
 

Фанат

oncle terrible
Команда форума
чувак.
по-моему, ты сам запутался, и - что хуже - меня запутал.
в начале говорили, что неважно указал я количество десятичных знаков или нет, чило будет записываться,
ГДЕ я такое говорил?
про количество десятичных знаков я вообще ни слова не сказал.

ответь сначала на вопрос.
почему ты указываешь размер поля без дробной части, если она тебе нужна?
 

Гриша К.

Новичок
Фанат?
никак не надо обрабатывать.
и так сохранится
Я так понял, что вы имели ввиду, что если установлено поле
float (6,2) и я начну записывать туда чило 54.3456, то оно запишется туда без всякой обработки функциями, как 54.35.
Я проверял, это так и есть.
Если я например установлю поле float(6) и буду записывать туда число 54.3456, то оно туда тоже запишется, без ошибок.

Просто смысл в том, получается, что неважно какое я установлю поле в таблице orders - float(6,2), float(6) или float(6,4) - и стану записывать туда любое нецелое число (54.35 или 54.3544), в эту таблицу все запишется, а в таблицу order_items запись не пойдет и неважно чему будет равна переменная $detail['price'], которая туда записывается.
А если в таблицу orders начну записывать целое число, то и в таблицу order_items запишется тоже все.
 

Фанат

oncle terrible
Команда форума
я имел в виду, что для десятичных чисел использовать надо поле DECIMAL
В ТОМ ФОРМАТЕ, КОТОРЫЙ НУЖЕН
и почему ты сделал decimal (10), а не 6,2 или, на худой конец, 10.2 - для мееня загадка!
НЕЛЬЗЯ ХРАНИТЬ ДЕСЯТИЧНЫЕ ЧИСЛА В ПОЛЕ FLOAT!
оно для этого не предназначено!
Почему оно опять всплыло - для меня загадка!
 
Сверху