Задать вопрос
@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(), и манипулировать строками в массиве, а затем переписать файл?
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@rPman
Для позиционирования в файле нужно пользоваться fseek а для получения ftell.

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

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

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

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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽