PHP.SU

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

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

> Найдено сообщений: 6
StormMan Отправлено: 21 Ноября, 2015 - 19:43:37 • Тема: Условие в цикле while срабатывает 2 раза • Форум: Вопросы новичков

Ответов: 7
Просмотров: 406
vintag пишет:
Построение конешно не айс


vintag, буду признателен за ответ на мой вопрос - что же не так с построением?
StormMan Отправлено: 21 Ноября, 2015 - 11:24:02 • Тема: Условие в цикле while срабатывает 2 раза • Форум: Вопросы новичков

Ответов: 7
Просмотров: 406
Итак, можете меня поздравить, я исправил ошибку! Хорошо Она была чисто логической. Перенёс x++ в другое место, и всё заработало)
Благодарю за участие и подсказки!

PHP:
скопировать код в буфер обмена
  1. function tryRegister ( $user_login, $user_password, $alphabet = "78abcdefghjkmnpqrstuvwxyz" ) {
  2.         // Изменяем логин, перебором по алфавиту проверяем, не зарегистрирован ли он у нас, и если нет, пытаемся зарегистрировать, пока не зарегистрируем или не исчерпаем алфавит
  3.         $x = 0;
  4.         while ( $x < 25 ) {
  5.  
  6.                 $firstletter = $alphabet{$x}; // первая буква генерируемого логина
  7.                 $user_login = $firstletter.$user_login; //прибавляем букву к логину, чтоб не повторялся
  8.  
  9.                 # Если юзер зарегистрирован у меня, останавливаем перебор
  10.                $checkOrgArray = checkOrg ( $user_login); // Выполняю проверку, если у меня есть такой юзер, чтобы не регистрировать повторно
  11.                 if ( $checkOrgArray['code'] == 1 ) { // Если юзер мой
  12.                         $status = 1;
  13.                         break; // Стоп перебор
  14.                 } else {
  15.                         # Если юзера удалось зарегистрировать, останавливаем перебор
  16.                        $regOrgArray = regOrg ($user_login, $user_password ); // Пытаемся зарегистрировать
  17.                         if ( $regOrgArray['code'] == 1 ) { // Если регистрация успешна, останавливаем, иначе продолжаем
  18.                                 $status = 2;
  19.                                 break; // Стоп перебор
  20.                         } else {
  21.                               $x++; // Вот сюда я перенёс счётчик
  22.                         }
  23.                 }
  24.         }
  25.  
  26.         return $status;
  27. }
StormMan Отправлено: 20 Ноября, 2015 - 23:20:39 • Тема: Условие в цикле while срабатывает 2 раза • Форум: Вопросы новичков

Ответов: 7
Просмотров: 406
Вот функция regOrg, ничего экстраординарного - только лишь формирование get-запроса и его отправка на сервер. Отдаёт функция массив, в котором [code] - число, все значения которого, кроме 1, по документации означают, что регистрация не удалась.

PHP:
скопировать код в буфер обмена
  1. function regOrg ( $user_login, $user_password ) {
  2.         $query_regUser = "http://site.ru/api/createuser.php?&user_login=$user_login&user_password=$user_password ";
  3.         if( $curl = curl_init() ) {
  4.                 curl_setopt($curl, CURLOPT_URL, $query_userOrg);
  5.                 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  6.                 $answer = json_decode(curl_exec($curl),true);
  7.                 curl_close($curl);
  8.         }
  9.         return $answer;
  10. }


А вот функция checkOrg, она аналогично отправляет запрос на сервер и возвращает ответ, все значения которого, кроме 1, означают фэйл. Однако она, если ответ [code]==1, останавливает цикл на текущей итерации, и не повторяется, в отличие от regOrg:

PHP:
скопировать код в буфер обмена
  1. function checkOrg ( $user_login ) {
  2.         $query_checkUser = "http://site.ru/api/getuser.php?user_login=$user_login";
  3.         if( $curl = curl_init() ) {
  4.                 curl_setopt($curl, CURLOPT_URL, $query_checkUser);
  5.                 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  6.                 $answer = json_decode(curl_exec($curl),true);
  7.                 curl_close($curl);
  8.         }
  9.         return $answer;
  10. }


vintag, что не так с построением? И почему не нужен цикл, я ведь перебор делаю, как его без цикла-то сделать?

Viper, 1) код функции я предъявил выше, 2) $regOrgArray['code']==1 - так написано в документации, 3) var_dump() какой переменной нужно проверить?
StormMan Отправлено: 20 Ноября, 2015 - 19:55:23 • Тема: Условие в цикле while срабатывает 2 раза • Форум: Вопросы новичков

Ответов: 7
Просмотров: 406
Прошу прощения, если ошибся разделом...

Друзья, я столкнулся с неожиданной, и, пожалуй, довольно ламерской проблемой.

У меня есть скрипт, который регистрирует юзеров в партнёрской системе. Все логины в этой системе уникальны, то есть у разных партнёров не могут повторяться.

Мой скрипт генерирует логин автоматически.
Сперва скрипт пытается зарегистрировать сгенерированный на основе определённых(уникальных) данных логин. Если регистрация получается, то ок, а если нет, то за дело берётся функция tryRegister, которая перебирает логины и пытается их регистрировать.

В этой функции сперва я проверяю в цикле функцией checkOrg, есть ли такой логин среди моих клиентов, если есть - то регистрировать не нужно.

Если нет, тогда я добавляю к логину одну букву и пытаюсь его зарегистрировать функцией regOrg, пока не кончится строка, из которой берётся буква, или пока не получится успешная регистрация. Листинг функции прилагается.

Проблема в том, что функция regOrg в цикле исполняется дважды, то есть получается две регистрации. А должна исполниться лишь один раз - после успешной регистрации я останавливаю цикл.

Подскажите, пожалуйста, что я сделал не так? Почему 2 раза?

PHP:
скопировать код в буфер обмена
  1. function tryRegister ( $user_login, $user_password, $alphabet = "78abcdefghjkmnpqrstuvwxyz" ) {
  2.         // Изменяем логин, перебором по алфавиту проверяем, не зарегистрирован ли он у нас, и если нет, пытаемся зарегистрировать, пока не зарегистрируем или не исчерпаем алфавит
  3.         $x = 0;
  4.         while ( $x < 25 ) {
  5.  
  6.                 $firstletter = $alphabet{$x}; // первая буква генерируемого логина
  7.                 $user_login = $firstletter.$user_login; //прибавляем букву к логину, чтоб не повторялся
  8.  
  9.                 # Если юзер зарегистрирован у меня, останавливаем перебор
  10.                 $checkOrgArray = checkOrg ( $user_login); // Выполняю проверку, если у меня есть такой юзер, чтобы не регистрировать повторно
  11.                 if ( $checkOrgArray['code'] == 1 ) { // Если юзер мой
  12.                         $status = 1;
  13.                         break; // Стоп перебор
  14.                 } else {
  15.                         # Если юзера удалось зарегистрировать, останавливаем перебор
  16.                         $regOrgArray = regOrg ($user_login, $user_password ); // Пытаемся зарегистрировать
  17.                         if ( $regOrgArray['code'] == 1 ) { // Если регистрация успешна, останавливаем, иначе продолжаем
  18.                                 $status = 2;
  19.                                 break; // Стоп перебор
  20.                         }
  21.                 }
  22.                
  23.                 $x++;
  24.         }
  25.  
  26.         return $status;
  27. }
StormMan Отправлено: 20 Ноября, 2015 - 19:41:27 • Тема: Функция в цикле выполняется дважды • Форум: Если скрипт не работает

Ответов: 0
Просмотров: 675
Друзья, я столкнулся с неожиданной, и, пожалуй, довольно ламерской проблемой.

У меня есть скрипт, который регистрирует юзеров в партнёрской системе. Все логины в этой системе уникальны, то есть у разных партнёров не могут повторяться.

Мой скрипт генерирует логин автоматически.
Сперва скрипт пытается зарегистрировать сгенерированный на основе определённых данных логин. Если регистрация получается, то ок, а если нет, то за дело берётся функция tryRegister, которая перебирает логины и пытается их регистрировать.

В этой функции сперва я проверяю в цикле функцией checkOrg, есть ли такой логин среди моих клиентов, если есть - то регистрировать не нужно.

Если нет, тогда я добавляю к логину одну букву и пытаюсь его зарегистрировать функцией regOrg, пока не кончится строка, из которой берётся буква, или пока не получится успешная регистрация. Листинг функции прилагается.

Проблема в том, что функция regOrg в цикле исполняется дважды, то есть получается две регистрации.

Что я сделал не так? Почему 2 раза?

PHP:
скопировать код в буфер обмена
  1. function tryRegister ( $user_login, $user_password, $alphabet = "78abcdefghjkmnpqrstuvwxyz" ) {
  2.         // Изменяем логин, перебором по алфавиту проверяем, не зарегистрирован ли он у нас, и если нет, пытаемся зарегистрировать, пока не зарегистрируем или не исчерпаем алфавит
  3.         $x = 0;
  4.         while ( $x < 25 ) {
  5.  
  6.                 $firstletter = $alphabet{$x}; // первая буква генерируемого логина
  7.                 $user_login = $firstletter.$user_login; //прибавляем букву к логину, чтоб не повторялся
  8.  
  9.                 # Если юзер зарегистрирован у меня, останавливаем перебор
  10.                 $checkOrgArray = checkOrg ( $user_login); // Выполняю проверку, если у меня есть такой юзер, чтобы не регистрировать повторно
  11.                 if ( $checkOrgArray['code'] == 1 ) { // Если юзер мой
  12.                         $status = 1;
  13.                         break; // Стоп перебор
  14.                 } else {
  15.                         # Если юзера удалось зарегистрировать, останавливаем перебор
  16.                         $regOrgArray = regOrg ($user_login, $user_password ); // Пытаемся зарегистрировать
  17.                         if ( $regOrgArray['code'] == 1 ) { // Если регистрация успешна, останавливаем, иначе продолжаем
  18.                                 $status = 2;
  19.                                 break; // Стоп перебор
  20.                         }
  21.                 }
  22.                
  23.                 $x++;
  24.         }
  25.  
  26.         return $status;
  27. }
StormMan Отправлено: 10 Июня, 2010 - 18:49:10 • Тема: Корректная обрезка строк • Форум: Хранение данных, их вывод и обработка

Ответов: 9
Просмотров: 9796
Всем привет!
Есть такой модуль обрезки строки, это плагин для Smarty, но используются обычные функции:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function smarty_modifier_truncate($string, $length = 80, $etc = '...',
  3.                                   $break_words = false, $middle = false)
  4. {
  5.     if ($length == 0)
  6.         return '';
  7.  
  8.     if (strlen($string) > $length) {
  9.         $length -= strlen($etc);
  10.         if (!$break_words && !$middle) {
  11.             $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
  12.         }
  13.         if(!$middle) {
  14.             return substr($string, 0, $length).$etc;
  15.         } else {
  16.             return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
  17.         }
  18.     } else {
  19.         return $string;
  20.     }
  21. }
  22. ?>


Проблема этого кода в том, что он неправильно работает с кодировкой utf-8, если символы отличаются от латиницы, и исходит эта проблема из-за того, что с многобайтными символами функция substr работать не умеет. Заменяю её на mb_substr:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function smarty_modifier_truncate($string, $length = 80, $etc = '...',
  3.                                   $break_words = false, $middle = false)
  4. {
  5.     if ($length == 0)
  6.         return '';
  7.  
  8.     if (mb_strlen($string, utf8) > $length) {
  9.     //if (strlen($string) > $length) {
  10.         $length -= mb_strlen($etc, utf8);
  11.         //$length -= strlen($etc);
  12.         if (!$break_words && !$middle) {
  13.             $string = mb_ereg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1, utf8), utf8);
  14.             //$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
  15.         }
  16.         if(!$middle) {
  17.             return mb_substr($string, 0, $length, utf8).$etc;
  18.             //return substr($string, 0, $length).$etc;
  19.         } else {
  20.             return mb_substr($string, 0, $length/2, utf8) . $etc . mb_substr($string, -$length/2, utf8);
  21.             //return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
  22.         }
  23.     } else {
  24.         return $string;
  25.     }
  26. }
  27. ?>


Остаётся одна проблема: слова обрезаются посередине, получается ерунда вроде "Слова обрезаются посе...". Подскажите, какие функции можно применить, чтобы текст обрезался правильно: "Слова обрезаются посередине...".

Буду очень благодарен за примеры!

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB