Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Условие в цикле while срабатывает 2 раза, Цикл должен остановиться после первого выполнения условия
Shаman  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 3
Пользователь №: 42127
На форуме: 1 год, 17 дней
Карма:




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

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

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

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

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

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

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

function tryRegister ( $user_login, $user_password, $alphabet = "78abcdefghjkmnpqrstuvwxyz" ) {
// Изменяем логин, перебором по алфавиту проверяем, не зарегистрирован ли он у нас, и если нет, пытаемся зарегистрировать, пока не зарегистрируем или не исчерпаем алфавит
$x = 0;
while ( $x < 25 ) {

$firstletter = $alphabet{$x}; // первая буква генерируемого логина
$user_login = $firstletter.$user_login; //прибавляем букву к логину, чтоб не повторялся

# Если юзер зарегистрирован у меня, останавливаем перебор

$checkOrgArray = checkOrg ( $user_login); // Выполняю проверку, если у меня есть такой юзер, чтобы не регистрировать повторно
if ( $checkOrgArray['code'] == 1 ) { // Если юзер мой
$status = 1;
break; // Стоп перебор
} else {
# Если юзера удалось зарегистрировать, останавливаем перебор
$regOrgArray = regOrg ($user_login, $user_password ); // Пытаемся зарегистрировать
if ( $regOrgArray['code'] == 1 ) { // Если регистрация успешна, останавливаем, иначе продолжаем
$status = 2;
break; // Стоп перебор
}
}


$x++;
}

return $status;
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 14 дней


do... while попробуй smile.gif


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 3 месяца, 24 дня
Карма: 13




я бы наверное вот так сделал
function tryRegister ( $user_login, $alphabet = "78abcdefghjkmnpqrstuvwxyz", $x = 0 ) {
$firstletter = $alphabet{$x}; // первая буква генерируемого логина
if ($firstletter) {
$user_login = $firstletter.$user_login; //прибавляем букву к логину, чтоб не повторялся
# Если юзер зарегистрирован у меня, останавливаем перебор

$checkOrgArray = checkOrg ( $user_login); // Выполняю проверку, если у меня есть такой юзер, чтобы не регистрировать повторно
if ( $checkOrgArray['code'] == 1 ) {
// есть такой юзер, проверяем дальше
$x++;
return tryRegister ( $user_login, $alphabet, $x );
} else {
// нету такого юзера, регистрируем и выдаем логин
$regOrgArray = regOrg ($user_login, $user_password );
if ( $regOrgArray['code'] == 1 ) {
return $user_login;
} else {
// иначе проблема при регистрации юзера
return false;
}

}
}
else {
// кончились буквы перебора
return false;
}
}

у себя проверил код работает, двойных рег не вызывает.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Shаman  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 3
Пользователь №: 42127
На форуме: 1 год, 17 дней
Карма:




twin, благодарю, а в чём разница, логически? smile.gif

icedfox, спасибо, но тут немного другая логика.
Сначала я проверяю, есть ли такой юзер у меня. Если есть, останавливаю перебор.
Если он не у меня, продолжаю попытки. Юзер может быть зарегистрирован в системе, но не у меня, и тогда я должен сгенерировать другой логин и попробовать ещё раз. То есть, неудачная регистрация (такой логин уже есть) не должна останавливать попытки.
Если юзер не у меня и не получается зарегистрировать, то продолжаем попытки, пока не переберём весь алфавит.
Вот такая логика.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 3 месяца, 24 дня
Карма: 13




Shаman , замените в моем коде
// иначе проблема при регистрации юзера
return false;

на
$x++;
return tryRegister ( $user_login, $alphabet, $x );
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Shаman  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 3
Пользователь №: 42127
На форуме: 1 год, 17 дней
Карма:




icedfox, большое спасибо за подсказки и помощь! С Вашей подачи я исправил ошибку, была она в логике.
Я просто переставил x++ внутрь условия следующим образом:

function tryRegister ( $user_login, $user_password, $alphabet = "78abcdefghjkmnpqrstuvwxyz" ) {
// Изменяем логин, перебором по алфавиту проверяем, не зарегистрирован ли он у нас, и если нет, пытаемся зарегистрировать, пока не зарегистрируем или не исчерпаем алфавит
$x = 0;
while ( $x < 25 ) {

$firstletter = $alphabet{$x}; // первая буква генерируемого логина
$user_login = $firstletter.$user_login; //прибавляем букву к логину, чтоб не повторялся

# Если юзер зарегистрирован у меня, останавливаем перебор

$checkOrgArray = checkOrg ( $user_login); // Выполняю проверку, если у меня есть такой юзер, чтобы не регистрировать повторно
if ( $checkOrgArray['code'] == 1 ) { // Если юзер мой
$status = 1;
break; // Стоп перебор
} else {
# Если юзера удалось зарегистрировать, останавливаем перебор
$regOrgArray = regOrg ($user_login, $user_password ); // Пытаемся зарегистрировать
if ( $regOrgArray['code'] == 1 ) { // Если регистрация успешна, останавливаем, иначе продолжаем
$status = 2;
break; // Стоп перебор
} else {
$x++; // Вот сюда я перенёс счётчик
}
}
}


return $status;
}


Благодарю всех, кто ответил!
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса