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

    39 комментариев 17645

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. Это пример можно скачать и установить на свой сервер. Тестируйте, добавляйте новые функции и конечно же пишите свои комментарии под статьей.

СКАЧАТЬ

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

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

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

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

  3. Альберт:

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

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

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

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

        • Серега:

          Здравствуйте. Вот этот бред что написали $jsonArray[] = [$todoName, $lastName, $item1, $item2]; Работать не будет. И создавать на несколько записей нужно совсем по другому. $img = $_POST[‘img’]; $title= $_POST[‘title’];
          А вот дальше $arr = array(
          ‘title’ => «$title»,
          ‘img’ => «$img»,

          ); и если по этому коду, делаем $jsonArray[] = $todoName;
          file_put_contents(‘todo.json’, json_encode($jsonArray, JSON_FORCE_OBJECT));
          header(‘Location: ‘. $_SERVER[‘HTTP_REFERER’]); А теперь, одно но. Вот так у вас выскочит только array. А нужно будет к примеру
          <?php echo "»; ?>

        • Серега:

          $jsonArray[] = $todoName; вам нужно заменить на $jsonArray[] = $arr;

        • Серега:

          И чуть не забыл, если вы добавляете с mysli .То там еще проще. $quantity = «SELECT * FROM `Pages`»;
          if($result = mysqli_query($conn, $quantity)){
          while($row = $result->fetch_assoc()) {
          $Array[] = $row;
          }

          $arr = json_encode($Array);

          file_put_contents(‘фаил.json’, $arr);

        • Серега:

          И на страницу добавляем if (file_exists(‘файл.json’)){
          $json = file_get_contents(‘файл.json’);
          $jsonArray = json_decode($json, true);
          }
          foreach ($jsonArray as $key => $row):
          echo $row[‘title’]; Можете прописывать сразу классы. Настраивать под ваш стиль сайта. Дальше уже решать вам.

      • Андрей:

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

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

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

          • Андрей:

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

  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? Буду очень рад, если у вас появится время ответить мне.

  6. Привет, отличная TODO.
    Можно на пальцах объяснить как идет обращение к кнопке удаления или редактирования. Я сейчас делаю корзину и при добавлении инфы в json у меня либо добавляется весь массив, либо только последний элемент. Как мне сказать коду добавить только этот товар?

  7. Серега:

    Александр, извиняюсь за грубость. Но почемувы людям не дописываете код до конца. К примеру на разбивку, вы прекрасно понимаете, что что-бы разбить два json_decode сделать нужно. Один разбивка файла ,второй подсчет.
    $limit = «10»;
    $json = file_get_contents(‘animebs.json’);
    $jsonArray = array_chunk(json_decode($json, true), $limit, true);
    $jsonrows = json_decode($json, true);
    $rows = count($jsonrows);

    Так мы получаем количество страниц
    $num_pages = ceil($rows / $limit);

    Получаем
    foreach ($jsonArray[$_GET[‘pages’] — 1] as $key => $row):
    $_GET[‘pages’]- Если значение к примеру два,лимит 10 получим с 10 по 20.
    и в конце сами страницы
    $count_pages = $num_pages;

    $active = $cur_page;
    $count_show_pages = 10;

    if ($count_pages > 1) {
    $left = $active — 1;
    $right = $count_pages — $active;
    if ($left $count_pages) {
    $start -= ($end — $count_pages);
    $end = $count_pages;
    if ($start

    <?php for ($i = $start; $i
    <span class="» id=»act» data-title=»»><button id="» onClick=»pages(this.id)» class=»str»>

    <button id="» onClick=»pages(this.id)» class=»str»>>
    <button id="» onClick=»pages(this.id)» title=»Последняя страница» class=»str»>>>

    Эта навигация не всем пойдет.Тут делал для AJAX. Обновления данных без перезагрузки страницы. Если его чуть по править, и под get запрос спокойна использовать.

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

      Напишите код по правильному и пришлите людям для скачивания.

      • Серега:

        Доброй ночи. Код тут при обработки сообщения портиться . Убираются символы, ну это понятное дело.Для защиты от атак. Да и код этот можно написать по разному, зависит от того что хотят другие. Если они к примеру хотят сортировки сделать,то уже код можно будет составить по другому . if (file_exists(‘путь к вашему фалу.json’)){
        $json = file_get_contents(‘путь к вашему фалу.json’);
        $jsonrows = json_decode($json, true);
        $rows = count($jsonrows);
        К примеру делаем сортировку по запросу ,если прописана у них
        $date = array_column($jsonrows, ‘datе’);
        array_multisort($date, SORT_DESC, $jsonrows);
        SORT_DESC- Сортирует результирующий набор в порядке убывания.
        SORT_ASC Сортирует результирующий набор в порядке возрастания.
        И они захотели сделать это по запросу, к примеру
        Тогда делаем
        if (isset($_GET[‘sort’])) {
        $sort= $_GET[‘sort’];
        }else{
        $sort= ‘SORT_DESC’;
        }
        И правим код сортировки
        $date = array_column($jsonrows, ‘datе’);
        array_multisort($date, $sort, $jsonrows);
        Теперь можно спокойной прописывать код для сортировки файла по дате. Дальше после сортировки
        установка лимита на вывод $limit = ’10’;
        Теперь после сортировки прописываем
        $jsonrows = array_chunk($jsonrows, $limit, true);
        $jsonrows будет уже отсортирован. Вывод идет по страницам это чуть ниже напишу.
        Пропишем если страница к примеру index
        if (isset($_GET[‘page’])) {
        $page = $_GET[‘page’];
        }else{
        $page = 1;
        }

      • Серега:

        Дальше получаем количество страниц
        $num_pages = ceil($rows / $limit);
        Выводим данные
        foreach ($jsonrows[$page — 1] as $key => $rw):
        echo $rw[‘title’];
        echo $rw[‘images’];
        echo $rw[‘description’];
        endforeach;
        Ну тут уже зависит от их json файла.
        И в низу прописываем код на разбивку , который писал ранее . Тут по сути так-же как выводим с mysli. Разбивка делается по сути почти так-же. Мне не жалко кода, если есть возможность помочь людям, почему-бы и нет

      • Серега:

        Ну и да, как вы понимаете можно сортировать не только по датам. К примеру по id. Можно сделать код который даст выбрать сортировать по id или по дате
        if (isset($_GET[‘id’])) {
        $choice = «id»;
        }else{
        $choice= ‘date‘;
        }
        и прописать в сортировку
        $date = array_column($jsonrows, $choice);
        array_multisort($date, $sort, $jsonrows);

        Теперь можно сортировать и по дате,и по id.

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

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

          • Серега:

            Хорошо, только сделаем по другому. Я ютуб забросил лет 10 назад, я создам новый канал. И опубликую там видео и сам код. Где будет показана от «A» до «Я». И для примера сделаем вывод не только на страницу с разбивкой. Ну к примеру в карусель.. Еще так-же пропишу. Если вас устроит такой вариант, то не вопрос. А то потом получиться, что у кого-та json не правильно закодирован. И скажут еще, что код не работает. И создания файла, сразу сделаем на видео. Прямо с базы данных.

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

            В общем-то как вам удобно. Только не совсем понятно каким людям вы собрались его показывать?

          • Серега:

            Только вам, после видео удаляем. Лишний геморой мне не нужен. Да и на статью вашу случайно нарвался. Искал одну проблему, с получением данных в json. Там другая песня, что нам открыли базу, часть приходит нормальной, а часть бывает просто даже не кодировки, а в символах. Прямой доступ конечно они не дадут, но этот вопрос уже нужно решать. Заказала подруга сайт, для своего канала. А работу мне тормозит, уже их база. Ладно,с этим вопрос решим. На счет кода, давайте послезавтра начну делать. И Александр, только без обид. Меня просто задел, ваш ответ другому человеку. И то, что вы ему предложили, к стати, если вы не против.. После разборки моего кода, я даже потрачу время, скопирую ваш код .Создадим отдельную страницу. И только исправим его , тем что вы предложили .Альберт:
            30.08.2022 в 14:51
            Здравствуйте. В PHP понимаю примерно чуть больше чем ноль, но есть похожая на вашу статью задача. Интересует, как вы реализовали именно второй пример. Когда есть возможность добавить сразу несколько строк в одну запись.
            Спасибо вам огромное за ваш труд.

            Ответить
            Александр Маврин:
            30.08.2022 в 18:16
            $jsonArray[] = [$todoName, $lastName, $item1, $item2];
            И к стати, думаю вы понимаете, что с этим кусочком ваш код не заработает. Ну это рассмотрим на видео. Я так посмотрел сайт, конечно с моей точки зрения, рекламы вы тут напихали гору. Но что вы увидите на видео, вы сами думаю без меня знаете. Так , ладно, код и стиль к нему напишу после праздника. И вас к стати с праздником. И к стати, я могу показать прямо сейчас работу кода, но без публикации его. Но как он работает увидите. Там сайт еще создаю, могу открыть и опубликовать кусок для показа

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

            У меня нет сторонней рекламы. Где вы увидели?

  8. Серега:

    Сам код вы увидите,и работу его. Но данные которые использовались, но оформление и данные публиковать не желательно. Зная строения сайта, и его структуру. Сами понимаете, ждите гостей. Если просто будут по пытки взлома,эта пол беды. Устрою досс. Эта уже гемарой

  9. Серега:

    Я не про эту рекламу,а про всплывающие окна. Ладно окно на подписку. Вот зачем второе? По пробую снять скрин. Я без http отправлю. Что бы дошла сама ссылка с скриншота, skrinshoter.ru/sNl7Y9ioXMP?a

  10. Серега:

    Сейчас я подготовлю страницу, добавлю несколько записей в базу, установлю лимит с базы, и сделаем кодировку. Короче, чтобы данные которые добавлю только и были. Скриншотам и сделаем видео. И кусок этого кода и отправлю вам. Только смотрите, на редактирования уже чуть по другому нужно будет. Я там напишу и на редактор. Там уже не подойдет ваш код $jsonArray[$key] = @$_POST[‘title’];

  11. Серега:

    if (file_exists(‘test/f.json’)){
    $json = file_get_contents(‘test/f.json’);
    $mostrandoLaPrueba = json_decode($json, true);

    }
    Подождите Александр. Я добавил кусок кода с карусели. Я ее сейчас добавлю в модельное окно. Окно на быструю руку, на css без скриптов. через OneClick Не будем светить домен заказчика. А вот передачу сделаем через AJAX,подключу библиотеки

  12. Серега:

    Александр, я сейчас отдыхать. Завтра выходной, доделаю. Добавлять будем в отдельном php как и удалять if (isset($_POST[«alexandertitle»]) and $_POST[«alexanderText»]) {
    $alexanderdate = date(«m.d.y»);
    $alexandertitle = $_POST[«alexandertitle»];
    $alexanderText = $_POST[«alexanderText»];
    $alexanderarr = array(
    ‘date’ => «$alexanderdate»,
    ‘title’ => «$alexandertitle»,
    ‘Text’ => «$alexanderText»,

    );

    $arr = json_encode($alexanderarr);
    file_put_contents(‘alexander.json’, $arr);
    }

  13. Серега:

    if (isset($_POST[«alexandertitle»]) and $_POST[«alexanderText»]) {
    $alexanderdate = date(«m.d.y»);
    $alexandertitle = $_POST[«alexandertitle»];
    $alexanderText = $_POST[«alexanderText»];
    $alexanderarr = array(
    ‘date’ => «$alexanderdate»,
    ‘title’ => «$alexandertitle»,
    ‘Text’ => «$alexanderText»,

    );

    $arr = json_encode($alexanderarr);
    file_put_contents(‘alexander.json’, $alexanderarr);
    }

  14. Серега:

    Ну да, пока не забыл. Этот код будем использовать на добавления в ручную. Кнопку на добавления с базы там пропишу. Там на добавления пойдет if($result = mysqli_query($conn, $al)){
    while($row = $result->fetch_assoc()) {
    $alexander[] = $row;
    }
    $ar = json_encode($alexander);

    file_put_contents(‘alexanderMySQL.json’, $ar);

  15. Серега:

    Доброе утро, код закончил. Осталось оформить. И для постраничного вывода , переделать под get. Как сделаю видео ,пришлю.

  16. Серега:

    Ну вот вам кусочек примера. Что я вам и писал
    skrinshoter.ru/vNmEbgppioa?a

  17. Серега:

    skrinshoter.ru/vNmwhxf5ilI?a А вот тут я вам чуть рассказал. Вывод на этом коде делаем с базы

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

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