2013-05-09 2 views
0

Когда имя пользователя вставляется в моей базе данных, таких как:Проверьте имя пользователя существует, если да, то приращение на единицу

  • john_smith

мне нужно проверить, есть ли уже john_smith настоящее , Если да, то увеличиваем его на 1, чтобы стать John_Smith_1

Так что, если уже существуют следующие имена:

  • john_smith
  • John_Smith_1
  • John_Smith_2
  • John_Smith_3
  • .... до John_Smith_10

Мне нужен nex t Добавлен John_Smith для увеличения на John_Smith_11.

До сих пор я искал и придумал это:

$preferredname= "John_Smith" 

     //check for duplicate user names 
     $duplicate= check_for_duplicate_username($preferredname);      

     //if duplicate, increment the preferredname  
     if ($duplicate) 
     { 
      $parts = explode("_",$preferredname); 

      if (isset($parts[1])) 
      $preferredname = $parts[0]."_".$parts[1]."_".($parts[2]+1); 

      else $preferredname = $parts[0]."_".$parts[1]."_1"; 
     } 

Это, я считаю, будет работать только для первых соответствия имен пользователей. Моя проблема заключается в проверке базы данных для версии имя с наибольшим числом .. Это мой SQL:

 function check_for_duplicate_username($name) 
{ 
    // check if username already exists 
    $sql = "SELECT * FROM users WHERE user_username=$name"; 
    //then return duplicates 
+0

У вас проблема с XY.Ваши ddls должны измениться, вы неправильно используете свою базу данных. – gbtimmon

+1

Ненавижу, когда веб-сайты делают это. Просто сообщите пользователю, что это имя принято, и пусть они выбирают другое. – vascowhite

+0

Быстрые мысли. Возможно, вы должны сохранить добавочное значение вместе с пользователем, чтобы вы могли сортировать по этому столбцу. Или, возможно, вы можете добавить идентификатор к имени пользователя, если оно будет принято. Или еще лучше, верните «ошибку», в которой указано имя пользователя, и выберите другое имя. –

ответ

0

Хотя это не может быть лучшим решением в великой схеме вещей, вот ответ, который касается того, что вы конкретно пытались сделать. Следующий запрос возвращает число пользователей с именем $ или $ name_123 SELECT COUNT(*) FROM users WHERE user_username REGEXP '$name[_0-9]*$'; Так что если значение 0, вы можете просто использовать $name самостоятельно, в противном случае вы можете использовать $name."_". + номер, возвращаемый запросом.

Но, как многие люди упоминали, не самая лучшая идея для автоматического назначения имен пользователей (очень веб 1.0: P). Я бы рекомендовал адреса электронной почты. Другой вариант - использовать любое приложение, которое использует социальное приложение, а также другое поле, идентифицирующее социальное приложение (если у вас есть несколько), а затем использование поля с автоинкрементным идентификатором в качестве уникального первичного ключа.

+0

Да, я думаю, что это лучший способ пойти. Я буду уникальным в своем профиле и добавлю поле отображаемого имени, чтобы показать что-то дружелюбное в пользовательском интерфейсе. благодаря – gray

1

Вы можете использовать этот запрос:

$sql = 'SELECT * FROM users WHERE user_username LIKE ' . $name . '_%'; 

выше будет запрашивать строк которые user_username имеют значение, подобное John_Smith_ * (где * любой действительный характер, включая номер, который вы должны проверить позже)

вы можете использовать этот PHP заявление для получения номера суффикса пользователя:

preg_match('/([0-9]+)$/', 'John_smith_10', $matches); 
$user_number = $matches[0]; 
0

У меня была аналогичная проблема I пытался решить сегодня и сделал это так. В моем случае мне нужно сохранить/создать уникальное имя каталога на основе пользователей первого начальная/Фамилия:

$username = "bjones"; 
$usersql = "SELECT * FROM users WHERE username LIKE '$username%'"; 
$usercnt = mysqli_num_rows(mysqli_query($con,$usersql)); 

// If bjones, bjones1, bjones2, etc already exists 
if ($usercnt >= 1) { 
    $num = ++$usercnt;    // Increment $usercnt by 1 
    $username = $username . $num; // Add number to username 
} 

Если предположить bjones, bjones1, bjones2 уже существует, я бы в конечном итоге с bjones3.

Смежные вопросы