Сложение больших чисел и вставка в БД

Статус
В этой теме нельзя размещать новые ответы.

rasandrey

Участник
Регистрация
2 Апр 2009
Сообщения
214
Реакции
6
В общем есть у меня 2 таких числа :
2010051805180001 и 2010051805182424

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

делаю так:

PHP:
					for ( $card_ot ; $card_ot <= $card_do ; $card_ot++ ) {
						mysql_query("insert into ".CARD_TABLE." values('','".$card_ot."','0')") or die(mysql_error()) ;
					}

где $card_ot = 2010051805180001, а $card_do=2010051805182424

Но чего-то вставляется вовсе не такой промежуток чисел. В БД 3 поля : id - autoincrement (bigint), nomer - bigint(20), enabled - int(11)

числа приходят из формы и проходят такую валидацию:
$card_ot = str_replace(' ','',$_POST['card_ot']) ;
$card_do = str_replace(' ','',$_POST['card_do']) ;

Решил сделать эксперимент :
добавил вывод числа при добавлении в БД и получил такой ответ 2.01005180518E+15 !!!
PHP:
					for ( $card_ot ; $card_ot <= $card_do ; $card_ot++ ) {
						echo $card_ot.'<br />' ;
						mysql_query("insert into ".CARD_TABLE." values('','".$card_ot."','0')") or die(mysql_error()) ;
					}
 
The maximum value depends on the system.
32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval('1000000000000') will return 2147483647.

либо делить на 1000 или char ....
 
The maximum value depends on the system.
32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval('1000000000000') will return 2147483647.

либо делить на 1000 или char ....
bigint - может хранить намного больше чем 2147483647*2, так что скопастил неоттуда

Но чего-то вставляется вовсе не такой промежуток чисел.
Вчём это проявляется? ошибка\пустые данные?

добавил вывод числа при добавлении в БД и получил такой ответ 2.01005180518E+15 !!!
Смотрел через пхп? это его стандартный вывод больших чисел. попробуй через
PHP:
sprintf('%.0f', $n);
 
в php есть расширения для работы с большими числами

в мускула беззнаковый бигинт
 
Вчём это проявляется? ошибка\пустые данные?
Смотрел через пхп? это его стандартный вывод больших чисел. попробуй через
PHP:
sprintf('%.0f', $n);

Нет: первое значение в таблице 2010051805180001 , дальше все значения одинаковые 2010051805180000.

Ничего не выводится при использовании sprintf('%.0f', $n);
 
bigint - может хранить намного больше чем 2147483647*2, так что скопастил неоттуда
bigint тут совсем не приделах :)
А скопастил именно то что нужно ...
PHP не межет выдать такое большое число.

rasandrey

Изменить алгоритм... от пользователя-формы в for c insert`om,
а если будет с 1 до миллиона ...
или
2010051805182424 - 2010051805180001 = 2423
найти общие СТРОКИ в двух параметрах т.е. находим "201005180518",
остальное перекидываем в X1 и X2
И в insert вставлять объединением строк.

id - autoincrement (bigint) - это не через чур много ?
 
bigint тут совсем не приделах :)
А скопастил именно то что нужно ...
PHP не межет выдать такое большое число.
Ладно, 2147483647 - верно, но только для формата integer. Наводящимй вопрос- какого формата число 2010051805180001 ?:)
Нет: первое значение в таблице 2010051805180001 , дальше все значения одинаковые 2010051805180000.
Ничего не выводится при использовании sprintf('%.0f', $n);
пхп всё верно делает- вперый раз посылается запрос
HTML:
insert into ".CARD_TABLE." values('','2010051805180001',
НО затем пхп прибавляет к СТРОКЕ 2010051805180001 (данные из пост- всегда строка) и выдаёт такой запрос
HTML:
insert into ".CARD_TABLE." values('','2.01005180518E+15 ',
Если привести 2.01005180518E+15 к нормальному виду, будет как раз 2010051805180000.

Я надеюсь использовали не sprintf('%.0f', $n); а sprintf('%.0f', $card_ot ); ?
PHP:
 mysql_query("insert into ".CARD_TABLE." values('','".sprintf('%.0f', $card_ot)."','0')") or die(mysql_error()) ;
+---------
а вообще, мне кажется что вы х*йнёй тут занимаетесь) сложно конечно судить не зная ничего, но уж очень похоже 2010 05 18 05 18 0001 на дату и пытки её изменить... если действительно необходито большие числа перить- то извиняюсь)
 
PHP:
 mysql_query("insert into ".CARD_TABLE." values('','".sprintf('%.0f', $card_ot)."','0')") or die(mysql_error()) ;
теперь все ок, я пытался просто вывести так:
PHP:
echo printf('$.0f', $card_ot)
, выводились пустые строки. Если добавлять в базу через функцию, то все отображается так как нужно.

+---------
а вообще, мне кажется что вы х*йнёй тут занимаетесь) сложно конечно судить не зная ничего, но уж очень похоже 2010 05 18 05 18 0001 на дату и пытки её изменить... если действительно необходито большие числа перить- то извиняюсь)

Я понимаю, что такой ерундой занимаются очень редко, но сейчас это просто необходимо. С датой это никак не связано. В БД попадают номера кредитных карточек, состоящих из 16 знаков. А добавляю я промежуток мужду каким-то номером и каким-то, но 16-ти значным :)

Спасибо
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху