Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сравнение с данными из txt файла

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
demot
Отправлено: 16 Марта, 2011 - 21:00:53
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Функция, которая пишет в файл
PHP:
скопировать код в буфер обмена
  1. function reg_user($name,$email,$login,$pass){
  2.             $fc = @fopen('data/users.txt', "a+");
  3.             fwrite($fc, $name."\n");
  4.             fwrite($fc, $email."\n");
  5.             fwrite($fc, $login."\n");
  6.             fwrite($fc, $pass."\n");
  7.             fwrite($fc, 'user'."\n\n");
  8.             fclose($fc);}


Функция проверки введенных данных с данными из файла

PHP:
скопировать код в буфер обмена
  1. function auth_user($login,$pass){
  2.         $file=file("users.txt");
  3.           $rows=count($file);
  4.           $n=0;
  5.           while($n<$rows){
  6.             $name = $file[$n];
  7.             $email = $file[$n+1];
  8.             $login = $file[$n+2];
  9.             $password = $file[$n+3];
  10.             $permission = $file[$n+4];
  11.             $n=$n+6;
  12.             $users[]=array(preg_replace('#\n#','',$name),
  13.                            preg_replace('#\n#','',$email),
  14.                            preg_replace('#\n#','',$login),
  15.                            preg_replace('#\n#','',$password),
  16.                            preg_replace('#\n#','',$permission));
  17.           }
  18.  
  19.           foreach ($users as $key=>$val){
  20.                 if ($users[$key][2] == $login){echo "login OK<br/>";}
  21.                 if ($users[$key][3] == $pass){echo "password OK<br/>";}
  22.           }
  23. }
  24.  
  25. auth_user('login1','123');


Проблема в том, что возвращает только "password OK"

Если создать массив вручную, с теми же данными, что и в файле, то все проходит "на ура". Это навевает на мысль, что в файл пишутся еще какие-то невидимые спецсимволы. Вот только как их убрать, или хотя бы увидеть...

Все файлы в UTF-8.

txt файлик прилагается
Скачать файл: users.txt
Скачан раз: 112
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2011 - 21:26:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мега-код!!! Хит просто!!!
Все что вы написали - полный изврат над логикой..
Не обижайтесь...
Если вам будет нужно - напишу ваше решение в правильном виде.
Но я бы на вашем месте сел и подумал сам еще разок - зачем мы делаем те или иные действия в скрипте...
 
 Top
demot
Отправлено: 16 Марта, 2011 - 21:31:01
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Да я не обижаюсь, потому как только учусь Улыбка А это одно из заданий (регистрация пользователей с хранением в txt , а так же авторизация). Правда сама функция авторизации другая, тут только для примера привел, чтоб выявить проблему.

За меня писать не нужно, хочу просто чтоб объяснили в чем проблема

(Отредактировано автором: 16 Марта, 2011 - 21:31:38)

 
 Top
movEAX
Отправлено: 16 Марта, 2011 - 22:08:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Используйте лучше json или xml для хранения данных, всяко лучше будет.


-----
армия.. самое убогое место
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Марта, 2011 - 22:30:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




А проблема я сказал в чем - в логике...

Во первых хранить в "базе" одного и более пользователей,
удобнее не на каждой строке по параметру (как сейчас у вас),
а сделать на одной строке данные об одном пользователе.
Для этого нужен сепаратор. Пусть он будет у нас таким: "f6d6"
В реальности сепаратор, длинной менее 32 символов будет плох,
т.к. повторить его не составит труда, и строку мы не распарсим.
Итак, данные в файле:
Спойлер (Отобразить)

PHP:
скопировать код в буфер обмена
  1. $login = "Иван";
  2. $pass = "pass1";
  3.  
  4. $s = "f6d6"; // он самый
  5.  
  6. $users = file("users.txt");
  7. $auth = false; // гость короче
  8. foreach ($users as $user) {
  9.     list($u['family'],$u['name'],$u['lastname'],$u['password']) = explode($s,trim($user));
  10.     if ($u['name'] == $login and $u['password'] == $pass) {
  11.         $auth = true;
  12.         break; // валим отседова, и так уже нашли что надо
  13.     }
  14.  
  15. if ($auth) var_dump($u);

(Добавление)
movEAX пишет:
json

Кстати - да :)
Но это уже совсем другая история.
 
 Top
OrmaJever Модератор
Отправлено: 17 Марта, 2011 - 00:11:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




demot пишет:
Проблема в том, что возвращает только "password OK"

а что она должна возвращать если в функции нету return`a ? Однако


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
demot
Отправлено: 17 Марта, 2011 - 06:15:30
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




OrmaJever пишет:
а что она должна возвращать если в функции нету return`a ? Однако


Ну оговорился, не возвращает, а выводит на экран с помощью echo, там их два Улыбка
DeepVarvar пишет:
Во первых хранить в "базе" одного и более пользователей,
удобнее не на каждой строке по параметру (как сейчас у вас),
а сделать на одной строке данные об одном пользователе.
Для этого нужен сепаратор. Пусть он будет у нас таким: "f6d6"
В реальности сепаратор, длинной менее 32 символов будет плох,
т.к. повторить его не составит труда, и строку мы не распарсим.

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


В общем всем большое спасибо!
(Добавление)
Хоть эта строчка в принципе не нужна

Но все же, почему-то она не срабатывает. И по идее она должна быть до break;. Но суть дела не меняет, почему-то она массив не хочет показывать, а вот print_r($u); его выводит.

Не может быть дело в настрйках сервера?

(Отредактировано автором: 17 Марта, 2011 - 06:57:20)

 
 Top
sebastjan
Отправлено: 17 Марта, 2011 - 11:14:32
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2011  
Откуда: Ganduras


Помог: 0 раз(а)




Хранить данные в $file=file("users.txt");
так любой может сграбить все файлы с сайта.
Какой смысл в пароли или логине ?
Выкеньте эту идею из головы, время будет потраченно впустую,
вам правильно посоветовал DeepVarvar используйте Базу
 
 Top
demot
Отправлено: 17 Марта, 2011 - 18:36:18
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




sebastjan пишет:
Хранить данные в $file=file("users.txt");
так любой может сграбить все файлы с сайта.
Какой смысл в пароли или логине ?
Выкеньте эту идею из головы, время будет потраченно впустую,
вам правильно посоветовал DeepVarvar используйте Базу


А еще я во 2-м своем посте написал:
"Да я не обижаюсь, потому как только учусь. А это одно из заданий (регистрация пользователей с хранением в txt , а так же авторизация)."
 
 Top
JustUserR
Отправлено: 18 Марта, 2011 - 13:07:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




sebastjan пишет:
Хранить данные в $file=file("users.txt");
так любой может сграбить все файлы с сайта
Непосредственное использование локального файлового объекта для осуществления хранения предплагаемой информации по авторизации пользователей, при корректной конфигурции не обеспечивает явных аспектов уменьшения уроня безопасности, поскольку для предполагаемых значений паролей возможно хранения ассоциированных MD5-кодов; в то время как спользование целевого файлового объекта осуществялется реальное снижение вычислительное эффективности web-приложения, в сиду необходимости подачи постоянных последовательных запросов к жесткому диску, без обеспечение требуемого элементного локального кеширования информационных полей и их индексации


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB