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

Для того, чтобы хранить данные и работать с ними можно использовать базы данных. Однако это не всегда оправдано. Также иногда требуется в одно поле базы данных записать несколько значений, например, массив. Для того, чтобы работать с такими данными в php можно использовать функцию explode(), которая позволяет разбивать строку с помощью разделителя, помещая результат в массив. Обрабатывать данные из оперативной памяти, находящимся в массиве не только проще, но и быстрее.

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



Один из вариантов хранения данных пользователей в текстовом файле

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

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

Резюме

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

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

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