Как изменять данные в PHP: полное руководство с примерами

Раздел: PHP программирование -> Работа с файлами и данными в PHP

Изменение данных - распространённая задача в веб-разработке. PHP предлагает различные инструменты для обновления информации, хранящейся в файлах или базах данных. В этой статье рассмотрены основные подходы и их особенности.

Основные подходы к изменению данных в PHP

Наиболее универсальное решение: работа с JSON-файлами

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

Пример: изменение поля 'name' в файле data.json.


<?php
$file = 'data.json';
if (!file_exists($file)) {
    die('Файл не найден');
}
$json = file_get_contents($file);
if ($json === false) {
    die('Ошибка чтения файла');
}
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    die('Ошибка декодирования JSON: ' . json_last_error_msg());
}
$data['name'] = 'Новое значение';
$newJson = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
if (file_put_contents($file, $newJson) === false) {
    die('Ошибка записи файла');
}
echo 'Данные успешно обновлены';
?>
  

изменить данные php (изменение данных в php)

Типичные ошибки:

  • Неправильный путь к файлу - проверяется функцией file_exists.
  • Отсутствие прав на запись - выводится предупреждение от file_put_contents.
  • Некорректный JSON - используется json_last_error для диагностики.
  • Потеря данных при параллельных запросах - требуется блокировка.

Цель: быстрое обновление структурированных данных. Случаи использования: конфиги, временное хранение, API.

Как обновить данные в CSV-файле?

Цель: изменить записи в табличных данных. Применяется для импорта/экспорта, обработки логов.


<?php
$file = 'users.csv';
$rows = array_map('str_getcsv', file($file));
$header = array_shift($rows); // сохраняем заголовки
foreach ($rows as &$row) {
    if ($row[0] == '3') { // изменяем строку с id = 3
        $row[1] = 'Иван';
        $row[2] = 'ivan@example.com';
    }
}
unset($row);
$out = fopen($file, 'w');
fputcsv($out, $header);
foreach ($rows as $row) {
    fputcsv($out, $row);
}
fclose($out);
?>
  

Проблемы:

  • При больших файлах работает медленно - лучше использовать итераторы.
  • Повторное считывание и запись всего файла - риск повреждения при ошибке.
  • Не учитываются кавычки и разделители - fputcsv решает эту задачу.

Как изменить текст в файле построчно?

Цель: замена определённых строк, например, в конфигах или логах.


<?php
$file = 'config.ini';
$lines = file($file);
foreach ($lines as &$line) {
    if (strpos($line, 'debug =') === 0) {
        $line = "debug = true\n";
    }
}
unset($line);
file_put_contents($file, implode('', $lines));
?>
  

Ошибки:

  • Если файл большой, загрузка в память неэффективна - для больших файлов применяется потоковая обработка.
  • Неправильное обнаружение конца строки - учитывать , .

Как обновить записи в базе MySQL через PDO?

Цель: выполнение UPDATE в реляционной БД. Используется для веб-приложений.


<?php
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => 'new@example.com', ':id' => 1]);
echo 'Обновлено строк: ' . $stmt->rowCount();
?>
  

Типичные проблемы:

  • Ошибки соединения - проверка исключений.
  • SQL-инъекции - параметризованные запросы предотвращают их.
  • Неверный тип данных - PDO приводит к ошибке.

Как модифицировать данные в XML-файле?

Цель: изменение элементов в структурированном XML. Применяется в конфигурациях, обмене данными.


<?php
$xml = simplexml_load_file('data.xml');
if ($xml === false) {
    die('Ошибка загрузки XML');
}
$xml->item[0]->title = 'Новый заголовок';
$xml->asXML('data.xml');
?>
  

Ошибки:

  • XML-документ может быть некорректным - проверка на false.
  • Потеря форматирования - asXML перезаписывает файл.
  • При больших файлах лучше использовать XMLReader/XMLWriter.

Как выполнить замену текста с помощью регулярных выражений?

Цель: сложная замена по шаблону. Используется для рефакторинга кода, преобразования данных.


<?php
$content = file_get_contents('source.txt');
$pattern = '/old_pattern/i';
$replacement = 'new_text';
$newContent = preg_replace($pattern, $replacement, $content, -1, $count);
if ($count > 0) {
    file_put_contents('source.txt', $newContent);
    echo "Заменено $count вхождений";
} else {
    echo 'Совпадений не найдено';
}
?>
  

Проблемы:

  • Неправильный синтаксис регулярного выражения - вызывает ошибку E_WARNING.
  • Ограничение backtrack limit - для сложных строк может не сработать.
  • Преобразование специальных символов - требуется preg_quote.

Расширенные примеры изменения данных

Пример 1: Обновление нескольких полей в JSON с проверкой изменений

Пример

<?php
$file = 'products.json';
$data = json_decode(file_get_contents($file), true);
$original = $data;
// Изменяем цену всех товаров с категорией 'books'
foreach ($data as &$item) {
    if ($item['category'] === 'books') {
        $item['price'] = round($item['price'] * 1.1, 2);
    }
}
unset($item);
// Записываем только если есть изменения
if ($data !== $original) {
    file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
    echo 'Данные обновлены';
} else {
    echo 'Изменений не было';
}
?>
Результат: файл products.json будет содержать цены, увеличенные на 10% для книг.

Пример 2: Пакетное обновление CSV с использованием SplFileObject

Пример

<?php
$file = new SplFileObject('data.csv', 'r+');
$file->setFlags(SplFileObject::READ_CSV);
$rows = [];
foreach ($file as $row) {
    $rows[] = $row;
}
$header = array_shift($rows);
// Изменяем второе поле всех строк
foreach ($rows as &$row) {
    if (isset($row[1])) {
        $row[1] = strtoupper($row[1]);
    }
}
unset($row);
$file->ftruncate(0);
$file->fputcsv($header);
foreach ($rows as $row) {
    $file->fputcsv($row);
}
$file = null;
?>
Результат: все значения во втором столбце CSV приведены к верхнему регистру.

Пример 3: Транзакционное обновление БД с откатом

Пример

<?php
try {
    $pdo->beginTransaction();
    $stmt = $pdo->prepare("UPDATE accounts SET balance = balance - :amount WHERE id = :from");
    $stmt->execute([':amount' => 100, ':from' => 1]);
    $stmt = $pdo->prepare("UPDATE accounts SET balance = balance + :amount WHERE id = :to");
    $stmt->execute([':amount' => 100, ':to' => 2]);
    $pdo->commit();
    echo 'Перевод выполнен';
} catch (Exception $e) {
    $pdo->rollBack();
    echo 'Ошибка: ' . $e->getMessage();
}
?>
Результат: баланс счета 1 уменьшен на 100, счета 2 увеличен на 100. При ошибке транзакция откатывается.

Пример 4: Изменение XML через XPath

Пример

<?php
$xml = new DOMDocument();
$xml->load('config.xml');
$xpath = new DOMXPath($xml);
$nodes = $xpath->query("//setting[@name='max_size']");
if ($nodes->length > 0) {
    $node = $nodes->item(0);
    $node->nodeValue = '2048';
    $xml->save('config.xml');
    echo 'Значение обновлено';
}
?>
Результат: атрибут 'max_size' элемента 'setting' изменён на 2048.

Пример 5: Замена в нескольких файлах с DirectoryIterator

Пример

<?php
$dir = new DirectoryIterator('./logs');
foreach ($dir as $fileinfo) {
    if ($fileinfo->isFile() && $fileinfo->getExtension() === 'log') {
        $content = file_get_contents($fileinfo->getPathname());
        $newContent = str_replace('ERROR', 'WARNING', $content);
        file_put_contents($fileinfo->getPathname(), $newContent);
    }
}
echo 'Обработаны все .log файлы';
?>
Результат: во всех файлах с расширением .log в папке logs слово 'ERROR' заменено на 'WARNING'.

Изменение данных в PHP - comments

En
изменить данные php (php)