Рекомендации по оформлению PHP кода

Разработчику

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

Стандарт кода

Настоятельно рекомендуется, при написании кода следовать общепринятому стандарту PSR, в частности по следующим пунктам:

  • Все блоки кода в фигурных скобках необходимо писать с отступами. Для отступов должны использоваться четыре пробела (но не знак табуляции).
  • Открывающая фигурная скобка в определении функции должна располагаться на новой строке, а закрывающая фигурная скобка должна располагаться на следующей строке после тела функции.
  • Открывающая фигурная скобка в управляющих конструкциях должна располагаться в той же строке, что и сама конструкция, а закрывающая фигурная скобка должна располагаться на следующей строке после тела конструкции.
  • После ключевых слов в управляющих конструкциях должен располагаться один пробел, а после вызовов функций – не должен.
  • После открывающей круглой скобки и перед закрывающей круглой скобкой в управляющих конструкциях не должно быть пробела.
  • В коде можно использовать только теги  <?php и <?=, но не <?
  • Кодировка php файлов должна быть UTF-8 без BOM-байта.

Пример:

function my_function()
{
    foreach ($arr as $elem) {
        $a = 2;
        if ($elem > 2) {
            $b = 3;
            $c = 4;
        }
    }
}

 

Оформление sql запросов

Все простые запросы рекомендуется писать с использованием следующих функций:

  • Выборка данных из таблицы

Выборка данных из таблицы по определённым параметрам осуществляется с использованием data_select, пример:

data_select( $table_id, '`id`=',$line_id);

В частности, первый параметр — имя таблицы, далее следуют условия выборки.

Важно: Между "`id`=" и $line_id в данном случае стоит запятая.

Каждый нечетный параметр считается переменной и будет обработан. Например, к $line_id будет применено floatval. В случае если переменная $line_id обрамляется одинарными кавычками, считается, что это строковая переменная, и к ней будет применено addslashes.
Пример выборки при использовании строки в условии:

data_select( $table_id, "`f412`='",$client_name,"'" );

В случае использования выборки in с числовыми значениями, можно использовать конструкцию со скобками, вместо одинарных кавычек. В этом случе параметр рассматривается как массив чисел.
Пример выборки при использовании IN:

data_select( $table_id, '`f481` in (',array(1,5,8),')');
  • Выборка данных из определенного поля таблицы

В случае если необходимо выбрать только определенные поля таблицы, а не всю строку, следует использовать функцию:

data_select_field($table_id,  'id, sum(f443) as my_summ', '`id`=',$line_id) 

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

  • Выборка массива

Достаточно часто бывает необходимо выбрать сразу всю строку из таблицы в массив, без использования цикла (while). В этом случае возможно использовать функцию:

$line = data_select_array($table_id,  '`id`=',$line_id) 

В этом случае будет считана только 1 строка из базы данны, в случае если необходимо считать весь массив, возможно использовать функцию следующим образом:

$tovar_types = data_select_array($table_id, 'ALL_ROWS', '`status`=0')

Режимом считывания всех строк следует пользоваться с осторожностью, только если вы уверены, что количество строк в выборке будет мало. Иначе следует воспользоваться стандартным циклом while и функцией sql_fetch_assoc.

  • Вставка данных в таблицу

Вставка данных в таблицу производится с использованием функции:

data_insert($table_id, array('status'=>'0', 'f441'=>'Мои данные'));

У данной функции всего два параметра: имя таблицы и массив полей и значений, которые будут вставлены в таблицу.
Если при вставке строки в таблицу необходимо срабатывание вычислений необходимо использовать параметр 'EVENTS_ENABLE'. Например:

data_insert($table_id, EVENTS_ENABLE, array('status'=>'0', 'f441'=>'Мои данные'));

Также при использовании флага 'EVENTS_ENABLE' происходит установка в полях значений по умолчанию.

  • Изменение данных в строке

Изменение данных в строке осуществляется с помощью функции:

data_update($table_id, array('status'=>'0', 'f441'=>'Мои данные'), "`f412`='",$client_name,"'" );

Данная функция является средним между приведенными ранее функциями вставки данных в таблицу и выборкой данных в таблице (sql_insert и sql_select соответственно). Так, второй параметр - это массив полей, который нужно изменить. Далее идут условия, в каких именно строках необходимо произвести изменения.
Если при изменении строк в таблице, необходимо срабатывание вычислений необходимо использовать параметр 'EVENTS_ENABLE'. Например:

data_update($table_id, EVENTS_ENABLE, array('f441'=>'Мои данные'), "`f412`='",$client_name,"'");
  • Удаление строк

Удаление строк производится с помощью функции:

data_delete($table_id, '`id`=', $line_id)

Если при удалении строк в таблице, необходимо срабатывание вычислений необходимо использовать параметр '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 cледует использовать sql_query, вместо mysql_fetch_array использовать sql_fetch_assoc и т.д. 

В случае непростейших запросов, запрос предварительно формируется в строку:

$sqlQuery = "SELECT 'f1649' as type,
                    'f1650' as amount
             FROM ".DATA_TABLE."139
             WHERE 'f1648' = '".$autumn_work['id']."'
               AND 'f1653' = 5
               AND 'f1652' = '".addslashes($selected_date)."'
               AND `status` = 0
             ORDER BY 'f1649'");
$result = sql_query($sqlQuery);
$row = sql_fetch_assoc($result);

Сложные запросы можно разбивать на несколько строк, как это сделано выше. Рекомендуется не использовать функцию sql_query, а разбивать ее на несколько функций типа sql_select.

Важно: В случае использования sql_query, ваши данные не фильтруются. Для защиты от sql-инъекций об этом необходимо позаботиться самостоятельно. Все возможные НЕчисловые данные должны идти с функцией addslashes. Входящие числовые параметры должны быть приведены к числу либо с помощью intval(), либо используя floatval();

Безопасность кода

Ввод данных

Все входящие данные $_REQUEST, $_GET, $_POST, $_FILES, $_COOKIE и т. п. должны фильтроваться. Если в вычислении ожидается ввод определенного типа данных, то должны быть введены данные именно этого типа.

Ввод числовых параметров:

$table_id = intval($_REQUEST['table']); // число
$table_id = floatval($_REQUEST['table']); // число с точкой

Галочки

$is_summa = $_REQUEST['summa']?1:0;

Ввод даты:

$end_date  = form_eng_time($_REQUEST['end_date']);

Строки - самый сложный вид фильтрации. При вводе в скрипт, строка должна проходить очистку от принудительно расставляемых кавычек (в случае использования magic_quotes), с помощью функции form_input.

$fio = form_input($_REQUEST['fio']);

В случае использования строкового значения в функции sql_query, обязательно экранировать значения с помощью addslashes.

Работа со строковыми значениями

При работе со строками часто возникает ошибка при сравенении с числовыми значениями, например, при работе следующего кода будет выведено '1234':

$value=0;
if ($value=='vvv') $value = "1234";
echo $value;

Всвязи с чем, при работе со строками следует использовать условие ===.

Правильный код:

$value=0;
if ($value==='vvv') $value = "1234";
echo $value;

Работа с числовыми значениями

При проверке числового значения на 0, необходимо явно проверять значение с 0. Например, при работе следующего кода будет выведено '0.0':

$value='0.0';
if (!$value) $value = "1234";
echo $value;

Правильный код:

$value='0.00';
if ($value==0) $value = "1234";
echo $value;

Выведет '1234'.

Ввод данных и изменение данных

Все изменение данных, а также ввод новых, должно быть защищено от атак типа CSRF. Ввод данных, изменение, создание, удаление чего-либо, любое действие, приводящие к изменению состояния, должно отправляться с помощью метода POST. В случае использования форм ввода, следует использовать в шаблоне Smarty: <input type=hidden name=csrf value='{$csrf}'>. В случае если действие производится по ссылке, в ссылку необходимо добавить класс: class='href_post'. В случае если в ссылке есть свой обработчик onclick, следует использовать переменную href_post для предотвращения отправки формы.

Примеры:

Так выглядит форма ввода логина и пароля с защитой от CSRF атак:

<form action="login.php" method="post">
<input type=text name=password> <input type=text name=login > <input type=submit value='Отправить'>
<input type=hidden name=csrf value='{$csrf}'> form>

Так выглядит ссылка удаляющая поле таблицы:

<a class='href_post' href='edit_field.php?table=42&field=442&delete'>Удалить</a>

Так выглядит ссылка, удаляющая поле таблицы с подтверждением удаления:

<a class='href_post' href='edit_field.php?table=42&field=442&delete'
onclick='return href_post=confirm("Удалить поле?");'>
Удалить</a>

В случае ТОЛЬКО просмотра информации, следует использовать GET. Например, к таким действиям относятся, переключение страниц, поиск данных, переключение режима просмотра и т.п.

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

header("Location:fields.php?table=42&filter=48&button_id=44&success");
exit
  ;

Вывод значений

При выводе значений должна применяться функция form_display для всех возможных строковых значений.

Для вывода числовых значений необходимо использовать функцию form_local_number.

Для вывода дат необходимо использовать функцию form_local_time.

Использование обратных ссылок

В случае использования механизма обратных ссылок в формах, следует передавать значение back_url используя input type hidden.

<input type=hidden name=back_url value='{$base64_back_url}'


comments powered by HyperComments

+ сегодня

компаний уже выбрали Клиентскую базу!
Узнайте, почему.

  • компания
  • компании
  • компаний
  • выбрала
  • выбрали
  • выбрали

Создайте собственный аккаунт прямо сейчас! Бесплатно! Создать аккаунт