Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск строки в файле
 
 автор: coloboc66   (05.09.2006 в 12:35)   письмо автору
 
 

Я хочу имена и пароли пользователей заносить в файл. Для этого при регистрации пользователя принимаю от него $user и $pass и формирую для записи в файл user.txt строковую переменную: $outputstring
Но перед тем, как записать ее в файл, мне нужно проверить, нет ли в нем уже такой же строки. Я делаю так:

$outputstring="user:\t".$user."pass:\t".$pass.\"n\"; 
if (strpos(file_get_contents("users.txt"), $outputstring)=='false')  
    {
    fwrite($fp,$outputstring);
    fclose($fp);
    echo ('Данные занесены');
    }

А скрипт почему-то одну и ту же строку может записать в файл много раз. А почему?

   
 
 автор: cheops   (05.09.2006 в 14:59)   письмо автору
 
   для: coloboc66   (05.09.2006 в 12:35)
 

Предопределённую константу false не следует включать в одинарные кавычки.

   
 
 автор: ec_stasis   (05.09.2006 в 15:08)   письмо автору
 
   для: cheops   (05.09.2006 в 14:59)
 

Опять мой пост стерли???

ЗЫ: по таблице сравнений условие выполнится только если strpos вернет 0.

   
 
 автор: ec_stasis   (05.09.2006 в 15:05)   письмо автору
 
   для: coloboc66   (05.09.2006 в 12:35)
 

а вообще это с любым пользователем или только с тем каоторый самом начале файла?

   
 
 автор: coloboc66   (06.09.2006 в 11:39)   письмо автору
 
   для: ec_stasis   (05.09.2006 в 15:05)
 

Давайте пока оставим запись в файл. При чтении файла проблемы такие:

<?
header
("Content-type: text/plain; charset=windows-1251");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0"false);
$user=$_GET['user'];
$pass=$_GET['pass'];
$outputstring="user:\t".$user."\t"."pass:\t".$pass."\n";
@
$fp=fopen('users.txt','r');
   if (
strpos(file_get_contents("users.txt"),$outputstring)==0)
   {
    echo 
'Такого пользователя не существует. Попробуйте еще раз';
   }
   else {echo 
'Авторизация прошла успешно';}
fclose($fp);
?>

Если искомой строки в файле нет, то скрипт выдает как положено 'Такого пользователя не существует. Попробуйте еще раз'. Но если есть, то вот что он выдает вместо 'Авторизация прошла успешно':

<!--error--><br /><b>Parse error</b>:  parse error, unexpected T_ELSE in <b>z:\home\localhost\www\testdir\xml\chat\log.php</b> on line <b>23</b><br /><script language=JavaScript src='/errors__/phperror_js.php'></script>

Просто бред какой-то! Не знаю, что и думать... Подозреваю, что перед записью в файл строки нужно каким-то образом отформатировать. И, возможно, строку перед сравнением ее с находящимися в файле строками тоже нужно форматировать. Это так?

   
 
 автор: komex   (06.09.2006 в 11:46)   письмо автору
 
   для: coloboc66   (06.09.2006 в 11:39)
 

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

P.S. А вообще лучше использовать MySQL. =)

   
 
 автор: coloboc66   (06.09.2006 в 12:05)   письмо автору
 
   для: komex   (06.09.2006 в 11:46)
 

Да вот как раз я хочу использовать файлы вместо мускула, т.к. прихожу к убеждению, что мускул нужно использовать только когда он действительно нужен, т.е. при создании сложных запросов к БД. А если можно обойтись небольшими файлами и простыми запросами, то нужно использовать именно их- и работает быстрей, и хостинг дешевле.

   
 
 автор: komex   (06.09.2006 в 12:09)   письмо автору
 
   для: coloboc66   (06.09.2006 в 12:05)
 

Да нет, по-моему MySQL все равно быстрее будет! Но если хочешь использовать файлы, попробуй как я сказал! =)

   
 
 автор: coloboc66   (06.09.2006 в 13:02)   письмо автору
 
   для: komex   (06.09.2006 в 12:09)
 

Нашел, в чем проблема некорректной работы функции strpos():
if (strpos(file_get_contents($f_user), $outputstring)===false)

Обязательно нужно писать именно так!

   
 
 автор: coloboc66   (06.09.2006 в 16:56)   письмо автору
 
   для: coloboc66   (06.09.2006 в 13:02)
 

Наверно тема моя затерлась уже, но я все-таки прошу обратить внимание на предпоследнее мое сообщение, может кому пригодится. Я двое суток мучался с проблемой, пока разобрался.

   
 
 автор: ec_stasis   (06.09.2006 в 17:03)   письмо автору
 
   для: coloboc66   (06.09.2006 в 13:02)
 

Дело не в некорректной работе функции, а в некорректном ее использовании.
Если написать ==, то

strpos(file_get_contents($f_user), $outputstring)===false
будет истинным, только если совпадение на нулевой позиции, т.е. в самом начале файла, поэтому я и спрашивал про пользователя - первый ли он в списке.

   
 
 автор: coloboc66   (06.09.2006 в 17:36)   письмо автору
 
   для: ec_stasis   (06.09.2006 в 17:03)
 

Хозяевам форума в их справочнике функций неплохо было бы это отметить

   
 
 автор: Trianon   (06.09.2006 в 17:41)   письмо автору
 
   для: coloboc66   (06.09.2006 в 17:36)
 

В справочние это отмечено:

Если подстрока не будет найдена, то функция strpos() вернёт логическое FALSE.

   
 
 автор: coloboc66   (06.09.2006 в 17:48)   письмо автору
 
   для: Trianon   (06.09.2006 в 17:41)
 

Имеется ввиду три знака равенства, а не два.

   
 
 автор: Trianon   (06.09.2006 в 17:57)   письмо автору
 
   для: coloboc66   (06.09.2006 в 17:48)
 

Так а там нет нигде двух знаков равенства.
А слова "логическое FALSE" - выделены.

   
 
 автор: coloboc66   (06.09.2006 в 23:45)   письмо автору
 
   для: Trianon   (06.09.2006 в 17:57)
 

Так а там нет нигде двух знаков равенства. - потому что все и так понимают, что вроде бы надо ставить два знака. А на самом деле нужно ТРИ. На самом деле функция возвращает не false, а 0, но тип при этом boolean, а не integer- вот в чем проблема. ec-statis все понятно объяснил.

   
 
 автор: Trianon   (07.09.2006 в 09:24)   письмо автору
 
   для: coloboc66   (06.09.2006 в 23:45)
 

Функция при неудачном завершении возвращает false. Как и огромная куча других функций php, результат которых сперва надо проверять на === !== false. Как и несколько меньшая группа функций, которая помимо всего прочего, при успешном выполнении может вернуть 0 целого типа или значение к нему неявно приводимое.

[поправлено модератором]

   
 
 автор: coloboc66   (07.09.2006 в 12:59)   письмо автору
 
   для: Trianon   (07.09.2006 в 09:24)
 

Если я несу бред, то несут бред и все уважаемые авторы учебников, имеющихся у меня (или вы умней их?). Цитирую строки из учебника РНР Люка Веллинга и Лоры Томсон:
Обратите внимание на операцию идентичности, появившуюся в РНР4 (= = =), которая возвращает значение true только в том случае, если оба оператора равны и имеют один и тот же тип. Я, например, начинал с РНР3, а если вы начинали с РНР4, то "не расписывайтесь за всех. И будет вам все цветочно".

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования