webForumDet fria alternativet

Ta fram ett ledigt användarnamn

PHP

5 svar · 384 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej,

Har ett system där man får ett användarnamn som baseras på de två första bokstäverna i ens förnamn samt de två första i efternamnet.

På vissa users kan användarnamnet bli detsamma, vill därför göra en kontroll då en ny användare läggs till.

Det jag vill göra är att kolla om t.ex. "mian" finns, om det gör det, ska "mian01" kollas och därefter 02, 03, 04 på slutet, tills ett ledigt användarnamn dyker upp.

Har försökt lösa det här med en do { } while() utan att lyckas så bra.
Vore bra om någon kunde komma med lite kodförslag hur jag ska lösa det här.

Tack!

Medlem sedan dec. 20025 483 inlägg
#2

Någonting sådant här kanske:

newUserName = "mian";

rs = select top 1 username from user where left(username, 4) = 'mian' order by username desc;

if not rs.eof
  suffix = ((int) right(rs(0), len(rs(0)) - 4)) + 1;
  if suffix < 10
    suffix = "0" + suffix;
  end if
  newUserName = newUserName + suffix;
end if

// use newUserName
Medlem sedan feb. 20034 441 inlägg
#3

Lite aspkod i phpforumet :)

Har gjort såhär och det fungerar bra:

$user_name = fixname($user_name);
$sql_condition	= "";
if(is_numeric($user_id)){
	$sql_condition = "AND user_id <> " . $user_id . " ";
}
$i = "";
do{
	$user_name = $user_name . (is_numeric($i) && $i < 10 ? "0" . $i : $i);
	$query	= "SELECT "
		 ."user_name "
		 ."FROM user "
		 ."WHERE user_name = '" . $user_name . "' "
		 .$sql_condition
		 ."LIMIT 1";
	echo "<p>" . $query  . "</p>";
	$result = mysql_query($query) or die("<p>An error occurred, <br />\n<i>" . mysql_error() . "<br /><br />\n" . $query . "</p>");
	if(mysql_num_rows($result) == false){
		$unamedupl = false;
	}else{
		$i = (!is_numeric($i) ? $i = 1 : $i++);
	}
	mysql_free_result($result);

} while($unamedupl);

Finns det något bättre sätt kanske, eller är det bra och stabil kod det här?

Medlem sedan dec. 20025 483 inlägg
#4

Det var mer pseudokod jag postade (eftersom jag inte kan PHP) och jag tror inte det är svårt att översätta till valfritt språk.

En fördel med den kod jag visade är att du slipper använda loopar och, framför allt, db-anrop i loopar.

Medlem sedan feb. 20034 441 inlägg
#5

Peter S skrev:

En fördel med den kod jag visade är att du slipper använda loopar och, framför allt, db-anrop i loopar.

Ja just det, alldeles rätt. Ska nog göra om och göra rätt.

Tack ska du ha!

Medlem sedan feb. 20034 441 inlägg
#6

Såhär blev det tillslut:

$sql_condition	= "";
if(is_numeric($user_id)){
	$sql_condition = "AND user_id <> " . $user_id . " ";
}

$query	= "SELECT "
	 ."user_name "
	 ."FROM user "
	 ."WHERE LEFT(user_name, 4) = '" . $user_name . "' "
	 .$sql_condition
	 ."ORDER BY user_name DESC "
	 ."LIMIT 1";

$result = mysql_query($query) or die("<p>An error occurred, <br />\n<i>" . mysql_error() . "<br /><br />\n" . $query . "</p>");
if(!(mysql_num_rows($result) == false)){
	$suffix = (substr(mysql_result($result, 0, 0), -2, 2) + 1);
	if($suffix < 10){
		$suffix = "0" . $suffix;
	}
	echo $user_name . $suffix;
}
mysql_free_result($result);

Bra att man slapp databasanrop i en loop.

251 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)