4

私の Web サイトには、ユーザーが電子メール アドレスとパスワードのみを入力する必要があるサインアップ ページがあります。

提供された電子メールの最初の部分を使用して、このユーザーのユーザー名を自動的に作成できるようにしたいと考えています。

ユーザーはgordon @yourdomain.com を提供します。ユーザー名を「gordon」にしたいです

フォームの作成方法やデータベースへのデータの送信方法についての説明は必要ありません。提供された電子メールからデータを抽出するコードだけです。必要に応じて、重複が発生した場合は末尾に番号を追加します。

これが理にかなっていることを願っています。基本的な機能のように見えますが、ネット上のどこにもその例が見つかりませんでした!

4

9 に答える 9

13

これは良い考えではありません。完全なメール アドレスを使用してください。次の電子メール アドレスは別の人である可能性がありますが、システムでは同じになります。

samename@gmail.com
samename@yahoo.com

末尾に数字を追加すると、ユーザーはシステムに固有の何かを覚えてしまい、混乱を招くことになります。

于 2009-06-05T15:27:37.863 に答える
5

同意すると、必然的に一意の ID が一意ではない ID に取り除かれます。ユーザー名などに数字を追加するために何らかの処理を追加したい場合を除きます。それが本当にやりたいことなら、これは $username を電子メールアドレスの前のものに設定する必要があります:

<?php
   $username = preg_replace('/([^@]*).*/', '$1', $email);
?>
于 2009-06-05T15:39:48.850 に答える
2

何かのようなもの:

$username = left($email, stripos($email, '@'));

すべきです。これらの種類のタスクの正規表現を学びたいと思うかもしれません。

次に、カウンターを追加します。

function countOccurrences($name)
{
    $con = mysql_connect(___, ___, ___);
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db(___, $con);

    $result = mysql_query("
        SELECT COUNT(*) AS countOccurrences
        FROM users
        WHERE username LIKE '" . mysql_real_escape_string($name, $con) . "%'
    ");

    $row = mysql_fetch_array($result);

    $number = $row['countOccurrences'];

    mysql_close($con);

    return $number;

}

その後:

$countUsers = countOccurrences($username);
if ($countUsers>0)    
{    
      $username = $username . $countUsers;
}

重要:メール全体をユーザー名として使用することを検討してください

注:コード例では gordon、gordon1、gordon2 がカウントされますが、gordonbah、gordonq、gordonxxx もカウントされます

注:これは非常に大雑把であり、PHP のベスト プラクティスと見なすべきではありません。それは単に一般的な考えを与えることです

于 2009-06-05T15:28:14.120 に答える
2
$username = gordon@example.com;

$username_arr = explode('@',$username);

$username = $username_arr[0];    

if( !is_taken( $username ) )
{
    //The name is not taken.
}
else
{
    //The name is taken, add numbers and do the search again.
}

function is_taken( $username )
{   
    $db_link = mysql_connect($host,$user,$pass) or die('Could not connect to database');

    $username = mysql_real_escape_string( $username );

    $sql = "SELECT * FROM `database`.`users` WHERE `username` = '$username'";

    $res = mysql_query( $sql , $db_link );

    return mysql_num_rows( $res ) == 1;

}
于 2012-05-02T18:07:23.620 に答える
1

あなたのニーズに合うはずです:D

$username = substr($username, 0, strpos($username, '@'));

$username = mysql_real_escape_string($username);

$result = mysql_query('SELECT `username` FROM `users` WHERE `username` = \'' . $username . '%\';');

if (mysql_num_rows($result) > 0) {

   $i = 0;

   while ($name_arr = mysql_fetch_assoc($result)) {

      $name = $name_arr['username'];       

      $after = substr($name, strlen($username));

      if (ctype_digit($after)) {

         if (($after = (int) $after) > $i) {

            $i = $after;

         }

      }

   }

   if ($i > 0) {
      $username .= $i;
   }

}
于 2009-06-05T16:43:14.737 に答える
1
<?php
 preg_match('/[^@]+)@/',$email,$matches);
 $username = $matches[1];
 check_availability($username);
?>
于 2009-06-05T15:30:07.843 に答える
1

PHP 5.3.0 以降では、以下も使用できます。

$email = 'test@stackoverflow.com';
$user = strstr($email, '@', true);

これにより、先頭から「@」の最初の出現までのすべての文字列が返されます。この場合は次のとおりです。

test
于 2015-01-21T14:22:20.987 に答える