| |
|
|
| | Я хочу имена и пароли пользователей заносить в файл. Для этого при регистрации пользователя принимаю от него $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 ('Данные занесены');
}
|
А скрипт почему-то одну и ту же строку может записать в файл много раз. А почему? | |
| |
|
|
| |
|
|
| |
для: coloboc66
(05.09.2006 в 12:35)
| | | Предопределённую константу false не следует включать в одинарные кавычки. | |
| |
|
|
| |
|
|
| |
для: cheops
(05.09.2006 в 14:59)
| | | Опять мой пост стерли???
ЗЫ: по таблице сравнений условие выполнится только если strpos вернет 0. | |
| |
|
|
| |
|
|
| |
для: coloboc66
(05.09.2006 в 12:35)
| | | а вообще это с любым пользователем или только с тем каоторый самом начале файла? | |
| |
|
|
| |
|
|
| |
для: 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>
|
Просто бред какой-то! Не знаю, что и думать... Подозреваю, что перед записью в файл строки нужно каким-то образом отформатировать. И, возможно, строку перед сравнением ее с находящимися в файле строками тоже нужно форматировать. Это так? | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 11:39)
| | | А может лучше для каждого пользователя создавать отдельный файл, который назвать именем пользователя, туда вносить пароль (или еще какую информацию)? Проверять на наличие такого пользователя легче. Втоде так удобнее.
P.S. А вообще лучше использовать MySQL. =) | |
| |
|
|
| |
|
|
| |
для: komex
(06.09.2006 в 11:46)
| | | Да вот как раз я хочу использовать файлы вместо мускула, т.к. прихожу к убеждению, что мускул нужно использовать только когда он действительно нужен, т.е. при создании сложных запросов к БД. А если можно обойтись небольшими файлами и простыми запросами, то нужно использовать именно их- и работает быстрей, и хостинг дешевле. | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 12:05)
| | | Да нет, по-моему MySQL все равно быстрее будет! Но если хочешь использовать файлы, попробуй как я сказал! =) | |
| |
|
|
| |
|
|
| |
для: komex
(06.09.2006 в 12:09)
| | | Нашел, в чем проблема некорректной работы функции strpos():
if (strpos(file_get_contents($f_user), $outputstring)===false)
|
Обязательно нужно писать именно так! | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 13:02)
| | | Наверно тема моя затерлась уже, но я все-таки прошу обратить внимание на предпоследнее мое сообщение, может кому пригодится. Я двое суток мучался с проблемой, пока разобрался. | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 13:02)
| | | Дело не в некорректной работе функции, а в некорректном ее использовании.
Если написать ==, то
strpos(file_get_contents($f_user), $outputstring)===false
| будет истинным, только если совпадение на нулевой позиции, т.е. в самом начале файла, поэтому я и спрашивал про пользователя - первый ли он в списке. | |
| |
|
|
| |
|
|
| |
для: ec_stasis
(06.09.2006 в 17:03)
| | | Хозяевам форума в их справочнике функций неплохо было бы это отметить | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 17:36)
| | | В справочние это отмечено:
Если подстрока не будет найдена, то функция strpos() вернёт логическое FALSE. | |
| |
|
|
| |
|
|
| |
для: Trianon
(06.09.2006 в 17:41)
| | | Имеется ввиду три знака равенства, а не два. | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 17:48)
| | | Так а там нет нигде двух знаков равенства.
А слова "логическое FALSE" - выделены. | |
| |
|
|
| |
|
|
| |
для: Trianon
(06.09.2006 в 17:57)
| | | Так а там нет нигде двух знаков равенства. - потому что все и так понимают, что вроде бы надо ставить два знака. А на самом деле нужно ТРИ. На самом деле функция возвращает не false, а 0, но тип при этом boolean, а не integer- вот в чем проблема. ec-statis все понятно объяснил. | |
| |
|
|
| |
|
|
| |
для: coloboc66
(06.09.2006 в 23:45)
| | | Функция при неудачном завершении возвращает false. Как и огромная куча других функций php, результат которых сперва надо проверять на === !== false. Как и несколько меньшая группа функций, которая помимо всего прочего, при успешном выполнении может вернуть 0 целого типа или значение к нему неявно приводимое.
[поправлено модератором] | |
| |
|
|
| |
|
|
| |
для: Trianon
(07.09.2006 в 09:24)
| | | Если я несу бред, то несут бред и все уважаемые авторы учебников, имеющихся у меня (или вы умней их?). Цитирую строки из учебника РНР Люка Веллинга и Лоры Томсон:
Обратите внимание на операцию идентичности, появившуюся в РНР4 (= = =), которая возвращает значение true только в том случае, если оба оператора равны и имеют один и тот же тип. Я, например, начинал с РНР3, а если вы начинали с РНР4, то "не расписывайтесь за всех. И будет вам все цветочно". | |
| |
|
|