当一个新用户注册时,我希望使用PHP为他们创建一个MySql数据库。
但是,用户名中的一些字符可能不合适(考虑O'reilly)。
如何对用户名进行“消毒”以验证有效的MySql数据库名称?
更新i可以在数据库名称中使用@dognose建议并使用uer Id,从而具有db_1、db_2等。
这当然解决了特殊的字符问题,但它使我比有一个人类可读的名字更容易调试。
不过不算太多。解决了重复名字的问题。
其他人是怎么做的?
发布于 2016-07-09 09:44:01
我建议你采取另一种方法。首先,您可以对用户输入进行消毒,如
$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, '-_', '+/'));发布于 2016-07-09 10:37:29
正如我在评论中所建议的那样,使用database_{userid}是最简单和最“节省”的方式。
要生成更容易阅读的db名称,可以将上述两种方法结合起来:
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“。
侧节点:取决于您所提供的服务类型:也许您应该更喜欢多租户数据库而不是多个数据库?
发布于 2016-07-09 08:55:13
为什么你不想让这些角色出现在你的名字里?
您不必对输入进行清理,而是不允许在SQL语句中使用这些数据。例如,使用prepared statements (MySQLi、PDO等)。
编辑:
但是,如果您仍然希望对用户名进行“消毒”并删除这些字符,请按注释中提到的那样重新整理它们:
'/[^a-z_\-0-9]/i'https://stackoverflow.com/questions/38280028
复制相似问题