Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принципиальные отличия float и intval 
:(
    Опции темы
sTa1kEr
Дата 3.11.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



capitan, для целых чисел нужно использовать intval, для вещественных floatval, но никак не иначе. При работе с большими целыми числами на 32х существуют соответствующие экстеншены приведенные выше. Для проверки является ли строка числом есть функция http://php.net/is_numeric

Цитата(bars80080 @  3.11.2009,  16:53 Найти цитируемый пост)
100%-вариант 

Код

$_POST['id'] = "-1";

PM MAIL   Вверх
Simpliest
Дата 3.11.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



capitan, можешь применять и регулярку. Тогда смело забьешь на число значащих цифр.

Вопрос в том, что в твоих стандартных проектах ты не упрешься даже в лимит int.




--------------------
user posted image
PM   Вверх
bars80080
Дата 3.11.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(sTa1kEr @  3.11.2009,  15:13 Найти цитируемый пост)
100%-вариант 



код PHP
1:

$_POST['id'] = "-1";

100%-вариант. получим 1, ибо id стандартно - unsigned

Добавлено через 2 минуты и 2 секунды
Цитата(Simpliest @  3.11.2009,  15:15 Найти цитируемый пост)
Вопрос в том, что в твоих стандартных проектах ты не упрешься даже в лимит int.

я упёрся. и не потому, что у меня такая большая база, а потому что у других большая база. 
платёжная система сбрасывает свои данные под уникальным идентификатором, который я пишу к себе в базу. а у них там уже под 20 знаков
PM MAIL WWW   Вверх
Simpliest
Дата 3.11.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(bars80080 @  3.11.2009,  17:53 Найти цитируемый пост)
а у них там уже под 20 знаков 

А он у них не цифровой. Там что хоть 65000 знаков.


--------------------
user posted image
PM   Вверх
bars80080
Дата 3.11.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(Simpliest @  3.11.2009,  17:04 Найти цитируемый пост)
А он у них не цифровой

да ладно. в моём случае чисто цифровой
PM MAIL WWW   Вверх
Simpliest
Дата 3.11.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



bars80080
Я некорректно выразился, но все равно верь мне smile я в банке работал.... не в трехлитровой smile

Счета, номера карт - не являются числами.
Да, они обычно состоят из одних цифр - но это строки. И исключительно строки.

Добавлено через 1 минуту и 5 секунд
GUID, ID транзакции - тоже не числа. 


--------------------
user posted image
PM   Вверх
bars80080
Дата 3.11.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(Simpliest @  3.11.2009,  17:18 Найти цитируемый пост)
я в банке работал.... не в трехлитровой smile
Счета, номера карт - не являются числами.

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


Simpliest, вот серьёзно, насколько вы лучше меня можете знать приходящий мне формат данных, если я даже не указал о какой системе веду речь?
PM MAIL WWW   Вверх
sTa1kEr
Дата 3.11.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(bars80080 @  3.11.2009,  18:53 Найти цитируемый пост)
100%-вариант. получим 1, ибо id стандартно - unsigned

В каком, простите, месте это стандартно? 
Но в любом случае - это не корректный способ проверки числа.

Цитата(bars80080 @  3.11.2009,  20:08 Найти цитируемый пост)
Simpliest, вот серьёзно, насколько вы лучше меня можете знать приходящий мне формат данных, если я даже не указал о какой системе веду речь? 

В PHP любые данные из-вне поступают в виде строк.

Это сообщение отредактировал(а) sTa1kEr - 3.11.2009, 20:04
PM MAIL   Вверх
solenko
Дата 3.11.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(sTa1kEr @  3.11.2009,  15:13 Найти цитируемый пост)
для целых чисел нужно использовать intval, для вещественных floatval, но никак не иначе. 

Почему? Почему не (int) и (float) соответственно?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
youri
Дата 3.11.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(sTa1kEr @  3.11.2009,  19:59 Найти цитируемый пост)
Но в любом случае - это не корректный способ проверки числа.

так это не способ проверки числа вообще, это способ использования переданного id. Только запихнуть нужно куда-нибудь эти манипуляции, в функцию/класс

Цитата(sTa1kEr @  3.11.2009,  19:59 Найти цитируемый пост)
В каком, простите, месте это стандартно? 

думаю, "стандартно" нужно понимать как "обычно". В mysql primary key + auto_increment не может создать отрицательный id. А что бывает необходимость в отрицательных id?
PM   Вверх
sTa1kEr
Дата 3.11.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(solenko @  3.11.2009,  21:15 Найти цитируемый пост)
Почему? Почему не (int) и (float) соответственно? 

Само собой разумеется, что можно использовать (int) и (float). Я лишь имел ввиду то-же самое, что за минуту до меня сказал Ипатьев.

Добавлено через 10 минут и 13 секунд
Цитата(youri @  3.11.2009,  21:21 Найти цитируемый пост)
так это не способ проверки числа вообще, это способ использования переданного id.

Да, прошу прощенья, изначально речь шла исключительно об ID. Но суть моего сообщения была в том, что таким способом можно получить заведомо не правильный ID, а это в свою очередь может привести к плачевным последствиям.

Цитата(youri @  3.11.2009,  21:21 Найти цитируемый пост)

думаю, "стандартно" нужно понимать как "обычно". В mysql primary key + auto_increment не может создать отрицательный id.

С таким же успехом можно сказать, что стандартно ID - это строка из 36 символов, т.к. обычно в MSSQL primaty key - это GUID.
Цитата(youri @  3.11.2009,  21:21 Найти цитируемый пост)
А что бывает необходимость в отрицательных id? 

Да, бывает потребность в совершенно разных ID.

PM MAIL   Вверх
Simpliest
Дата 3.11.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(bars80080 @  3.11.2009,  19:08 Найти цитируемый пост)
но данные о проведённых платежах приходят в виде чисел

Цитата(bars80080 @  3.11.2009,  19:08 Найти цитируемый пост)
 особо говорено, что id платежа - уникальный идентификатор состоящий исключительно из цифр

Я же сказал уже
Цитата(Simpliest @  3.11.2009,  18:18 Найти цитируемый пост)
Я некорректно выразился

И поправился
Цитата(Simpliest @  3.11.2009,  18:18 Найти цитируемый пост)
Счета, номера карт - не являются числами.
Да, они обычно состоят из одних цифр - но это строки. И исключительно строки.


Цитата(bars80080 @  3.11.2009,  19:08 Найти цитируемый пост)
я ставлю себе bigint и в ус не дую

И плохо. Потому что это 64-битное целое и таким образом ты можешь хранить только 18ти-значные вещи (19я цифра может быть единицей) состоящие исключительно из цифр.
Например, у нас счет 14ти-символьный.
А у вас в России он уже может быть 20ти-символьным (он дейтствительно 20тизначный, но некоторые банки сокращают внутренний счет на несколько цифр)
Номера карт распространенных МПС - 16 символов. Но есть варианты и с 20тью и даже алфавитно-цифровые

Чтобы понять что счет это не число - можешь прочитать хотя бы его определение у вас
Рассчетный счет

Цитата(bars80080 @  3.11.2009,  19:08 Найти цитируемый пост)
Simpliest, вот серьёзно, насколько вы лучше меня можете знать приходящий мне формат данных, если я даже не указал о какой системе веду речь
Для того чтобы знать что обожжешься совершенно не нужно знать какая температура костра 500 или 2000 градусов.
Речь идет о том, что UID,ID, GUID, счета, номера карточек, серийные номера и т.д. и т.п. - не являются числами хотя и могут состоять исключительно из цифр.

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

В случае с MySQL вас всех вводит в заблуждение автоинкрементное целочисленное поле в качестве sequence.
В более взрослых базах это может быть вообще не число (Oracle, Interbase/Firebird, DB2)




--------------------
user posted image
PM   Вверх
bars80080
Дата 4.11.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(sTa1kEr @  3.11.2009,  18:59 Найти цитируемый пост)
В каком, простите, месте это стандартно? 

у вас id бывают отрицательные?


Цитата(sTa1kEr @  3.11.2009,  18:59 Найти цитируемый пост)
Но в любом случае - это не корректный способ проверки числа.

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


Цитата(sTa1kEr @  3.11.2009,  18:59 Найти цитируемый пост)
В PHP любые данные из-вне поступают в виде строк.

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


Цитата(youri @  3.11.2009,  19:21 Найти цитируемый пост)
так это не способ проверки числа вообще, это способ использования переданного id

 smile 

Цитата(sTa1kEr @  3.11.2009,  19:23 Найти цитируемый пост)
Но суть моего сообщения была в том, что таким способом можно получить заведомо не правильный ID

не понял. каким образом из этого:
Код

if(!empty($_POST['id'])) $id = preg_replace('/[^0-9]/', '', $_POST['id']);
if(empty($id)) $id = 0;

может получиться не корректный id? 


Цитата(Simpliest @  3.11.2009,  20:17 Найти цитируемый пост)
И плохо. Потому что это 64-битное целое и таким образом ты можешь хранить только 18ти-значные вещи (19я цифра может быть единицей) состоящие исключительно из цифр.
Например, у нас счет 14ти-символьный.
А у вас в России он уже может быть 20ти-символьным (он дейтствительно 20тизначный, но некоторые банки сокращают внутренний счет на несколько цифр)
Номера карт распространенных МПС - 16 символов. Но есть варианты и с 20тью и даже алфавитно-цифровые

я сейчас посмотрел, они у меня 15-значные


Цитата(Simpliest @  3.11.2009,  20:17 Найти цитируемый пост)
Чтобы понять что счет это не число - можешь прочитать хотя бы его определение у вас

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

Цитата(Simpliest @  3.11.2009,  20:17 Найти цитируемый пост)
Речь идет о том, что UID,ID, GUID, счета, номера карточек, серийные номера и т.д. и т.п. - не являются числами хотя и могут состоять исключительно из цифр

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

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

вот скажи, можно ли придумать универсальный метод проверки на корректность для входящего идентификатора - состоящего из одних цифр и для идентификатора - БЦБЦЦЦЦ-ЦЦ?
PM MAIL WWW   Вверх
Nigel
Дата 4.11.2009, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



Собственно, зачем используется такая конструкция (int)$value? Посмотрите 1-й пост, ТС использует этот как фильтр
в своих запросах. А нужно ли это? Все нормальные либы используют биндинг для добавления переменных в запрос.

Многие утверждают, что данные должны поступать в бд в неизменном виде, сами при этом нарушая свой принцип подобными 

конструкциями.

ТС аргументировал такое поведение нагруженными проектами. Интересно узнать, какие проекты он считает 

нагруженными?;) На нормальные сервера ставят 64бита, и не изза того, что вы можете выйти за диапазон значений, а 

просто тупо потому, чтобы обеспечить нормальную работу с большими объемами памяти. В этом случае никаких проблем 

начальная конструкция не вызовет.

А вот используя float, проблемы как раз получить можно. Это и точка(запятая), связанная с локализацией,
и представление числа в виде строки, и выполнение арифметических операций, в результате чего будете получать
совсем не то, что ожидаете.

К тому же есть люди, которые используют везде (float), а при этом тип столбца у них в БД какой-нить smallint.
А еще забавно, когда пишут абстрактный слой для бд, при этом сами запросы в никакой другой бд работать не будут,
кроме mysql.
Ради чего усилия тогда, спрашивается?

Кто-то говорит "Я везде использую bigint. Я от всего застрахован". Может тогда для строк заюзать везде longtext?
Чем больше диапазон, тем больше требуется памяти для хранения. А нужно ли это?


Может быть, не стоит создавать дополнительных проблем? Может быть, все на самом деле проще...

PM MAIL   Вверх
youri
Дата 4.11.2009, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(sTa1kEr @  3.11.2009,  20:23 Найти цитируемый пост)
Но суть моего сообщения была в том, что таким способом можно получить заведомо не правильный ID, а это в свою очередь может привести к плачевным последствиям.

Цитата(sTa1kEr @  3.11.2009,  20:23 Найти цитируемый пост)
С таким же успехом можно сказать, что стандартно ID - это строка из 36 символов, т.к. обычно в MSSQL primaty key - это GUID.

я считаю, что bars80080 выбрал неподходящее слово. Более подходящее слово - обычно

Цитата(bars80080 @  4.11.2009,  00:39 Найти цитируемый пост)
тогда вообще ваши ремарки бессмыслены. поступают строки, делаю из них что хочу

не забывая про диапазон значений в этих строках

Цитата(Nigel @  4.11.2009,  01:25 Найти цитируемый пост)
Все нормальные либы используют биндинг для добавления переменных в запрос.

holy war detected!
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1055 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.