Рекомендації щодо оформлення PHP коду — CRM система
- Робочий стіл
- Стартова сторінка Новий
- Мобільна версія Новий
- Мобільні програми Новий
- Оплата НОВЕ
- Відключення копірайту Новий
- Техпідтримка Новий
- Маски введення текстових полів (шаблон заповнення)
- Система оновлення конфігурацій
- Система повідомлень
- Багатомовність конфігурації
- Зміна режимів скролла вікна
- Статистика
- Вибір мови програми
- Призначення іншого імені домену
- Проксі-сервер
- Менеджер файлів
- Контекстне меню Новий
- Різні приклади
- Онлайн консультант
- Бізнес-процеси Оновлено
- Поштовий модуль Новий
- Зниження навантаження на сервер
- Гарячі клавіші Нове
- Лого та кольори
- Загальні налаштування Новий
- Модуль Telegram Новий
- Знеособлення суб'єкта Новий
- Модуль інтеграції з vk.com Новий
Для полегшення читання коду CRM системи сторонніми програмістами, а також захисту даних від зовнішніх проникнень, в процесі написання обчислень рекомендується дотримуватися наступних стандартів у написанні коду.
Стандарт коду
Настійно рекомендується, при написанні коду слідувати загальноприйнятому стандарту PSR, зокрема за такими пунктами:
- Усі блоки коду у фігурних дужках необхідно писати з відступами. Для відступів слід використовувати чотири пробіли (але не знак табуляції).
- Фігурна дужка, що відкриває, у визначенні функції повинна розташовуватися на новому рядку, а фігурна дужка, що закриває, повинна розташовуватися на наступному рядку після тіла функції.
- Відкриваюча фігурна дужка в конструкціях, що управляють, повинна розташовуватися в тому ж рядку, що і сама конструкція, афігурна дужка, що закриває, повинна розташовуватися на наступному рядку після тіла конструкції.
- Після ключових слів у керуючих конструкціях повинен розташовуватися один пробіл, а після викликів функцій не повинен.
- Після круглої дужки, що відкриває, і перед круглою дужкою, що закриває, в керуючих конструкціях не повинна бути пробілу.
- У коді можна використовувати лише теги
- Кодування php файлів має бути UTF-8 без BOM-байт.
Оформлення запитів sql
Всі прості запити рекомендується писати за допомогою таких функцій:
- Вибірка даних із таблиці
Вибір даних з таблиці за певними параметрами здійснюється з використанням data_select, приклад:
Зокрема, перший параметр - ім'я таблиці, далі йдуть умови вибірки.
Важливо: Між "`id`=" і $line_id в даному випадку стоїть кома.
Кожен непарний параметр вважається змінним і буде оброблений. Наприклад, $line_id буде застосовано floatval. Якщо змінна $line_id обрамляється одинарними лапками, вважається, що це рядкова змінна, і до неї буде застосовано addslashes. Приклад вибірки при використанні рядка в умові:
У разі використання вибірки in з числовими значеннями, можна використовувати конструкцію зі дужками замість одинарних лапок. У цьому випадку параметр розглядається як масив чисел. Приклад вибірки при використанні IN:
- Вибірка даних із певного поля таблиці
Якщо необхідно вибрати лише певні поля таблиці, а не весь рядок, слід використовувати функцію:
Функція відрізняється від першого прикладу тим, що другим параметром ви можете вказати, які саме поля ви вибираєте з таблиці.
Досить часто буває необхідно вибрати відразу весь рядок з таблиці масив, без використання циклу (while). У цьому випадку можна використовувати функцію:
У цьому випадку буде раховано лише 1 рядок з бази даних, якщо потрібно вважати весь масив, можна використовувати функцію наступним чином:
Режимом зчитування всіх рядків слід користуватися обережно, тільки якщо ви впевнені, що кількість рядків у вибірці буде мало. Інакше слід скористатися стандартним циклом while та функцією sql_fetch_assoc.
- Вставка даних у таблицю
Вставка даних у таблицю здійснюється з використанням функції:
Ця функція має лише два параметри: ім'я таблиці та масив полів і значень, які будуть вставлені в таблицю. Якщо при вставці рядка в таблицю необхідно спрацювання обчислень необхідно використовувати параметр 'EVENTS_ENABLE'. Наприклад:
Також при використанні прапора 'EVENTS_ENABLE' відбувається встановлення полів значень за замовчуванням.
- Зміна даних у рядку
Зміна даних у рядку здійснюється за допомогою функції:
Ця функція є середнім між наведеними раніше функціями вставки даних у таблицю та вибіркою даних у таблиці (sql_insert та sql_select відповідно). Так, другий параметр – це масив полів, який потрібно змінити. Далі йдуть умови, в яких саме рядках необхідно змінити. Якщо при зміні рядків у таблиці, необхідно спрацювання обчислень необхідно використовувати параметр 'EVENTS_ENABLE'. Наприклад:
- Видалення рядків
Видалення рядків здійснюється за допомогою функції:
Якщо видалення рядків у таблиці, необхідно спрацювання обчисленьнеобхідно використовувати параметр 'EVENTS_ENABLE' аналогічно до перерахованих вище функцій. Увага, на відміну від перерахованих вище функцій, при роботі з діапазоном рядків, параметр 'EVENTS_ENABLE' сильно знижує швидкодію програми.
- Загальний опис
Усі перелічені функції мають аналоги з приставкою sql, наприклад sql_select(TABLE_FIELDS, "`id`=",$field_id). Перший параметр даних функцій не id таблиці, а ім'я. У разі неуспішного запиту функції завершують роботу з виведенням повідомлення на екран. Розширене повідомлення про помилку sql виводиться тільки користувачам з правами адміністратора. Якщо потрібно не завершувати роботу скрипту при помилці синтаксису, слід використовувати конструкцію з символом @, наприклад @sql_select, в цьому випадку функція поверне false.
Важливо: Для виведення запиту, сформованого функціями sql_select і т.п. Необхідно встановити глобальної змінної $show_sql_request значення '1'.
Важливо: Не слід використовувати українські імена як найменування полів тощо. український текст повинен бути присутнім лише як дані в запиті.
Важливо: Найменування полів слід укладати в апострофи.
Важливо: Замість функції mysql_query слід використовувати sql_query, замість mysql_fetch_array використовувати sql_fetch_assoc і т.д.
У разі непростих запитів, запит попередньо формується у рядок:
Складні запити можна розбивати кілька рядків, як це зроблено вище. Рекомендовано не використовувати функцію sql_query, а розбивати її на кілька функцій типу sql_select.
Важливо: У разі використання sql_query ваші дані не фільтруються. Для захисту від SQL-ін'єкцій про це необхідно подбати самостійно. Усеможливі НЕчислові дані повинні йти з функцією addslashes. Вхідні числові параметри повинні бути приведені до або за допомогою intval(), або використовуючи floatval();
Безпека коду
Введення даних
Усі вхідні дані $_REQUEST, $_GET, $_POST, $_FILES, $_COOKIE тощо повинні фільтруватися. Якщо у обчисленні очікується введення певного типу даних, повинні бути введені дані саме цього типу.
Введення числових параметрів:
Рядки – найскладніший вид фільтрації. При введенні в скрипт, рядок повинен проходити очищення від лапок, що примусово розставляються (у разі використання magic_quotes), за допомогою функції form_input.
У разі використання рядкового значення функції sql_query, обов'язково екранувати значення за допомогою addslashes.
Робота з рядковими значеннями
При роботі з рядками часто виникає помилка при порівнянні з числовими значеннями, наприклад, при роботі наступного коду буде виведено '1234':
У зв'язку з чим, під час роботи з рядками слід використовувати умову ===.
Робота з числовими значеннями
При перевірці числового значення на 0, необхідно явно перевіряти значення з 0. Наприклад, під час роботи наступного коду буде виведено '0.0':
Введення даних та зміна даних
Всі зміни даних, а також введення нових повинні бути захищені від атак типу CSRF. Введення даних, зміна, створення, видалення будь-якого, будь-яка дія, що призводять до зміни стану, має відправлятися за допомогою методу POST. У разі використання форм введення слід використовувати в шаблоні Smarty: . Якщо дія здійснюється за посиланням, до посилання необхідно додати клас: class='href_post'. Якщо в посилання є свій обробник onclick, слідвикористовувати змінну href_post для запобігання відправленню форми.
Так виглядає форма введення логіну та паролю із захистом від CSRF атак:
Виведення значень
При виведенні значень застосовується функція form_display для всіх можливих рядкових значень.
Для виведення числових значень потрібно використовувати функцію form_local_number.
Для виведення дат необхідно використати функцію form_local_time.
Використання зворотних посилань
У разі використання механізму зворотних посилань у формах слід передавати значення back_url використовуючи input type hidden.