Предположим, что имя пользователя, которое кто-то хочет, берется, тогда я хочу, чтобы система предложила список доступных имен пользователей, например, 5 предложений.
Теперь я могу создать несколько имен пользователей на основе перестановок и комбинаций данных, которые у меня уже есть, например их имя, день рождения и т. Д. Но как я могу убедиться, что эти сгенерированные имена пользователей доступны? Я имею в виду, если для каждого сгенерированного имени пользователя я должен запросить базу данных, чтобы проверить доступность, в худшем случае это может стать чем-то вроде бесконечного цикла.
Есть идеи?
Я подозреваю, что вопрос является базовым, поэтому я приведу простой пример:
<?php // Untested code and only one of the many possible ideas $suggestions = array( 'foobar' => TRUE, 'foo1974' => TRUE, 'foo37' => TRUE, 'drfoo' => TRUE, 'mrfoo' => TRUE, ); $params = $placeholders = array(); foreach(array_keys($suggestions) as $position => $username){ $params['u' . $position] = $username; $placeholders[] = ':u' . $position; } $sql = 'SELECT username FROM user WHERE username IN (' . implode(', ', $placeholders) . ')'; $res = $conn->prepare($sql); $res->execute($params); while( $row = $res->fetch(PDO::FETCH_ASSOC) ){ $suggestions[ $row['username'] ] = FALSE; } foreach($suggestions as $username => $available){ if($available){ // ... } }
Редактировать:
Единственный способ предоставить бесконечный список доступных имен – использовать очень простое правило, например, добавить последовательный номер. В таком случае вы можете попробовать что-то вроде этого:
SELECT username FROM user WHERE username REGEXP '^foo[0-9]+'
… а потом:
$username = 'foo'; $suggestions = array(); $count = 0; $names_left = 5; while($names_left>0){ $count++; if( !in_array($username . $count, $names_taken) ){ $suggestions[] = $username . $count; $names_left--; } }
в$username = 'foo'; $suggestions = array(); $count = 0; $names_left = 5; while($names_left>0){ $count++; if( !in_array($username . $count, $names_taken) ){ $suggestions[] = $username . $count; $names_left--; } }
Я бы составил список из них, чтобы попробовать (скажем, список из 15-20). Любые хиты представляют первые 5 пользователю. В противном случае просто скажите, что предложений нет.
Возможные комбинации могут включать в себя заказ или фамилию, имя, инициалы, возраст, год рождения или просто случайное число. Вы должны хотя бы найти хотя бы одно предложение.