以下内容接收建议的用户名,如果未使用则返回用户名,如果使用,则返回最小整数附加的用户名。它工作正常,但我不禁想知道是否可以用一种方法完成它。令我难过的是WHILE语句要求$stmt->execute(...)
和return $stmt->fetchColumn()
作为条件。我猜一个匿名函数可以工作,但不要认为这将允许准备好的语句用于每个调用。我认为DO循环可能有效,但我对它们没有多少经验并且阅读http://www.php.net/manual/en/control-structures.do.while.php意味着我应该“使用goto运算符而不是这个hack”。请提供建议的方法。感谢
<?php
class myClass
{
public function createUsername($name)
{
$i='';
while($this->openUsername($name.$i)==FALSE){$i=$i+1;}
return $name.$i;
}
private function openUsername($name)
{
$sql='SELECT id FROM users WHERE username=?';
try
{
$stmt = db::db()->prepare($sql);
$stmt->execute(array($name));
return $stmt->fetchColumn()?FALSE:TRUE;
}
catch(PDOException $e){die(library::sql_error($e,$sql));}
}
}
?>
答案 0 :(得分:0)
就我个人而言:
function createUsername($name) {
// validate $name, for instance restrict to alphanumeric characters with preg_match
$sql = "SELECT GREATEST(`username`) AS `out` FROM `users`
WHERE `username` REGEXP '^".$name."\d*$'";
$result = // whatever code it takes for PDO to run the above query
if( !$result) return $name; // nobody with that name yet
$number = preg_replace("^.*(\d*)$","$1",$result['out']);
if( !$number) return $name."1";
return $name.($number+1);
}
答案 1 :(得分:0)
不知道这是否有效,如果您认为这不是一个好方法,请将其投票(但请注释为什么)。感谢
public function createUsername($name)
{
try
{
$i='';
$sql='SELECT id FROM users WHERE username=?';
$stmt = db::db()->prepare($sql);
do {
$stmt->execute(array($name.$i));
$used=$stmt->fetchColumn()?TRUE:FALSE;
if(!$used) {$i=$i+1;}
} while ($used);
}
catch(PDOException $e){die(library::sql_error($e,$sql));}
return $name.$i;
}