WHILE语句需要多行代码才能有条件

时间:2013-02-09 22:31:30

标签: php

以下内容接收建议的用户名,如果未使用则返回用户名,如果使用,则返回最小整数附加的用户名。它工作正常,但我不禁想知道是否可以用一种方法完成它。令我难过的是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));}
        }

    }
?>

2 个答案:

答案 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;
}