0

以下は、提案されたユーザー名を受け取り、使用されていない場合はユーザー名を返し、使用されている場合は最小の整数が追加されたユーザー名を返します。それはうまく機能しますが、私はそれが単一の方法で同じようにできるかどうか疑問に思わずにはいられません。私が困惑しているのは、WHILEステートメントが条件付きとの両方を必要$stmt->execute(...)return $stmt->fetchColumn()することです。匿名関数は機能すると思いますが、これによって準備されたステートメントを各呼び出しに使用できるとは思われません。DOループは機能するかもしれないと思っていますが、経験があまりなく、http: //www.php.net/manual/en/control-structures.do.while.phpを読むと、「gotoを使用する必要があります。このハックの代わりにオペレーター。」これを行うための推奨される方法を提供してください。ありがとう

<?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));}
        }

    }
?>
4

2 に答える 2

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;
}
于 2013-02-09T23:17:54.597 に答える
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);
}
于 2013-02-09T22:44:12.517 に答える