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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Скрипт работает через раз

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
improbable
Отправлено: 30 Мая, 2013 - 13:37:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Функция возвращает строку заданной длины из случайных цифр, букв (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. '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '{', '}'


и всё теперь работает нормально) но всё же интересно, что именно было не так..

(Отредактировано автором: 30 Мая, 2013 - 13:44:53)

 
 Top
esterio
Отправлено: 30 Мая, 2013 - 14:09:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




improbable пишет:
return $string; unset($string, $array, $rand_keys);

unset никогда не виполнится.
Цитата:
после return-а жизни нет
 
 Top
Мелкий Супермодератор
Отправлено: 30 Мая, 2013 - 14:21:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




В простом тесте ничего не найдено.
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 пишет:
Сократил массив символов до

Значит проблема всё-таки в другом месте, дальше по логике скрипта.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 30 Мая, 2013 - 14:25:37
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. while(strlen($sData=generate_string(500))==500);
  2. var_dump($sData);

- приводит к fatal (по времени) - подозреваю, что это не вписывается в определение "частые сбои", потому ошибка была, скорее всего, в другом месте.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
improbable
Отправлено: 30 Мая, 2013 - 14:28:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




esterio пишет:
unset никогда не виполнится.

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

что-то с символами было связано
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB