2012-02-11 14 views
5

私はユーザログインを行っていますが、ユーザ作成パートに問題があります。私の問題は、入力ユーザー名をテキストファイルと照合して、そのユーザー名が既に存在するかどうかを確認しようとしていることです。私はそれが私が持っている配列に入力ユーザー名を比較することができないようです。私はこれを達成するための2つの異なる方法を試してみました。 1つは配列を使用し、もう1つはオンラインで私がかなり理解していないものを使用しています。どんな助けや説明も大歓迎です。ここでユーザの作成のためにフラットファイルに対してユーザ名入力を確認する問題

はここ http://codepad.org/G7xmsf3z

のオフを比較するために、配列を使用して私の試みで、あなたの最初の試みで、私の第二の試み http://codepad.org/SbeqmdbG

+1

このような質問が表示されたとき、私はいつも「どのように類似したユーザー名を許可するべきか」と思っています。私。 'Example'が登録されていれば、ユーザ名' EXample'を許さなければなりませんか?あるいは、「エミリー」と「エミリー」の両方が許可されるべきですか?要するに、最初にルールを決め、そのルールに従ったサブルーチンを作ります。 – TLP

+1

あなたの登録システムを台無しにする競争状態がここにあります。現在のプログラムが実行を終了してロックを解除するまで、他のプロセスをロックアウトしてアカウントリストを更新する方法を理解する必要があります。ファイルをロックすることは可能ですが、ロックを処理する適切なDBに情報を格納するのと同じくらい簡単ではありません。 – tadmc

答えて

2

で、もしループの内側に配置しよう:

foreach my $pair(@incomingarray) { 
    (my $name,my $value) = split (/:/, $pair); 

    if ($name eq $username) { 
     print p("Username is already taken, try again"); 
     close(YYY); 
     print end_html(); 
    } 
    else { 
     open(YYY, ">>password.txt"); 
     print YYY $username.":".$hashpass."\n"; 
     print p("Your account has been created sucessfully"); 
    close(YYY); 
    print end_html(); 
    } 
} 

はあなたの第二の試みで、私はあなたがしようとすると行を変更すべきだと思いますこの1と

if (%users eq $username) { 

:私のコメントのように

if (defined $users{$username}) { 
0

、あなたのユーザー情報を保持するためにフラットファイルを使用するべきではありません。あなたは、あなた自身のすべてを処理する方法を理解し、コード化する必要がなく、あなたのための同時アクセスを処理する適切なデータベースを使用する必要があります。

あなたは、配列を使う、という場合は、grepを()、それは「大きすぎ」でない場合に、それを検索することができます。

if (grep /^$username:/, @incomingarray) { 
    print "user name '$username' is already registered, try again\n"; 
} 
else { 
    print "user name '$username' is not already registered\n"; 
} 

は、私は同様にあなたのコード内のいくつかの他の問題を参照してください。

パッケージ(私たちの)変数よりもレキシカル(my)変数を優先するべきです。 なぜ$ nameと$ usernameは字句変数にできない(間違って)と思いますか?

open()の3-arg形式を使用し、2番目のコード例のように戻り値をチェックする必要があります。最初のコード例のopen()は、何年も前にどのように行われたかです。

1

フラットファイルを他のプロセスからロックすることについて上述したように、スケーリングにも問題があります。ルックアップが遅くなるユーザーが増えます。

私は何年も前からフラットファイルを使っていましたが、実際のデータベースを必要とするほどの規模ではなく、たとえばmySQLの使い方を習得したくないと思いました。最終的にフラットファイルの破損と長い検索時間の後、私はデータベースに移動する以外に選択肢がありませんでした。

ユーザーの設定などを保存したい場合は、新しいフィールドをデータベースに簡単に追加できます。フラットファイルは各ラインを別々のフィールドに分割するオーバーヘッドを伴います。

私はあなたがデータベースで適切に行うことをお勧めします。

+0

これはすべて学習のために行われているので、データベースにも接続されます。それは私が来週にこれで達成しようとしていることですが、今はフラットファイルを動かそうとしています。 – Jared

+0

[NoSQL](http://en.wikipedia.org/wiki/NoSQL)データベースでも、フラットファイルよりも優れています。 –

関連する問題