Запись и вывод данных из файла TXT в PHP

119
05 сентября 2019, 12:20

Пишу бота для группы в ВК…

Как реализовать функцию при которой при получении сообщения "Подписка" и если его ID не занесён в список он заносит его ID в файл user_id.txt.

А при получении сообщения "Отписка" и если его ID занесен в этот список он убирает ID пользователя из данного списка.

PS. Так же буду благодарен если кто-то скажет как можно перечислять переменные (Например: Привет, привет, хай, ку и т.д.) и он будет понимать что на все эти команды ему нужно отвечать одним сообщением.

Заранее спасибо

if($user_msg == 'Подписка'){    
        if($user_id == "ID_USER"){
            $v->msgSend("$user_name, ты уже подписан на рассылку!", $user_id, $access_token);           
        } else {
            $v->msgSend("$user_name, спасибо что подписались на рассылку записей. Для отписки используй команду: Отписка.", $user_id, $access_token);
        }
        }
if($user_msg == 'Отписка'){ 
        if($user_id == "ID_USER"){
            $v->msgSend("Вы успешно отписались от «Рассылки постов»!", $user_id, $access_token);            
        } else {
            $v->msgSend("$user_name, вы не можете отписаться от рассылки, так как вы не были подписаны на неё.", $user_id, $access_token);
        }
        }
Answer 1

Текстовый файл, возможно, не лучшее хранилище, но для обучения сойдёт.

Первым делом надо придумать формат хранения данных в файле. Это могут быть просто id разделённые символом, который в id точно никогда не встретится. Пусть это будет символ новой строки \n, например.

Далее, чтобы искать в уже записанных id, их значения надо прочитать:

$idsFile = __DIR__ . '/user_id.txt';
$idsStr = file_get_contents($idsFile);
$ids = array_filter(explode("\n", $idsStr));
var_dump($ids);

Соответственно проверить, что id уже есть среди ранее сохранённых id можно с помощью функции array_search. Если пользователя ещё нет в списке и Подписка, то добавляем его в массив $ids, если Отписка и пользователь есть в массиве то удаляем:

$pos = array_search($user_id, $ids);
switch ($user_msg) {
    case 'Подписка':
        if ($pos === false) {
            $ids[] = $user_id;
            $v->msgSend("$user_name, спасибо что подписались на рассылку записей. Для отписки используй команду: Отписка.", $user_id, $access_token);
        } else {
            $v->Send("$user_name, ты уже подписан на рассылку!", $user_id, $access_token);
        }
        break;
    case 'Отписка':
        if ($pos !== false) {
            unset($ids[$pos]);
            $v->msgSend("Вы успешно отписались от «Рассылки постов»!", $user_id, $access_token);
        } else {
            $v->msgSend("$user_name, вы не можете отписаться от рассылки, так как вы не были подписаны на неё.", $user_id, $access_token);
        }
        break;
    case 'привет':
    case 'хай':
    case 'ку':
        //
        break;
}

Ну и остаётся сохранить массив $ids в файл:

file_put_contents($idsFile, implode("\n", $ids));

Однако у такого способа много недостатков.

  1. Несколько одновременных запросов могут рассогласовать данные в файле. Например, для одного запроса скрипт прочитает файл и добавит id 123, но ещё не успеет записать изменения в файл. А в это время для второго запроса будет прочитан файл (без 123) и в него добавится id 456. Теперь первый обработчик запишет файл с 123, а затем второй с 456. Таким образом в файле не будет записи 123 (её затрёт запись второго обработчика).
  2. Чтение и поиск в большом файле могут занимать существенное время.

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

Реализация блокировок и индексов может оказаться достаточно сложной задачей для новичка и достаточно скучной для многоопытного разработчика, но есть готовое решение! Это базы данных. Самым простым вариантом может стать SQLite, для работ с ней надо освоить PDO. Умение работать с базами данных не только поможет вам в задаче с ботом, но и очень пригодится в будущем.

READ ALSO
Paypal обработка платежа

Paypal обработка платежа

есть форма, как обработать платеж у себя на сайте после оплаты?

125
PHP. Перезаписывает данные в массив

PHP. Перезаписывает данные в массив

Всем приветСтолкнулся с проблемой

105
Вывод данных из файла txt в PHP

Вывод данных из файла txt в PHP

Есть такой код, как реализовать функцию (не сильно меняя код) которая будет сравнивать ID в списке user_idtxt и в зависимости от True или False (есть или...

107
yii2. Проблема с доступом к action в backend

yii2. Проблема с доступом к action в backend

Всем приветКогда я создаю новый action , и перехожу на него ,то backend его не видит, хотя actionLogout, actionLogin,actionIndex - работают, но мои - нет

93