Хранение и чтение массивов данных с помощью php-функции explode в текстовых файлах

Для того, чтобы хранить данные и работать с ними можно использовать базы данных. Однако это не всегда оправдано. Также иногда требуется в одно поле базы данных записать несколько значений, например, массив. Для того, чтобы работать с такими данными в 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;

Именно это значение и будет напечатано под формой ввода логина пользователя.

Резюме

Собственно всё. =)

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню