Проблемы с проверкой ввода имени пользователя по плоскому файлу для создания пользователя - PullRequest
5 голосов
/ 11 февраля 2012

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

Вот моя попытка использовать массив для сравнения с http://codepad.org/G7xmsf3z

Вот моя вторая попытка http://codepad.org/SbeqmdbG

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

В первой попытке попробуйте ввести if внутри цикла:

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

Во второй попытке, я думаю, вам следует попробовать изменить строку:

if (%users eq $username) {

с этим:

if (defined $users{$username}) {
1 голос
/ 12 февраля 2012

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

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

Позже вы обнаружите, что хотите сохранить пользовательские настройки, и поэтому легко добавить новое поле в базу данных.У Flatfile будут дополнительные затраты на разделение каждой строки на отдельные поля.

Я бы посоветовал вам сделать это правильно с базой данных.

0 голосов
/ 12 февраля 2012

Как и в моем комментарии, вы не должны использовать плоский файл для хранения информации о пользователе. Вы должны использовать правильную базу данных, которая будет обрабатывать параллельный доступ для вас, вместо того, чтобы разбираться и кодировать, как справляться со всем этим самостоятельно!

Если вы настаиваете на использовании массива, вы можете искать его с помощью 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";
}

Я вижу и другие проблемы в вашем коде.

Вы всегда должны предпочитать лексические (мои) переменные пакетным (нашим) переменным. Почему вы считаете (ошибочно), что $ name и $ username не могут быть лексическими переменными?

Вы всегда должны использовать 3-аргументную форму open () и проверять ее возвращаемое значение, как в вашем втором примере кода. Ваш open () в первом примере кода такой же, как и много лет назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...