Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скрипт работает через раз
Форумы портала PHP.SU » » Вопросы новичков » Скрипт работает через раз

Страниц (1): [1]
 

1. improbable - 30 Мая, 2013 - 13:37:25 - перейти к сообщению
Функция возвращает строку заданной длины из случайных цифр, букв (uc и lc) и символов.

Спойлер (Отобразить)


Иногда (часто, очень часто) строка прерывается, не доходя до нужной длины. Почему - я не знаю, уже всю голову сломал. И в код страницы смотрел, там тоже нету. Бывает и такое, что она сокращается в 2 раза и больше.

Вот пример:

Спойлер (Отобразить)


Вот сама функция:

PHP:
скопировать код в буфер обмена
  1.  
  2. function generate_string ($length) {
  3.  
  4.         if (!isset($length)) {
  5.                 return false; # Если длина не указана
  6.         }
  7.        
  8.         $i = 0; $string = '';
  9.        
  10.         while ($i++ < $length) { # Каждый цикл присоединяет полученный символ к строке
  11.                 switch (rand (1,4)) { # Определяет, какой тип символов будет сгенерирован
  12.                         case 1:
  13.                                 $string .= rand (0, 9);
  14.                                 break;
  15.                         case 2:
  16.                                 $array = range ('A', 'Z');
  17.                                 $rand_keys = array_rand ($array);
  18.                                 $string .= $array[$rand_keys];
  19.                                 break;
  20.                         case 3:
  21.                                 $array = range ('a', 'z');
  22.                                 $rand_keys = array_rand ($array);
  23.                                 $string .= $array[$rand_keys];
  24.                                 break;
  25.                         case 4:
  26.                                 $array = array ('~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', ',', '.', '/', '{', '}', '"', ':', ';', '<', '>', '?');
  27.                             $rand_keys = array_rand ($array);
  28.                                 $string .= $array[$rand_keys];
  29.                                 break;
  30.                 }
  31.                 }
  32. return $string; unset($string, $array, $rand_keys);
  33. }
  34.  
  35. $string = generate_string(500);
  36. $str_len = mb_strlen($string); # В целях отладки считаю, сколько символов в строке
  37.  
  38. echo $string . " has $str_len characters" . "\r\n";

(Добавление)
Сократил массив символов до

CODE (htmlphp):
скопировать код в буфер обмена
  1. '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '{', '}'


и всё теперь работает нормально) но всё же интересно, что именно было не так..
2. esterio - 30 Мая, 2013 - 14:09:35 - перейти к сообщению
improbable пишет:
return $string; unset($string, $array, $rand_keys);

unset никогда не виполнится.
Цитата:
после return-а жизни нет
3. Мелкий - 30 Мая, 2013 - 14:21:31 - перейти к сообщению
В простом тесте ничего не найдено.
PHP:
скопировать код в буфер обмена
  1. for ($i=0; $i<50000; $i++) {
  2.         $string = generate_string(500);
  3.         if (mb_strlen($string,'UTF8')!=500) {
  4.                 echo $i,PHP_EOL;
  5.                 var_dump($string);
  6.                 break;
  7.                 }
  8.         }


А раз помогло вот это:
improbable пишет:
Сократил массив символов до

Значит проблема всё-таки в другом месте, дальше по логике скрипта.
4. EuGen - 30 Мая, 2013 - 14:25:37 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. while(strlen($sData=generate_string(500))==500);
  2. var_dump($sData);

- приводит к fatal (по времени) - подозреваю, что это не вписывается в определение "частые сбои", потому ошибка была, скорее всего, в другом месте.
5. improbable - 30 Мая, 2013 - 14:28:03 - перейти к сообщению
esterio пишет:
unset никогда не виполнится.

спасибо, не заметил
(Добавление)
EuGen пишет:
потому ошибка была, скорее всего, в другом месте.

что-то с символами было связано

 

Powered by ExBB FM 1.0 RC1