2016-07-09 11 views
1

新規ユーザー登録時に、PHPを使用してMySqlデータベースを作成したいと考えています。文字列から有効なMYSqlデータベース名を作成する方法は?

ただし、ユーザー名の一部の文字は、適切でない可能性があります(O'reillyを参照)。

ユーザ名を有効なMySqlデータベース名にするためにユーザ名を「サニタイズ」するにはどうすればよいですか?


[更新] I できたので、havonf @dognose提案し、ユーザDB名でUER IDをuasedb_1db_2など確かに特殊文字の問題を解決し、それが作る

人間が読める名前をつけるよりも、私がデバッグするのがずっと難しいです。

あまりにも多いですが。そして、名前の重複問題を解決しました。

他の人はどうしますか?

+3

a-z以外のものを削除するなどしてください。それらを再正規化する。 –

+0

@SamKuhmonenこれは最善のことではありません。同様の名前で競合する可能性があります。つまり、特殊文字を削除または置換しても、 '$ Bob 'と'§Bob'は同じものになります。ユーザーがサインアップすると、私はIDを取得します - データベース名をdatabase_ {userid}とします – dognose

+0

@dognoseもちろん、他のチェックが必要ですが、それは与えられます。ユーザー名は一意でもかまいませんが、既に特殊文字はありません。ユーザーの名前は一意ではありません。 –

答えて

1

私はあなたをお勧めします別のアプローチを取る。まず、

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

のようなユーザー入力を消毒し、次に提供されたbase64エンコード電子メールとlastinert IDを追加できます。電子メールはとても必要ユニークません。

いくつかのbase64エンコード文字列では、あなたが得ることができます=またはで兆候を==:それはあなたが常に一意

smith_YWRtaW5AYWRtaW4uY29t_234 

EDIT注になりますこのような何かを得るでしょう

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

のようになります。終わり。このようなことを避けるには、

$email = strtr(rtrim(base64_encode($email), '='), '+/', '-_');と入力してデータベースを作成します。私はコメントでsuggestetとしてその電子メールを復号化する

注あなたはdatabase_{userid}が最も簡単かつ「savest」方法です使用して、この

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

なぜ名前にこれらの文字をしたくないですか?

入力をサニタイズする必要はなく、これらのデータをSQL文で使用することはできません。例えばprepared statements(MySQLiを、PDO、等)を使用します。

EDIT:

しかし、あなたはまだ、ユーザー名を「サニタイズ」とコメントで述べたように正規表現に、それらをこれらの文字を削除したい場合:

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

Martinは、準備されたstatemntsを使用すると、MySqlがデータベース名で有効であると認識していない文字は自動的に削除されます。もしそうなら、あなたは参照を提供することができます&私はあなたに答えを与えるでしょう。ありがとう。 – Mawg

+1

[SQLインジェクションを防止するのに十分なPDO準備文ですか?](http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection)をご覧ください。それは文字を削除しませんが、それを行う必要はありません。 –

+0

私は今晩試してみる – Mawg

1

が必要になります。

デシベル-名を読みやすくを生成するには、前述の両方のアプローチを組み合わせることができます。

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 

をしかし、これはデータベース・リストの異なるソーティングの原因となることに留意してください - と場合とにかく正しい "Bob"を見つけるためにIDを検索しなければならない "Username"の衝突があります。

サイドノード:提供するサービスの種類によっては、複数のデータベースよりマルチテナントのデータベースを選択する必要がありますか?

関連する問題