За последние 24 часа нас посетили 18626 программистов и 1599 роботов. Сейчас ищут 963 программиста ...

Непонятная ошибка в работе функции при обработке формы

Тема в разделе "PHP для новичков", создана пользователем yaroslav_novikov, 13 июл 2010.

  1. yaroslav_novikov

    yaroslav_novikov Активный пользователь

    С нами с:
    13 июл 2010
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Хабаровск
    Здравствуйте!

    Вчера у меня произошла непонятная ситуация - вдруг ни с того ни с сего перестала корректно работать самописная функция. Причём перестала работать достаточно интересно - если функцию вызываешь сразу же при открытии страницы - она раобтает корректно. Но стоит открыть страницу с формой, при обработке уже которой будет выполняться та же функция, так вот эта функция начинает странно себя вести. Функция представляет из себя простой набор операций по преобразованию символов, и в случае когда она вызывается при обработке формы почему-то в качестве результата выходит нужная строка, но почему-то обрезанная на 1 символ в конце! Т.е. на один символ короче, последний, как бы просто обрезается. В чём дело - понять не могу. Или же свести это просто на банальную какую-то ошибку интерпретатора? Хотя веб-сервер и php на нём настроены с конца 2008 года и до сих пор тьфу тьфу сбоев никогда не давали.

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


    IIS 6.0
    PHP 5.2.1


    Привожу мой код:

    Код (Text):
    1.  
    2. <?php
    3. function perevod($word)
    4. {
    5.  $quantity = 32;
    6.  unset($a);
    7.  $a[0] = "а";
    8.  $a[1] = "б";
    9.  $a[2] = "в";
    10.  $a[3] = "г";
    11.  $a[4] = "д";
    12.  $a[5] = "е";
    13.  $a[6] = "ж";
    14.  $a[7] = "з";
    15.  $a[8] = "и";
    16.  $a[9] = "й";
    17.  $a[10] = "к";
    18.  $a[11] = "л";
    19.  $a[12] = "м";
    20.  $a[13] = "н";
    21.  $a[14] = "о";
    22.  $a[15] = "п";
    23.  $a[16] = "р";
    24.  $a[17] = "с";
    25.  $a[18] = "т";
    26.  $a[19] = "у";
    27.  $a[20] = "ф";
    28.  $a[21] = "х";
    29.  $a[22] = "ц";
    30.  $a[23] = "ч";
    31.  $a[24] = "ш";
    32.  $a[25] = "щ";
    33.  $a[26] = "ъ";
    34.  $a[27] = "ы";
    35.  $a[28] = "ь";
    36.  $a[29] = "э";
    37.  $a[30] = "ю";
    38.  $a[31] = "я";
    39.  
    40.  $word = strrev($word);
    41.  $word = str_split($word);
    42.  $word_len = count($word);
    43.  $counter = $word_len;
    44.  unset($new_word);
    45.  $i = 0;
    46.  while ($i < $word_len)
    47.  {
    48.   $g = 0;
    49.   while ($g < $quantity)
    50.   {
    51.  
    52.    if ($word[$i] === $a[$g])
    53.    {
    54.  
    55.     $t1 = $g + $counter;
    56.  
    57.     if ($t1 >= $quantity)
    58.     {
    59.      $t1 = $t1 - $quantity;
    60.     }
    61.     $temp = $a[$t1];
    62.     $new_word = $new_word . $temp;
    63.     $counter = $counter - 1;
    64.    }
    65.    $g++;
    66.   }
    67.   $i++;
    68.  }
    69.  return $new_word;
    70. }
    71.  
    72.      echo "<form name=\"search\" action=\"$PHP_SELF\" method=\"POST\">";
    73.      echo "<input type=\"submit\" name=\"preobraz\" value=\"Преобразовать\">";
    74.      echo "<input type=\"text\" name=\"slovo\" size=\"90\">";
    75.      echo "</form>";
    76.  
    77. if ($preobraz)
    78. {
    79.  echo perevod($slovo);
    80. }
    81.  
    82. ?>
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Зачем столько манипуляций и присваиваний, а?
    PHP:
    1. <?php
    2.  
    3. $letters = range("а", "я");
    4.  
    5. ?>
    И зачем удалять переменную а в теле функции, причем явно в самом начале?
    Подозреваю, что кто-то не догадывается о локальный и глобальных областях.
     
  3. yaroslav_novikov

    yaroslav_novikov Активный пользователь

    С нами с:
    13 июл 2010
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Хабаровск
    по сути дела range выполняет те же самые функции, только в случае использования её процесс упрощается и оптимизируется до 1 строки, я же указывал элементы массива явным образом, что по факту абсолютно ничего не меняет, предварительно выполнив unset на случай "про запас" - если вдруг где-то в памяти от какой-то выполненной до этого программы осталась валяться переменная с таким же именем. На звание мегапрограммиста я не претендую, но думаю что хуже от unset всё равно в любом случае не будет, даже если она и не нужна, то это всего лишь 1 безобидная лишняя операция.
     
  4. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    ты обхясни задачу - чо твоя функци делает, может ты и тут сделал строк 40 лишних? я не удивлюсь ;)
     
  5. yaroslav_novikov

    yaroslav_novikov Активный пользователь

    С нами с:
    13 июл 2010
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Хабаровск
    изначально есть слово, но оно как бы "закодировано" с использованием простого алгоритма "переворачивания" букв и хождения по алфавиту на число шагов вперед или назад, равное положению буквы в слове. Функция "расшифровывает" это слово и переводит его в человеческий вид
     
  6. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    а что надо ввести и что я долежн получить на выходе? чтобы проверить работу? :)
     
  7. yaroslav_novikov

    yaroslav_novikov Активный пользователь

    С нами с:
    13 июл 2010
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Хабаровск
    к примеру, слово йжрхста
     
  8. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    получается "зшцщуик" ?! :D
     
  9. yaroslav_novikov

    yaroslav_novikov Активный пользователь

    С нами с:
    13 июл 2010
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Хабаровск
    да, ага, пардон, перепутал, надо попробовать "ярослав", тогда будет выходить йжрхста (т.е. я изначально неправильно сказал - она нормальное слово наоборот переводит в "закодированное" слово)