4

我的网站上有一个注册页面,用户只需提供电子邮件地址和密码即可。

我希望能够使用提供的电子邮件的第一部分自动为该用户创建用户名;

用户提供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@flash.net被视为等于gordon@clash.com

注意:示例代码包括 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
<?php
 preg_match('/[^@]+)@/',$email,$matches);
 $username = $matches[1];
 check_availability($username);
?>
于 2009-06-05T15:30:07.843 回答
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 5.3.0 开始,您还可以使用:

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

这将返回从开头到第一次出现“@”的所有字符串。在这种情况下是:

test
于 2015-01-21T14:22:20.987 回答
0

我用这样的东西,

$cust_email = "test@gmail.com";
$parts = explode("@", $cust_email);
$cust_name = $parts[0];

如果用户未在配置文件中设置他/她的姓名,我会使用设置默认用户名。

于 2015-05-06T12:06:30.283 回答
0

您可以使用strstr函数从字符串中查找特定单词

   <?php

    $username = strstr("username@domain.com",'@',true); //get text before @    
    /*    
    echo strstr("username@domain.com","@"); // get text after @
    */
     check_availability($username);

    ?>
于 2016-08-04T12:04:32.683 回答