2012-02-11 25 views
5

Tôi đang làm việc với thông tin đăng nhập của người dùng và đang gặp sự cố với phần tạo người dùng. Vấn đề của tôi là tôi đang cố gắng kiểm tra tên người dùng đầu vào dựa vào tệp văn bản để xem tên người dùng đó đã tồn tại chưa. Tôi không thể có vẻ để có được nó để so sánh tên người dùng đầu vào với mảng mà tôi đã mang lại. Tôi đã thử hai cách khác nhau để hoàn thành điều này. Một người sử dụng một mảng và một cái khác sử dụng một cái gì đó tôi đọc trực tuyến mà tôi không hoàn toàn hiểu. Bất kỳ trợ giúp hoặc giải thích nào sẽ được đánh giá cao.Sự cố khi kiểm tra nhập tên người dùng đối với tệp phẳng để tạo người dùng

Dưới đây là nỗ lực của tôi sử dụng một mảng để so sánh tắt của http://codepad.org/G7xmsf3z

Đây là nỗ lực thứ hai của tôi http://codepad.org/SbeqmdbG

+1

Khi tôi thấy các câu hỏi như thế này, tôi luôn nghĩ "Tên người dùng tương tự nên được phép như thế nào?" I E. Nếu tên người dùng 'EXample' được cho phép, nếu' Example' được đăng ký? Hay là 'emily' và 'emily.' đều được phép? Tóm lại, hãy quyết định các quy tắc trước, sau đó tạo một chương trình con cho nó, tuân theo các quy tắc đó. – TLP

+1

Bạn sẽ có một điều kiện chủng tộc ở đây sẽ làm hỏng hệ thống đăng ký của bạn. Bạn phải tìm ra cách khóa các quy trình khác từ việc cập nhật danh sách tài khoản cho đến khi chương trình hiện tại của bạn hoàn tất việc thực thi và giải phóng khóa của nó. Khóa các tập tin là hoàn toàn khả thi nhưng không dễ dàng như lưu trữ thông tin trong một DB thích hợp sẽ xử lý khóa cho bạn ... – tadmc

Trả lời

2

Trong nỗ lực đầu tiên của bạn, hãy cố gắng đặt nếu bên trong vòng lặp:

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(); 
    } 
} 

Trong lần thử thứ hai, tôi nghĩ bạn nên thử và thay đổi dòng:

if (%users eq $username) { 

với một này:

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

Như trong nhận xét của tôi, bạn không nên sử dụng một flatfile để giữ thông tin người dùng của bạn. Bạn nên sử dụng một cơ sở dữ liệu thích hợp mà sẽ xử lý truy cập đồng thời cho bạn hơn là phải hiểu và mã lên làm thế nào để đối phó với tất cả những điều đó cho mình!

Nếu bạn nhấn mạnh vào việc sử dụng một mảng, bạn có thể tìm kiếm nó với grep() nếu nó không phải là "quá lớn":

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

tôi thấy một số vấn đề khác trong mã của bạn là tốt.

Bạn nên luôn luôn thích biến lexical (my) hơn các biến gói (của chúng tôi). Tại sao bạn nghĩ (sai lầm) rằng $ name và $ username không thể là biến lexical?

Bạn nên luôn sử dụng dạng 3-arg mở() và kiểm tra giá trị trả về của nó như trong ví dụ về mã thứ 2 của bạn. Mở() của bạn trong ví dụ mã 1 là cách nó được thực hiện nhiều năm trước đây.

1

Như đã nêu ở trên về việc khóa flatfile từ các quy trình khác cũng có vấn đề với việc chia tỷ lệ. càng có nhiều người dùng bạn càng có khả năng tra cứu chậm hơn.

Tôi bắt đầu năm trước với một tệp phẳng, tin rằng tôi sẽ không bao giờ mở rộng đủ để yêu cầu cơ sở dữ liệu thực và không muốn tìm hiểu cách sử dụng mySQL chẳng hạn. Cuối cùng sau khi tham nhũng flatfile và thời gian tra cứu dài tôi không có lựa chọn nào khác ngoài việc chuyển sang cơ sở dữ liệu.

Sau đó, bạn sẽ thấy mình muốn lưu trữ các sở thích của người dùng và như vậy, thật dễ dàng để thêm trường mới vào cơ sở dữ liệu. Flatfile sẽ kết thúc có chi phí chia tách từng dòng thành các trường riêng biệt.

Tôi khuyên bạn nên làm điều đó đúng cách với cơ sở dữ liệu.

+0

đây là tất cả đang được thực hiện vì lợi ích của việc học, nó sẽ được nối với một cơ sở dữ liệu là tốt. Đó là những gì tôi sẽ cố gắng hoàn thành vào tuần tới với điều này, nhưng bây giờ tôi chỉ đang cố gắng để có được các tập tin phẳng làm việc. – Jared

+0

Ngay cả cơ sở dữ liệu [NoSQL] (http://en.wikipedia.org/wiki/NoSQL) sẽ tốt hơn một tệp phẳng. –

Các vấn đề liên quan