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

Тема в разделе "PHP", создана пользователем rasandrey, 3 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. rasandrey

    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()) ;
                        }
     
  2. sublimity

    sublimity Создатель

    Регистр.:
    7 янв 2008
    Сообщения:
    23
    Симпатии:
    3
    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 ....
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    bigint - может хранить намного больше чем 2147483647*2, так что скопастил неоттуда

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

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

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37
    в php есть расширения для работы с большими числами
    http://translate.googleusercontent.com/translate_c?hl=ru&langpair=en|ru&u=http://www.php.net/manual/en/ref.gmp.php&rurl=translate.google.com.by&twu=1&usg=ALkJrhi0Pawh5Gv6pqvw_fjCnCbuamkNOg
    в мускула беззнаковый бигинт
     
    sublimity нравится это.
  5. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    Нет: первое значение в таблице 2010051805180001 , дальше все значения одинаковые 2010051805180000.

    Ничего не выводится при использовании sprintf('%.0f', $n);
     
  6. sublimity

    sublimity Создатель

    Регистр.:
    7 янв 2008
    Сообщения:
    23
    Симпатии:
    3
    bigint тут совсем не приделах :)
    А скопастил именно то что нужно ...
    PHP не межет выдать такое большое число.

    rasandrey

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

    id - autoincrement (bigint) - это не через чур много ?
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Ладно, 2147483647 - верно, но только для формата integer. Наводящимй вопрос- какого формата число 2010051805180001 ?:)
    пхп всё верно делает- вперый раз посылается запрос
    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 на дату и пытки её изменить... если действительно необходито большие числа перить- то извиняюсь)
     
    rasandrey нравится это.
  8. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    теперь все ок, я пытался просто вывести так:
    PHP:
    echo printf('$.0f'$card_ot)
    , выводились пустые строки. Если добавлять в базу через функцию, то все отображается так как нужно.

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

    Спасибо
     
Статус темы:
Закрыта.