Генератор ИНН

Тема в разделе "PHP", создана пользователем fastik, 19 янв 2011.

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

    fastik Постоялец

    Регистр.:
    8 дек 2008
    Сообщения:
    77
    Симпатии:
    6
    Помогите начинающему) Нужно сделать генератор ИНН, чтобы проходил проверку контрольных чисел, вот посмотрел в вики как проверить, написал проверку, а вот как сделать генератор че-то не догоняю. Еще желательно, чтобы можно было вводить первые две цифры, т.е. выбирать код субъекта. Выложу код проверки ИНН.

    PHP:
    <?php
    $inn
    =$_POST["num"];
    if (empty(
    $inn))
    {
    echo 
    "Введите ИНН, нечего проверять";
    }
    else
    {
    $inn substr($inn,0,11);
      
    $inn htmlspecialchars(stripslashes($inn));
    };

    $arr=str_split($inn);
    $n2=($arr[0]*7+$arr[1]*2+$arr[2]*4+$arr[3]*10+$arr[4]*3+$arr[5]*5+$arr[6]*9+$arr[7]*4+$arr[8]*6+$arr[9]*8)%11;
    $n1=($arr[0]*3+$arr[1]*7+$arr[2]*2+$arr[3]*4+$arr[4]*10+$arr[5]*3+$arr[6]*5+$arr[7]*9+$arr[8]*4+$arr[9]*6+$arr[10]*8)%11
       if (
    $n2<>$arr[10]and $n1<>$arr[11]) 
       {
             echo 
    "Не верный ИНН<br>".$inn;}
        else
        {
        echo 
    "Верный ИНН<br>".$inn;
        }

    ?>

     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    если верить википедии вы потеряли последнее действие в вычислении н1 и н2, а именно деление с остатком на 10
    PHP:
    $n2= (( ......... )%11 ) % 10;
    $n1= (( ..........)%11 ) % 10;

     
     
  3. kkkoopp

    kkkoopp Постоялец

    Регистр.:
    18 май 2010
    Сообщения:
    121
    Симпатии:
    24
    судя по алгоритму генератор сделать просто: нужно сгенерировать 10 цифр, далее по вашим формулам рассчитать $n1 и $n2, и прилепить их в конец цифр.

    PHP:
    if ($n2<>$arr[10]and $n1<>$arr[11])
    Здесь нужно использовать не and, а xor, потому что если одна из цифр совпадет, а другая нет, то оно сработает как правильно.

    Генерация:
    PHP:
    $i 1;
    $arr '';
    while (
    $i <= 10){
        
    $arr .= mt_rand(0,9);
        
    $i++;
    }
    $n2=(($arr[0]*7+$arr[1]*2+$arr[2]*4+$arr[3]*10+$arr[4]*3+$arr[5]*5+$arr[6]*9+$arr[7]*4+$arr[8]*6+$arr[9]*8)%11)%10;
    $n1=(($arr[0]*3+$arr[1]*7+$arr[2]*2+$arr[3]*4+$arr[4]*10+$arr[5]*3+$arr[6]*5+$arr[7]*9+$arr[8]*4+$arr[9]*6+$n2*8)%11)%10;

    $arr .= $n2.$n1;
    echo 
    $arr;
     
    fastik нравится это.
  4. fastik

    fastik Постоялец

    Регистр.:
    8 дек 2008
    Сообщения:
    77
    Симпатии:
    6
    Генерация работает, за что спасибо, но вот хотелось бы немного по подробнее, именно поэтому тема в разделе для новичков. Не понятен только почему вот это вставлено: $n2*8 это типа еще одно случайное число?
    И еще хотелось бы узнать как реализовать возможность указания первых 2 или 4 цифр? а то что-то я пробую, а у меня пишет, что ИНН не правильный, проверяю не через свою форму)
    Вот как думал сделать, но проверку не проходит:

    PHP:
    $gen=$_POST["for"];
    if (empty(
    $gen))
    {
    echo 
    "Введите 4 первые цифры";
    }
    else
    {
    $gen htmlspecialchars(stripslashes($gen));
    };    
    $genarr=str_split($gen);
    $i 1
    $arr ''
    while (
    $i <= 6){ 
        
    $arr .= mt_rand(0,9); 
        
    $i++; 

    $n2=(($genarr[0]*7+$genarr[1]*2+$genarr[2]*4+$genarr[3]*10+$arr[4]*3+$arr[5]*5+$arr[6]*9+$arr[7]*4+$arr[8]*6+$arr[9]*8)%11)%10
    $n1=(($genarr[0]*3+$genarr[1]*7+$genarr[2]*2+$genarr[3]*4+$arr[4]*10+$arr[5]*3+$arr[6]*5+$arr[7]*9+$arr[8]*4+$arr[9]*6+$n2*8)%11)%10
    $arr $genarr[0].$genarr[1].$genarr[2].$genarr[3].$arr;
    $arr .= $n2.$n1
    echo 
    "<br><br>".$arr;  
    Одну ошибку обнаружил сам: $arr[4] надо начинать с $arr[0] и так далее, но все равно не проходит проверку.


    Все работает, спасибо еще раз.
     
  5. kkkoopp

    kkkoopp Постоялец

    Регистр.:
    18 май 2010
    Сообщения:
    121
    Симпатии:
    24
    Потому что мы генерируем 10 цифр, а $n2 - это одиннадцатая цифра, для того чтобы найти $n1 (во второй формуле), нужно 11 цифр, поэтому вставляем $n2 одиннадцатой.

    PHP:
    $arr $_POST["for"];

    if (!
    preg_match ('/^[0-9]{4}$/'$arr)){ // проверяем строку, должно быть точно 4 цифры без посторонних символов
        
    echo "Введите 4 первые цифры";
    } else {
        
    $i 1;
        while (
    $i <= 6){
            
    $arr .= mt_rand(0,9);
            
    $i++;
        }
        
    $n2=(($arr[0]*7+$arr[1]*2+$arr[2]*4+$arr[3]*10+$arr[4]*3+$arr[5]*5+$arr[6]*9+$arr[7]*4+$arr[8]*6+$arr[9]*8)%11)%10;
        
    $n1=(($arr[0]*3+$arr[1]*7+$arr[2]*2+$arr[3]*4+$arr[4]*10+$arr[5]*3+$arr[6]*5+$arr[7]*9+$arr[8]*4+$arr[9]*6+$n2*8)%11)%10;

        
    $arr .= $n2.$n1;
        echo 
    "<br><br>".$arr;
    }
     
Статус темы:
Закрыта.