PHP JSON. Запись, чтение и редактирование JSON файла. Пишем полноценное приложение

    12 комментариев 15656

php json

Привет. Здесь вы узнаете как работать с JSON в PHP. Мы напишем полноценное приложение по типу CRUD, которое уже делали, но в этот раз хранить данные в БД не будем, а запишем их и будем редактировать и удалять в JSON файле. Это уже полноценное программирование и реальный рабочий пример того, как делать запись в JSON файл. Но прежде прошу обратить ваше внимание, что с файлами мы уже работали и делали гостевую книгу. Теперь же вы сможете сделать такую же, но данные будут храниться в формате JSON вместо обычного текста и таким образом сможете сделать полноценную админку, где будете редактировать сообщения.

Телеграм-канал serblog.ru

Напишем некий задачник или TODO лист. Традиционно подключим Bootstrap для удобства и создадим таблицу, в которой будем выводить данные из JSON файла. В ней будет всего три поля: ID записи, сама запись и кнопки редактирования и удаления. Сделаем кнопку добавления записи через модальное окно.

Демо 2 вариант

Весь HTML здесь приводить не буду, он получился довольно массивный. Пример вы можете скачать по ссылке в конце статьи? а так же посмотреть видеоурок.

1
2
3
4
5
6
7
8
9
10
11
12
<button class="btn btn-success mb-1" data-toggle="modal" data-target="#exampleModal"><i class="fas fa-plus-circle"></i></button>
<table class="table table-bordered">
  <thead class="table-dark">
    <tr>
      <th scope="col"></th>
      <th scope="col">Задача</th>
      <th scope="col">Действие</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>

TODO list
Модальное окно:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!--Modal-->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">Добавить запись</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"  method="post">
                    <div class="input-group">
                        <input type="text" class="form-control" name="todo" />
                    </div>
            </form></div>
            <div class="modal-footer">
                <button class="btn btn-primary send" data-send="1">Создать</button>
            </div> 
        </div>
    </div>
</div>
<!--Modal-->

А вот и сам PHP код, который делает всю магию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$todoName = htmlspecialchars($_POST['todo']);
$todoName = trim($todoName);
$jsonArray = [];
 
//Если файл существует - получаем его содержимое
if (file_exists('todo.json')){
    $json = file_get_contents('todo.json');
    $jsonArray = json_decode($json, true);
}
// Делаем запись в файл
if ($todoName){
    $jsonArray[] = $todoName;
    file_put_contents('todo.json', json_encode($jsonArray, JSON_FORCE_OBJECT));
    header('Location: '. $_SERVER['HTTP_REFERER']);
 
}
 
// Удаление записи
$key = @$_POST['todo_name'];
if (isset($_POST['del'])){
    unset($jsonArray[$key]);
    file_put_contents('todo.json', json_encode($jsonArray, JSON_FORCE_OBJECT));
    header('Location: '. $_SERVER['HTTP_REFERER']);
 
}
 
// Редактирование
if (isset($_POST['save'])){
    $jsonArray[$key] = @$_POST['title'];
    file_put_contents('todo.json', json_encode($jsonArray, JSON_FORCE_OBJECT));
    header('Location: '. $_SERVER['HTTP_REFERER']);
}

Между открывающим и закрывающим тегом tbody в таблице вставляем цикл foreach:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 < ?php
   foreach ($jsonArray as $key => $todo): ?>
   <tr>
    <th scope="row">< ?php echo $key + 1 ;?></th>
    <td>< ?php echo $todo; ?></td>
    <td>
   <button type="submit" class="btn btn-sm btn-success" data-toggle="modal" data-target="#edit<?php echo $key;?>"><i class="fas fa-edit"></i></button>
   <button class="btn btn-sm btn-danger" data-toggle="modal" data-target="#delete<?php echo $key;?>"><i class="fas fa-trash-alt"></i></button>
<!--Modal delete-->
<div class="modal fade" id="delete<?php echo $key;?>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
  <div class="modal-content">
     <div class="modal-header">
     <h5 class="modal-title" id="exampleModalLabel">Вы хотите удалить запись №< ?php echo $key + 1 ;?></h5>
     <button type="button" class="close" data-dismiss="modal" aria-label="Close">
       <span aria-hidden="true">&times;</span>
     </button>
      </div>
     <div class="modal-body ml-auto">
      <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"  method="post">
        <div class="input-group">
           <input type="hidden" name="todo_name" value="<?php echo $key; ?/>">
        </div>
          <button class="btn btn-danger del" name="del">Удалить</button>
        </form></div>
 
      </div>
     </div>
    </div>
<!--Modal delete-->
<!--Modal Edit-->
<div class="modal fade" id="edit<?php echo $key;?>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
     <div class="modal-content">
      <div class="modal-header">
       <h5 class="modal-title" id="exampleModalLabel">Изменить запись</h5>
       <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span>
       </button>
      </div>
     <div class="modal-body">
      <form action="" method="post" class="mt-2">
        <div class="input-group">
           <input type="text" class="form-control" name="title" value="<?php echo $todo; ?/>">
         </div>
           <input type="hidden" name="todo_name" value="<?php echo $key;?/>">
          <div class="modal-footer">
             <button type="submit" name="save" class="btn btn-sm btn-success p-1 pt-0" data-target="#edit<?php echo $key;?>">Обновить</button>
          </div>
       </form>
      </div>
     </div>
    </div>
<!--Modal Edit-->
  </div></td>
  </tr>
< ?php endforeach; ?>

В 4 строке $key + 1 необходим для того, чтобы в таблице записи начинались с единицы, а не с ноля, как в JSON файле. В результате у нас получится следующее:

todo_php
А вот так появляются записи в JSON файле в виде объектов:
json-obj

Совсем не много кода и получилось готовое приложение по работе с JSON объектами в PHP. Это пример можно скачать и установить на свой сервер. Тестируйте, добавляйте новые функции и конечно же пишите свои комментарии под статьей.

СКАЧАТЬ

Любая сумма на развитие сайта

12 комментариев
  1. Артем:

    Отличная статья, помогло

  2. Хочу купить php построчное чтение файла json

  3. Альберт:

    Здравствуйте. В PHP понимаю примерно чуть больше чем ноль, но есть похожая на вашу статью задача. Интересует, как вы реализовали именно второй пример. Когда есть возможность добавить сразу несколько строк в одну запись.
    Спасибо вам огромное за ваш труд.

    • Александр Маврин:
      $jsonArray[] = [$todoName, $lastName, $item1, $item2];
      • евгений:

        А можно полностью php от
        $jsonArray[] = [$todoName, $lastName, $item1, $item2];

        как то цикл задваивает у меня….

      • Андрей:

        Можно полностью код выложить? Не получается получить нужный результат.

        • Александр Маврин:

          Код весь на странице. Что именно не получается?

          • Андрей:

            При добавлении еще одного столбца не получается организовать создание, сохранение и редактирование данных в нем.

  4. Alfred:

    Как реализована пагинация на 2 демо?

    • Александр Маврин:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
      if (isset($_GET['page'])) {
      	$page = $_GET['page'];
      }else{
      	$page = 1;
      }
       
      //$page = $_GET['page'];
      $onepages = 20;
      $from = ((int)$page -1) * $onepages;
       
      $arr = @file($file);
      if (!is_array($arr)) $arr = [];
      $cou = count($arr);
       
      $first=(int)$page*$onepages-$onepages;
      $last=((int)$page*$onepages)-1;
       
      $prev = (int)$page -1;
      $post = (int)$page +1;
       
      $pagesCount = ceil($cou / $onepages);
  5. Здравствуйте Александр! Огромное спасибо за работу, подписался на ваш канал, очень полезное дело делаете. Я только встал на пусть изучения PHP. Сейчас обучаюсь фронту и параллельно смотрю уроки по php. У меня вопрос, чем-то схожий с вопросом Альберта и ситуация очень похожая 🙂 Есть потребность записывать и редактировать сразу несколько полей одной строки и не могу разобраться как это правильно сделать. Если объявить массив $jsonArray[] = [$todoName, $lastName, $item1, $item2]; То как в модальное окно добавить поля для ввода данных для переменных: $lastName, $item1, $item2? Как потом организовать их вывод в одну строку в разные поля? И еще вопрос, в вашем коде используется функция:json_decode, чтобы в json файл записывалось в UTF-8, вместо unicode куда поместить параметр: JSON_UNESCAPED_UNICODE? Буду очень рад, если у вас появится время ответить мне.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *