2016-07-09 3 views
1

Когда новый пользователь регистрируется, я хочу использовать PHP для создания базы данных MySql для них.Как создать допустимое имя базы данных MYSql из строки?

Однако некоторые символы в имени пользователя могут оказаться непригодными (см. O'reilly).

Как я могу «дезинфицировать» имя пользователя для cerate как действительное имя базы данных MySql?


[Update] Я мог uase @dognose внушения и пользователя UER Id во имя БД, таким образом, havonf db_1, db_2 и т.д.

Это, конечно, решает особую проблему характера, но это делает мне было труднее отлаживать, чем haviong, удобочитаемое для человека имя.

Не слишком много, хотя. И он решил проблему с дублированием имен.

Что делают другие?

+3

Удаляя, например, что-либо, что не является -z. Вырежьте их. –

+0

@SamiKuhmonen это не самое лучшее. Вы можете столкнуться с конфликтами с похожими именами, то есть '$ Bob' и' §Bob' станут тем же, независимо от того, удалите или замените специальный символ. Когда пользователь подписывается, он получает идентификатор I Assume - имя базы данных 'database_ {userid}' – dognose

+0

@dognose Конечно, вам нужны другие чеки, но это данные: кто говорит, что вы никогда не получаете двух Джона Смита? Имена пользователей могут быть уникальными, но они уже будут без особых символов. Имена пользователей не уникальны. –

ответ

1

Я хотел бы предложить вам использовать другой подход. Сначала вы можете дезинфицировать ввод данных пользователем, как

$username = preg_replace("/[^a-zA-Z]+/", "", $username); 

, а затем вы можете добавить в base64 закодировать электронную почту при условии и lastinert идентификатор. Письма уникальны, поэтому нет необходимости. Это будет выглядеть

$userdb = $username.'_'.base64_encode($email).'_'.($db->lastInsertId()); 

вы получите что-то вроде этого, которое всегда будет уникальным

smith_YWRtaW5AYWRtaW4uY29t_234 

EDIT Примечание:

В некоторых base64 закодировать строки вы можете получить = или == знаки на конец. Чтобы этого избежать, вы можете сделать что-то вроде этого

$email = strtr(rtrim(base64_encode($email), '='), '+/', '-_');, а затем вы можете создать базу данных.

Обратите внимание, что для декодирования, что электронная почта вы будете нуждаться в этом

$email = base64_decode(strtr($encodedemail, '-_', '+/')); 
0

Почему вы не хотите, чтобы эти символы в названии?

Вам не нужно дезинфицировать входные данные, а не разрешать использование этих данных в инструкции SQL. Например, используйте prepared statements (MySQLi, PDO и т. Д.).

EDIT:

Но если вы все еще хотите «дезинфицировать» имя пользователя и удалить эти символы, регулярное выражение их как упомянуто в комментарии:

'/[^a-z_\-0-9]/i' 
+0

Мартин, вы говорите мне, что при использовании готовых statemnts автоматически будут лишены любые символы, которые MySql не считает действительными в имени базы данных? если да, можете ли вы предоставить ссылку, и я дам вам ответ. Благодарю. – Mawg

+1

Взгляните на [Готовые заявления PDO, достаточные для предотвращения SQL-инъекции?] (Http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection). Он не будет лишать каких-либо символов, но это не нужно делать. –

+0

Я попробую сегодня вечером – Mawg

1

Как я suggestet в комментарии, используя database_{userid} является самым простым и «savest» путь.

Сформировать легче читать DB-имена, вы можете комбинировать оба подхода, упомянутые:

1.) Сначала удалите любые специальные символы из имени пользователя, замените их на «_». (Для удобства чтения).

2.) Добавить фактический идентификатор в конце, отделен с подчеркиванием (для гарантированной уникальности):

id | username | dbname 
1 Bob$  bob__1 
2 Bob§  bob__2 
3 JohnX  johnx_3  
4 ABC  abc_4 
5 Test  test_5 

Но имейте в виде, что это будет вызывать различные сортировки из базы данных-листа - и если есть столкновение «Имена пользователей», вам нужно найти идентификатор в любом случае, чтобы найти подходящего «Боба».

Боковой узел: в зависимости от того, какую услугу вы предлагаете: возможно, вам следует предпочесть базу данных с несколькими арендаторами по нескольким базам данных?