@ant123455432143

Почему запись в файл добавляется в конец?

Нужно сделать CRUD для файловой базы данных на PHP.
Но не получается для обновления, то есть я хочу найти обновить строку с указанным в $key ключом, но почему то в моем примере он добавляет строку в конец, а не добавляет ее туда, куда указывает fgets. Можно ли что-то сделать, чтобы перезаписать эту строку?

public static function update($file, $key, $newValue)
    {
        rewind($file);

        $recordKey = "";

        while (($line = fgets($file)) !== false) {
            $recordKey = explode(':', $line)[0];
            if ($recordKey == $key) {
                fwrite($file, "$key:$newValue");
                break;
            }
        }
    }


И еще вопрос, работа непосредственно в файле, как в примере, это плохая идея? Лучше бы использовать функцию file(), и манипулировать строками в массиве, а затем переписать файл?
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@rPman
Для позиционирования в файле нужно пользоваться fseek а для получения ftell.

fgets смещает указатель на следующую строку, значит fwrite будет ее затирать. Значит если у тебя была последняя строка - значит указатель будет в конце файла.

Теперь о главном - замена строки в текстовом файле нормально будет работать только если размер этой строки совпадает с прошлой, иначе при меньшем размере новой строки в файле останется мусор от прошлой, а при большем - будут затерты следующие строки. Т.е. понадобится сдвигать содержимое всего файла после текущей позиции или полностью перезаписывать весь файл, причем если оперативной памяти хватает то это легко - загрузил построчно file, изменил нужную строку в массиве, и сохранил с помощью к примеру implode+file_put_contents или циклом по массиву и fputs.

Именно по этой причине текстовые форматы данных не подходят для хранения нескольких записей. Допускается по одному файлу на запись, а запись это текстовая строка.

Благодаря обширному количеству поддержки различной сериализации данных в текстовый формат, и не только (var_export/serialize/json_encode/igbinary), полная перезапись файла все еще используется как способ хранения миниатюрной базы данных в файле, но только потому что код для его использования очень простой, пока не нужно думать о многопоточном доступе к этим данным.

Настоятельно рекомендуется не изобретать паровоз и пользоваться например sqlite, универсальная функциональная sql база данных, не требующая обслуживания и установки (работает на основе файла без подключения, как библиотека).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
02 мая 2024, в 23:56
2000 руб./за проект
02 мая 2024, в 23:29
1500 руб./в час
02 мая 2024, в 23:16
7500 руб./за проект