Для того, чтобы хранить данные и работать с ними можно использовать базы данных. Однако это не всегда оправдано. Также иногда требуется в одно поле базы данных записать несколько значений, например, массив. Для того, чтобы работать с такими данными в php можно использовать функцию explode()
, которая позволяет разбивать строку с помощью разделителя, помещая результат в массив. Обрабатывать данные из оперативной памяти, находящимся в массиве не только проще, но и быстрее.
Один из вариантов хранения данных пользователей в текстовом файле
Для примера рассмотрим вариант хранения данных пользователей (логина и пароля) в текстовом файле. Пусть каждая строчка в таком файле будет отвечать за одного пользователя. В строке будут храниться логин пользователя и его пароль. Для того, чтобы отделить их, в качестве разделителя будем использовать знак табуляции. На клавиатуре этот символ находится в левом крайнем ряду и имеет название Tab
. В текстом виде этот знак хранится в виде кода данного символа, который соответствует записи \t
.
Подготовим такой файл с записями о логине и пароле нескольких пользователей и назовём его users.txt
:
user1 pass1
user2 pass2
user3 pass3
user4 pass4
PHP-код, проверяющий наличие пользователя в текстовом файле
Сразу приведу готовое работающее решение на языке php, ниже разберём, как работает данный код:
<?php
define("UsersFile", 'users.txt');
if (isset($_POST['user'])) {
$user_form = $_POST['user'];
}
else {
$user_form = '';
}
?>
<form method="post" action="">
<input type="text" name="user" placeholder="введите имя пользователя">
<input type="submit" value="Enter!">
</form>
<br><br>
<?php
print detect_field ($user_form);
function detect_field ($user) {
$reg_form = fopen(UsersFile, "rt") or die ("Ошибка: Не могу открыть файл пользователей<br>");
if (flock($reg_form, LOCK_EX)) {
$lines = explode ("\n", fread ($reg_form, filesize(UsersFile)));
foreach ($lines as $line) {
$userdata = explode ( "\t", $line);
if ( filter_var($userdata[0], FILTER_SANITIZE_EMAIL) == $user ) {
$freename = 'Пользователь <b>' . $userdata[0] . '</b> найден. Его пароль <b>' . $userdata[1] . '</b><br><br>';
break;
} else {
$freename = 'Пользователь <b>' . $user . '</b> не найден.<br><br>';
}
}
} else {
echo "Ошибка: Файл пользователей не может быть заблокирован на время работы программы<br>";
}
fclose($reg_form);
return $freename;
}
?>
Задание именованной константы с именем файла с паролями пользователей
Для того, чтобы не вводить каждый раз (и не запоминать) название файла с паролями пользователей, определим его в именованную константу UsersFile
с помощью функции define()
:
define("UsersFile", 'users.txt');
Чтение данных, получаемых из HTML-формы
Далее прочтём данные, полученные из HTML-формы, а конкретно, имя пользователя. Если оно задано, поместим его в переменную $user_form
, если нет, обнулим эту переменную (мало ли, что в ней может содержаться):
if (isset($_POST['user'])) {
$user_form = $_POST['user'];
}
else {
$user_form = '';
}
HTML-форма для передачи имени пользователя
На этом блок подготовки данных можно считать полным. После него идёт вывод простейшей HTML-формы, передающей из браузера методом POST
имя пользователя в поле с именем user
скрипту, вызвавшему эту форму (то есть самому себе - атрибут тега form
пустой action=""
):
<form method="post" action="">
<input type="text" name="user" placeholder="введите имя пользователя">
<input type="submit" value="Enter!">
</form>
<br><br>
Вызов функции, обрабатывающей полученные из формы данные
Ну и вызовем функцию detect_field ()
, которая следует ниже с помощью печати её результатов работы, передав ей значение, полученной ранее переменной $user_form
:
print detect_field ($user_form);
Функция, анализирующая полученные данные из HTML-формы и сравнивающая их с данными, хранящимися с текстовом файле
Ниже собственно сама функция function detect_field ($user)
, которая анализирует полученные данные из HTML-формы и сравнивающая их с данными, хранящимися с текстовом файле на сервере. Тело функции (то, что она делает), размещено между фигурными скобками {
и }
. Рассмотрим то, что же делает эта функция.
Открываем на чтение файл с паролями пользователей
С помощью функции fopen()
с параметрами rt
(читать r
текстовые данные t
) из файла, имя которого прописано в именованной константе UsersFile
:
$reg_form = fopen(UsersFile, "rt") or die ("Ошибка: Не могу открыть файл пользователей<br>");
Блокировка файла на время выполнения программы
Если файл удалось открыть, заблокируем его на время выполнения программы с помощью функции flock()
:
flock($reg_form, LOCK_EX))
Чтение файла в массив $lines
Если файл свободен для блокировки, прочитаем сразу весь файл и разместим его построчно в массив $lines
.
$lines = explode ("\n", fread ($reg_form, filesize(UsersFile)));
Работа функции PHP fread()
кратко описана в → этой статье. Функцию explode()
рассмотрим ниже, когда будем разбивать строку на элементы.
Построчный обход массива
Теперь у нас есть массив $lines
, каждый элемент которого содержит строчку из файла с паролями пользователей. Обойдём каждый элемент этого массива строку за строкой с помощью оператора цикла foreach()
:
foreach ($lines as $line)
PHP-функция explode()
Вот и добрались до функции explode()
. Общий вид этой функции php:
explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] ) : array
Общее описание:
PHP-функция
explode()
возвращает массив строк, полученных разбиением строкиstring
с использованиемdelimiter
в качестве разделителя.
Для наших целей в качестве разделителя служит символ табуляции \t
, а данные уже находятся в переменной $line
. (Напомню, мы находимся в цикле foreach
). поэтому, всё, что нужно сделать, — это поместить пару логин/пароль в собственный массив $userdata:
$userdata = explode ( "\t", $line);
Есть ли такой пользователь в файле, хранящимся на сервере?
Ну а дальше, собственно логическая часть программы. Текущее значение имени пользователя сейчас находится в первом элементе массива с индексом 0
— $userdata[0]
. Его и сравниваем с переданным из HTML-формы в функцию значением $user
, применив фильтр очистки FILTER_SANITIZE_EMAIL
. (Это я на будущее, так как у меня именем пользователя будет его email. О том, как работают встроенные в php фильтры описано в → этой статье.
if ( filter_var($userdata[0], FILTER_SANITIZE_EMAIL) == $user )
Ну и в зависимости от того, есть ли совпадение или нет, значение переменной $freename
будет содержать ответ на этот вопрос.
После того, как было найдено первое совпадение (выход по break
) или закончится файл с данными пользователей, закроем наш файл (это снимет с него блокировку):
fclose($reg_form);
И передадим переменную $freename
с результатом в виде значения функции
return $freename;
Именно это значение и будет напечатано под формой ввода логина пользователя.
Резюме
Собственно всё. =)
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)