Архив месяца: Август 2021

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

php json

php json

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

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

Демо

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

СКАЧАТЬ

Валидация полей формы на PHP

Валидация формы на PHP

Валидация формы на PHP

Привет, друг. Помимо того, что можно делать проверки полей формы на JavaScript, необходимо так же делать валидацию на стороне сервера и сейчас мы с вами рассмотрим пример валидации на PHP. Проверять будет такие поля, как номер телефона, email, IP адрес, адрес сайта и др. Всего полей будет 7.

Валидация полей формы на PHP

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

Демо

Форму я сделал на Bootstrap и выглядит она так:

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
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" class="col-md-5" method="post">< ?php echo $err['success'] ?>
     <div class="form-group">
     <label for="">Имя</label>
     <input type="text" class="form-control" name="name" value="<?php echo $_POST['name'] ?/>" placeholder="Имя не более 10-ти символов">
     < ?php echo $err['name'] ?>
   </div>
   <div class="form-group">
     <label for="">Возраст</label>
     <input type="text" class="form-control" name="num" value="<?php echo $_POST['num'] ?/>" placeholder="Двузначное число">
     < ?php echo $err['num'] ?>
    </div>
    <div class="form-group">
      <label for="">Телефон</label>
      <input type="text" class="form-control" name="phone" value="<?php echo $_POST['phone'] ?/>" placeholder="Номер телефона формата РФ">
      < ?php echo $err['phone'] ?>
     </div>
     <div class="form-group">
       <label for="">Email</label>
       <input type="text" class="form-control" name="email" value="<?php echo $_POST['email'] ?/>" placeholder="Emai адрес">
       < ?php echo $err['email'] ?>
      </div>
      <div class="form-group">
        <label for="">IP адрес</label>
        <input type="text" class="form-control" name="ip" value="<?php echo $_POST['ip'] ?/>" placeholder="IP адрес">
        < ?php echo $err['ip'] ?>
      </div>
      <div class="form-group">
        <label for="">Сайт</label>
        <input type="text" class="form-control" name="url" value="<?php echo $_POST['url'] ?/>" placeholder="Адрес сайта">
        < ?php echo $err['url'] ?>
      </div>
      <div class="form-group">
	<label for="">Сообщение</label>
	<textarea class="form-control" name="text" placeholder="Ваше сообщение">
        < ?php echo $_POST['text'] ?>
        </textarea>
        < ?php echo $err['text'] ?>
      </div>
      <button type="submit" class="btn btn-success" name="submit">Отправить</button>
</form>

Вывод PHP переменно $err в HTML коде означает вывод ошибок и мы их напишем непосредственно в 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
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
function clear_data($val){
    $val = trim($val);
    $val = stripslashes($val);
    $val = strip_tags($val);
    $val = htmlspecialchars($val);
    return $val;
}
 
$name = clear_data($_POST['name']);
$num = clear_data($_POST['num']);
$phone = clear_data($_POST['phone']);
$email = clear_data($_POST['email']);
$ip = clear_data($_POST['ip']);
$url = clear_data($_POST['url']);
$text = clear_data($_POST['text']);
 
$pattern_phone = '/^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$/';
 
$pattern_name = '/^[А-ЯЁ][а-яё]*$/';
$err = [];
$flag = 0;
 
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    if (preg_match($pattern_name, $name)){
        $err['name'] = '<small class="text-danger">Здесь только русские буквы</small>';
        $flag = 1;
    }
    if (mb_strlen($name) > 10 || empty($name)){
        $err['name'] = '<small class="text-danger">Имя должно быть не больше 10 символов</small>';
        $flag = 1;
    }
    if (!filter_var($num, FILTER_VALIDATE_INT) || strlen($num) > 2){
        $err['num'] = '<small class="text-danger">Здесь должно быть только двузначное число</small>';
        $flag = 1;
    }
    if (empty($num)){
        $err['num'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!preg_match($pattern_phone, $phone)){
        $err['phone'] = '<small class="text-danger">Формат телефона не верный!</small>';
        $flag = 1;
    }
    if (empty($phone)){
        $err['phone'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
        $err['email'] = '<small class="text-danger">Формат Email не верный!</small>';
        $flag = 1;
    }
    if (empty($email)){
        $err['email'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!filter_var($ip, FILTER_VALIDATE_IP)){
        $err['ip'] = '<small class="text-danger">Формат ip не верный!</small>';
        $flag = 1;
    }
    if (empty($ip)){
        $err['ip'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!filter_var($url, FILTER_VALIDATE_URL)){
        $err['url'] = '<small class="text-danger">Формат url не верный!</small>';
        $flag = 1;
    }
    if (empty($url)){
        $err['url'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (empty($text)){
        $err['text'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if ($flag == 0){
        Header("Location:". $_SERVER['HTTP_REFERER']."?mes=success");
    }
}
if ($_GET['mes'] == 'success'){
    $err['success'] = '<div class="alert alert-success">Сообщение успешно отправлено!</div>';
}

С 1 по 7 стр. Функция очистки данных
С 9 по 15 стр. Принимаем данные из формы прогоняя их через функцию
17 стр. Регулярное выражение для номера телефона в формате РФ
19 стр. Регулярное выражение для имени (только рус.)
20 стр. Определяем переменную, как массив ошибок
21 стр. Специальный флаг. Присвоим ему значение — 0
23 стр. Проверка, если данные пришли методом POST
С 24 по 27 стр. Проверка на соответствие регулярному выражению ($name)
С 28 по 31 стр. Если поле пустое или больше 10 символов — выводим ошибку
С 32 по 35 стр. Фильтр проверки данных на целое число и длину строки
36 стр. Проверка поля на пустоту (в коде повторяется)
С 40 по 43 стр. Проверка на соответствие регулярному выражению ($phone)
С 48 по 51 стр. Фильтр валидации Email
С 56 по 59 стр. Фильтр валидации IP
С 64 по 67 стр. Фильтр валидации URL
С 76 по 78 стр. Если валидация пройдена

Если валидация всех полей будет пройдена, об этом нам скажет специальный флаг, которому мы в начале установили ноль, то перезагрузим страницу с очисткой формы и добавим к адресу GET-параметр mes и присвоим ему значение success. То есть если 0 — валидация пройдена, если 1 — есть ошибки. И в самом конце с 80 по 82 стр. проверяем, если такой параметр существует, то выводим сообщение об успешной отправке данных. Это один из примеров валидации на PHP и он не единственный верный, но как рабочий вариант вполне пригоден для использования. Через JS и Ajax валидация будет немного по-другому реализована, но общий принцип останется таким же.

Надеюсь, что теперь у вас не возникнет трудностей с валидацией форм на PHP. Пишите ваши комментрии по данной теме.

Если временами выключается компьютер. Что делать

Компьютер периодически выключается

Компьютер периодически выключается

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

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

Выключается компьютер во время игры

Второй случай произошел на днях, когда я монтировал видео в программе Camtasia Studio и когда оно было смонтировано я поставил его на обработку и через определенное время компьютер выключился. Я решил повторить процедуру, но теперь нужно было выяснить почему это происходит. А так как при работе в этой программе нагрузка идет в основном на процессор и видеокарту, то причина кроется как раз в одном из них. Я недавно менял термопасту на процессоре и поэтому причина скорее всего в видеокарте. И когда я запустил программу SpeedFan, чтобы проверить температуру видеокарты, то слега был ошарашен тем, что видеокарта нагрелась до 90 градусов и ее нужно было срочно тушить.

Программа SpeedFan

Пришлось открыть системный блок и направить на него комнатный вентилятор на максимальную скорость. Спустя несколько минут температура начала падать. В этот день за окном было 36 градусов жары и в помещении, где стоит компьютер тоже было жарко. Я рекомендую проверить температуру компонентов компьютера при помощи этой программы. На кулере видеокарты и на радиаторе, если он есть, скапливается много пыли, которая не дает видеокарте полноценно охлаждаться, из-за чего происходит выключение компьютера при активной работе.

Если же в вашем компьютере видеочип вшит в процессор то внимательно осмотрите кулер и радиатор процессора на наличие пыли и очистите их тщательным образом. Программа SpeedFan не единственная в своем роде через которую можно контролировать температуру. есть и другие, например Aida. Можете воспользоваться любой из них. И давайте подведем итог. В подавляющем большинстве случаев причина внезапного выключения компьютера — это перегрев и что периодически необходимо проводить профилактику и делать чистку компьютера от пыли, то есть банально его пылесосить. Это позволит продлить срок его службы. Надеюсь с вашим компьютером не случилось ничего страшного и мои советы помогли вам выявить причину неисправности вашего компьютера. Пишите в комментариях удалось ли вам это сделать.

Чтение Google таблиц через PHP и вывод данных на HTML страницу

Google shits

Google shits

Привет, друзья! В этой статье вы узнаете как работать с гугл таблицами через PHP? а именно получать из Google Shits данные и выводить их на странице сайта в HTML таблицу. Эта задача интересная и может применяться в реальных проектах. Примером может послужить обычный лендинг, на котором размещены цены товаров и они периодически меняются. Но лендинг, к примеру, не имеет админки и в штате компании нет вебмастера, которых бы мог изменять цены на сайте.

Решением может быть как раз создание прайса в Google таблице. Если данные в ней будут обновлены, то автоматически цены изменятся и на сайте. Это очень удобно и сейчас максимально подробно объясню, как это реализовать с использованием языка PHP. Для начала в качестве примера создадим таблицу с неким набором данных. Пусть это будут мобильные телефоны.

Прайс лист на мобильные телефоны в гугл таблицах

Теперь необходимо предоставить доступ и отправить ссылку на редактирование Google таблицы для тех, кто будет это делать.

Редактирование гугл таблиц

Теперь сам PHP код, который поможет нам прочитать и вывести текст из гугл таблицы.

1
2
3
4
5
$id = 'Идентификатор документа. Его видно в ссылке';
$gid = 'Идентификатор листа. Первый лист всегда 0';
$csv = file_get_contents('https://docs.google.com/spreadsheets/d/' . $id . '/export?format=csv&gid=' . $gid);
$csv = explode("\r\n", $csv);
$array = array_map('str_getcsv', $csv);

Если мы сейчас распечатаем на странице переменную $array с помощью функции print_r, то увидим массив всего, что мы вносили в Google таблицу. Но нам нужно не просто его вывести, а красиво оформить в HTML таблице. И давайте ее создадим. Я буду использовать Bootstrap 4.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table class="table">
  <thead class="thead-dark">
    <tr>
      <th scope="col"></th>
      <th scope="col">Марка</th>
      <th scope="col">Модель</th>
      <th scope="col">Цена</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1</th>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

Теперь напишем цикл foreach, вернее их будет 2, но перед ними создадим счетчик, который будет итерироваться с каждым проходом цикла и это будет нумерация в таблице.

$i = 0;

И так как у нас нулевой элемент массива — это названия, которые мы уже прописали вручную, то просто удалим его.

unset($array[0]);
1
2
3
4
5
6
7
8
9
10
foreach ($array as $arr){
  $i++;
  $html .= '<tr>';
  $html .= '<td scope="row">'.$i.'</td>';
  foreach ($arr as $td) {
    $html .= '<td scope="col">'.$td.'</td>';
  }
  $html .= '</tr>';
}
echo $html;

В итоге вся табличка должна получиться такой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<table class="table">
  <thead class="thead-dark">
    <tr>
      <th scope="col"></th>
      <th scope="col">Марка</th>
      <th scope="col">Модель</th>
      <th scope="col">Цена</th>
    </tr>
  </thead>
  <tbody>
    < ?php
    foreach ($array as $arr){
  $i++;
  $html .= '<tr>';
  $html .= '<td scope="row">'.$i.'</td>';
  foreach ($arr as $td) {
    $html .= '<td scope="col">'.$td.'</td>';
  }
  $html .= '';
}
echo $html;
    ?>
  </tbody>
</table>

И мы получили все данные из Google таблицы средствами PHP. И более того, если они будут обновляться, а так же добавляться новые, то изменения автоматически произойдут и на сайте, что очень удобно.

html-table

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

$range = 'A1:C10';
$csv = file_get_contents('https://docs.google.com/spreadsheets/d/' . $id . '/export?format=csv&gid=' . $gid. '&range=' . $range);

В этом случае таблица будет читаться из диапазона от A1 до C10. Все остальное на страницу не попадет, поэтому можно в остальных ячейках писать какие-то комментарии.

Собираем UTM метки в заявку и отправляем на почту при помощи PHP

utm_sourse php

utm_sourse php

Всем привет. Сейчас вы узнаете, как работать с UTM метками при помощи PHP, а именно мы будем собирать их в заявку. То есть при отправке формы на сайте все необходимые метки будут от оправлены на почту или куда-то еще вместе с основными данными. Как правило это номер телефона, Email адрес и имя клиента. Зачем вообще собирать UTM метки с сайта? В большинстве случаем это нужно маркетологам для того, чтобы отслеживать эффективность различных источников трафика. Так выглядит пример на реально работающем сайте:

UTM метки PHP

Получить UTM метки на PHP

Первое, что необходимо сделать — добавить в имеющуюся форму на сайте скрытое поле, input с типом hidden. Каждая UTM метка — это одно скрытое поле, поэтому нужно добавить именно cтолько, сколько будет меток в URL. Покажу на примере метки utm_sourse. И в value скрытого инпута необходимо поместить небольшой кусок PHP кода, в котором сделаем проверку на наличие GET-параметров в ссылке.

1
<input type="hidden" name="utm_sourse" value="<?php echo isset($_GET['utm_sourse']) ? $_GET['utm_sourse'] : '' ;?/>">

И если метка utm_sourse существует, то ее значение будет внесено в input с name=»utm_sourse». Осталось принять эти UTM метки в файле, который будет отправлять Email. Для этого напишем следующее:

$utm_sourse = $_POST['utm_sourse'] // Принимаем метку

И в самом теле сообщения, где будут данные о заявке сделаем проверку. Если переменная не пустая, то она будет включена в заявку. Обычно я делаю небольшую HTML таблицу для данных, поэтому мой код выглядит следующим образом:

1
2
3
4
5
6
if (!empty($utm_sourse)) {
   $message .= '<tr>
  <td><b>Рекламная система</b></td>
  <td>'.$utm_sourse.'</td>
 </tr>';
 }

Проверку нужно делать под каждую UTM метку. Более наглядно смотрите в видео, которое я подготовил специально для этого урока. Сложностей возникнуть не должно, но если что — пишите свои комментарии, постараюсь помочь разобраться.