当新用户注册时,我想使用PHP为他们创建一个MySql数据库。
但是,用户名中的一些角色可能不合适(考虑O'reilly
)。
如何“清理”用户名以获取有效的MySql数据库名称?
[更新]我可以使用@dognose建议并在数据库名称中使用您的Id,因此havonf db_1
,db_2
等
这肯定解决了这个特殊字符的问题,但是这让我调试起来比使用一个人类可读的名字更加困难。
但是,并不是太多。它解决了重复名称问题。其他人做了什么?
答案 0 :(得分:1)
我建议你采取不同的方法。首先,您可以清理用户输入,如
$username = preg_replace("/[^a-zA-Z]+/", "", $username);
然后你可以附加提供的base64编码电子邮件和lastinert id。电子邮件是独特的,所以没有必要。它看起来像
$userdb = $username.'_'.base64_encode($email).'_'.($db->lastInsertId());
你会得到类似的东西,这将永远是唯一的
smith_YWRtaW5AYWRtaW4uY29t_234
编辑注:
在某些base64编码字符串中,最后可能会得到=或==符号。为了避免这种情况,你可以做这样的事情
$email = strtr(rtrim(base64_encode($email), '='), '+/', '-_');
然后您可以创建数据库。
请注意,要解码该电子邮件,您需要此
$email = base64_decode(strtr($encodedemail, '-_', '+/'));
答案 1 :(得分:1)
正如我在评论中提出的那样,使用database_{userid}
是最容易和最“最”的方式。
为了生成更易于阅读的db-names,您可以结合使用的两种方法:
1。)首先,从用户名中删除任何特殊字符,将其替换为“_”。 (为了便于阅读)。
2。)在末尾添加实际ID,用下划线分隔(确保唯一性):
id | username | dbname
1 Bob$ bob__1
2 Bob§ bob__2
3 JohnX johnx_3
4 ABC abc_4
5 Test test_5
但请记住,这会导致数据库列表的不同排序 - 如果存在“用户名”的冲突,您必须查找id以找到正确的“Bob”。
侧节点:取决于您提供的服务类型:您可能更喜欢多租户数据库而不是多个数据库?
答案 2 :(得分:0)
为什么你不想在名字中使用这些字符?
您不必清理输入,而是不允许在SQL语句中使用这些数据。例如,使用prepared statements(MySQLi,PDO等)。
修改强>
但是,如果您仍想“清理”用户名并删除这些字符,请按照评论中的说明将它们排除:
'/[^a-z_\-0-9]/i'