Хранение денюшних единиц в бд как decimal(10,2)

_ne_scaju_

Всем привет, суть вопроса: если я в форму указываю любую цифру то запись правильно вставляется в базу как я указал значение в поле, а вот если я поле оставляю пустым и отправлю форму то меня закидает ошибками, что лучше мне сделать чтобы такого не было? Сделать проверку этого поля? is_numeric поможет ли мне? Посоветуйте дельный совет в моей ситуации.

 

Dimon2x

можно поле сделать по умолчанию null

 

_ne_scaju_

null не помогает, уже пробовал.

 

artoodetoo

отвечаешь как юзер, а не как программист.

что получил, когда пробовал, конкретно? а что хотел получить?

 

_ne_scaju_

а что я должен был ответить на такой ответ?
Вообще я пробовал разные типы данных например float, int, но ситуация осталась прежней, и ставил эти поля то в null то в 0 все ровно ошибка одна и та же: Incorrect decimal value: » for column ‘price’ at row 1 in (в том случае если я не указываю цифру в поле и оставляю это поле пустым)
при не заполнении поля я хочу получить, значение по умолчанию после отправки формы, ну и понятно при заполнении поля я хочу получить значение которое указываю в поле.

 

artoodetoo

тебе подсказали сразу, но ты, видимо, не понял вот этого:

кроме типа у поля таблицы есть атрибут NULL или NOT NULL. если твоя цель допустить пустое значение, то объяви поле как NULL. когда поле объявлено как NULL и добавляется пустое значение, то фактически сохранится пустое значение. без ошибки!

когда поле NOT NULL, а во вставке пусто, то добавляется значение из атрибута DEFAULT.

проверь сначала в phpmyadmin разные случаи INSERT с пустыми значениями. потом уже пробуй через php.

 

_ne_scaju_

показываю скриншот, что я поле выставил в null. в атрибутах мне не доступно not null или просто null

 

artoodetoo

Ну а вообще, почему бы на стороне PHP не проверять на пустоту и не заменять на «значение по умолчанию»?

PHP:
  1. $num = !empty($_POST[‘num’])
  2.     ? floatval($_POST[‘num’])
  3.     : 0; // по умолчанию 0

— Добавлено —
или (если у тебя NULL-able поле)

PHP:
  1. $num = !empty($_POST[‘num’])
  2.     ? floatval($_POST[‘num’])
  3.     : ‘NULL’; // по умолчанию пустое значение

— Добавлено —
P.S. я бы предпочёл не скриншот из какого-то блин мастера таблиц, а нормальный вид SQL, то есть как «CREATE TABLE xxx(…)». это более информативно, а еще лучше ссылку на песочницу в http://sqlfiddle.com/

 

_ne_scaju_

спасибо, только что попробовал вставить запись в sql у меня и со значением null запись вставилась и просто по умолчанию 0 тоже вставилась, значит проблемы в скрипте.

 

artoodetoo

В некоторых БД пустая строка интерпретируется как NULL, но для MySQL это разные вещи.

Ну значит подсовывай в запрос буквально нужное значение по умолчанию вместо литерала пустой строки. Как варианты — 0 или NULL.

 

_ne_scaju_

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

 

artoodetoo

Про значения по умолчанию:
http://sqlfiddle.com/#!9/8c1579/1
если поле вообще не упомянуто в INSERT, то сработает значение из атрибута DEFAULT.

 

Ganzal

может какой-то «класс для работы с бд» заменяет нулевой тип на ноль?

 

artoodetoo

@Ganzal похоже там всё проще: нет никакой обработки до вставки. Всегда строковое значение подставляется в INSERT. Как вариант, пустая строка.

ТС ожидает, что сам MySQL позаботится о значении по умолчанию. Но default field value не срабатывает, а сигналится ошибка, т.к. MySQL не умеет интерпретировать » как число и не использует правило default, когда в запросе есть значение поля. Любое блин значение.

Default будет работать если это поле вообще не присутствует в INSERT. Ни null, ни » не канают. Попробуй в моей песочнице поиграть.
— Добавлено —
Что блин характерно, для auto_increment поля можно использовать null на вставке. Интерпретируется как «мистер мускуль, пожалуйста вычисли это сам».
А для прочих полей null это буквально null, а не как «отказ от ответственности».

 

_ne_scaju_

Вы правы по сути в базу приходит значение пустой строки, `prise` = ‘ ‘; а точнее даже не доходит, так как вы и сказали что mysql не интерпретирует числовые значение, не подставляет значение по умолчанию. В лучшем случае поставить проверку до вставки, пример вы уже показали. Буду пробовать, спасибо.

 

_ne_scaju_

не получается обработать поле правильно.
Я тут подумал если я укажу в value=»0″ то даже если я забыл заполнить цену будет приходить значение 0 в базу, это хорошая практика?
Или лучше проверять поле? Хотя думаю что вы ответите конечно лучше проверять.

 

_ne_scaju_

Все разобрался с этим вопросом, помогли мне)
Решение было принято взять функцию ctype_digit() и с ней поработать)
Всем спасибо за обсуждение)

 

Sail

@_ne_scaju_, лучше уж is_numeric()
Так-то проблема лишь в том (как и указано в тексте ошибки), что пытаетесь в поле с типом decimal записать строку » (пустую строку).
В этом случае лишь требуется преобразовать полученное из формы значение либо в число, в которое эта строка может быть преобразована, либо в значение по-умолчанию, если получана просто строка из набора символов, не являющихся числами, десятичной точкой или знаком плюс/минус. И если не критично состояние «не определено» для этого поля в записи базы данных, то в данном случае лучше использовать значение 0 (ноль).
Фактически, ответ был дан в сообщении за номером 8 (в его первой части). Только ознакомьтесь с правилами преобразования строк в числа… (если пройтись по ссылочкам, сначала — по функции, затем — из описания функции).
Либо в случае, если поле для числа в форме заполнено набором не цифровых символов можно попросить пользователя внимательно заполнить поля формы.

 

_ne_scaju_

Возвращаюсь к этой теме а разве функция floatval() проверит например 4.00 число для decimal() ?
и вообще у меня как получается при редактировании данных в поле из базы записывается значение 4.00, перед обновлением записи выполняю проверку:

PHP:
  1. $num = !empty($post[‘price’]) ? floatval($post[‘price’]) : ‘NULL’;

в $num попадает значение 400 из-за этого в базе запись для этого поля изменяется на 400.00
что мне можно сделать чтобы при обновлении данных значение которое изначально было оставалось таким же?

 

_ne_scaju_

Так вроде разобрался перед вставкой делаю эту проверку которая выше, и для поля вместо FILTER_SANITIZE_NUMBER_FLOAT указал FILTER_DEFAUL фильтер, пока работает корректно проверил, дальше посмотрим.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *