Выпуск 11. Проверка существования файла: функция file_exists.
Доброго времени суток, уважаемый подписчик рассылки «PHP-песочница». С Вами вновь Андрей Чернобай с новым выпуском. Сегодня мы разберёмся, как проверить, существует ли вообще файл, с которым мы намерены производить действия.
В скрипте, созданном в прошлом выпуске, есть недостаток: если ввести имя пользователя, который не регился на сайте, выведется вот такое сообщение:
Warning: fopen(имя, которого нет): failed to open stream: No such file or directory in z:\home\php\www\testreg.php on line 12 Warning: file(имя, которого нет): failed to open stream: No such file or directory in z:\home\php\www\testreg.php on line 13
Ведённый пароль не верный.
Здесь говорится, что, дескать, мы хотим открыть файл, которого не существует. Это естественно: нельзя открыть то, чего нет. Но и такие сообщения – не совсем то, что хочется видеть на своём сайте. Вывод: нужно усовершенствовать скрипт, чтобы при неверном имени выводилось что-то более осмысленное и красиво оформленное. Например, предложение ввести имя внимательней, войти под своим именем и т. п.
В этом уроке мы это и сделаем.
Проверить существование файла очень легко. Для этого есть функция file_exists(имя файла).
Создадим условие, используя хорошо известные нам операторы if – else.
Добавим в testreg.php новый код (выделен зелёным):
<?php
/*проверяем, заполнены ли все поля формы*/
if (($name == "") || ($pass == ""))
/*если не заполнены, выводится сообщение*/
{
echo "<p>Форма заполнена не полностью! Вернитесь, пожалуйста, и заполните все поля формы!</p>";
exit (); /*и программа останавливается*/
}
/*если все поля формы заполнены, следуем дальше*/
else
{
if (!file_exists($name))
{
echo "<p>Имя пользователя указано не верно. Заполните форму внимательно или зайдите на сайт под своим именем.</p>";
}
else
{
$rfile = fopen ($name, "r"); /*открываем для чтения файл, имя которого совпадает с именем из формы*/
$data = file ($name);/*читаем из открытого файла*/
$newstr = strtok ($data[0], "\n"); /*удаляем из первого элемента массива data код перехода на новую строку*/
/*так как пароль находится в первой строке открытого файла, то нужно сравнить пароль из формы с этой первой строкой*/
if (strcmp ($newstr, $pass) == 0)
{
echo "<p>У Вас есть права зарегистрированного пользователя.</p>";
}
else
{
echo "<p>Ведённый пароль не верный.</p>";
}
}
}
?>
Обращаю внимание на ещё одну закрывающую фигурную скобку перед тегом закрытия скрипта.
Сохраним изменения; обновим страницу в браузере. Введём заведомо неверное имя, а пароль – всё равно какой. Если у Вас всё правильно в скрипте, выводится сообщение:
«Имя пользователя указано не верно. Заполните форму внимательно или зайдите на сайт под своим именем».
Вот и всё, о чём я хотел рассказать в этой статье.
Пару выпусков назад мы познакомились с двумя функциями для работы со строками: strtok(строка, символ) и strcmp (строка1, строка2). Напомню: функция strcmp (строка1, строка2) применяется для сравнения строк; а функция strtok(строка, символ) удаляет из строки символ. В php много других функций для работы со строками.
Например, функция trim() отсекает лишние пробелы в начале и в конце строки. Это нужно на случай, если при вводе пароля или имени в форму регистрации пользователь по невнимательности добавил пробел. Для программы пробел – тоже символ, и в файл данные запишутся вместе с пробелом. Потом, при попытке повторного входа на сайт, пользователь может пробел не ввести, и программа скажет о неверном имени/пароле.
Можете даже проверить всё, что я тут сказал, на созданной нами форме регистрации. Введите при регистрации какое-нибудь имя и прибавьте к нему пару пробелов. Потом попробуйте войти с этим именем, но без пробелов. Вылезет сообщение, что имя указано не верно. То же будет с паролем.
В общем, давайте доработаем нашу форму, застраховавшись от лишних пробелов.
Открываем reg.php и после проверки, заполнены ли поля формы, добавляем код:
<?php
if (($name == "") || ($password == "") || ($email == ""))
{
echo "<p>Форма заполнена не полностью! Вернитесь, пожалуйста, и заполните все поля формы!</p>";
exit ();
}
else
{
/*удаляем лишние пробелы из формы*/
$name = trim ($name);
$password = trim ($password);
$email = trim ($email);
$newfile = fopen($name, "w");
fwrite ($newfile, $password);
fwrite ($newfile, "\n");
fwrite ($newfile, $email);
fwrite ($newfile, "\n");
fclose ($newfile);
echo "<p>Поздравляем Вас, " .$name. ". Регистрация прошла успешно.</p>";
}
/*чтение из файла с помощью функции fread */
$file = fopen($name, "r");
$n = fread ($file, 100);
echo "<p>Ваш пароль: " .$n. ". Сохраните его.</p>";
fclose ($file);
/*чтение из файла с помощью функции file и массива*/
$rfile = fopen($name, "r"); /*открываем файл только для чтения*/
$data = file($name); /* считываем открытый файл в массив $data*/
echo "Ваш пароль: " .$data[0]. ". Ваш электронный адрес: " .$data[1]. ". Сохраните свои данные."; //выводим из массива на страницу
fclose ($rfile); //закрыли файл
?>
Сохраните изменения.
Открываем testreg.php и также после проверки на заполненность формы добавляем код:
<?php
/*проверяем, заполнены ли все поля формы*/
if (($name == "") || ($pass == ""))
/*если не заполнены, выводится сообщение*/
{
echo "<p>Форма заполнена не полностью! Вернитесь, пожалуйста, и заполните все поля формы!</p>";
exit (); /*и программа останавливается*/
}
/*если все поля формы заполнены, следуем дальше*/
else
{
/*удаляем лишние пробелы из формы*/
$name = trim ($name);
$pass = trim ($pass);
if (!file_exists($name))
{
echo "<p>Имя пользователя указано не верно. Заполните форму внимательно или зайдите на сайт под своим именем.</p>";
}
else
{
$rfile = fopen ($name, "r"); /*открываем для чтения файл, имя которого совпадает с именем из формы*/
$data = file ($name);/*читаем из открытого файла*/
$newstr = strtok ($data[0], "\n"); /*удаляем из первого элемента массива data код перехода на новую строку*/
/*так как пароль находится в первой строке открытого файла, то нужно сравнить пароль из формы с этой первой строкой*/
if (strcmp ($newstr, $pass) == 0)
{
echo "<p>У Вас есть права зарегистрированного пользователя.</p>";
}
else
{
echo "<p>Ведённый пароль не верный.</p>";
}
}
}
?>
Сохраните изменения. Теперь проверьте работу формы, заведомо вводя при регистрации имя с пробелами в конце или в начале. Потом, при проверке, введите имя без пробелов. Сообщения об ошибке не будет.