компаний проявили интерес к нашему продукту!
Узнайте, почему.
Разработчику
Для облегчения чтения кода CRM системы сторонними программистами, а также для защиты данных от внешних проникновений, в процессе написания вычислений рекомендуется следовать следующим стандартам в написании кода.
Настоятельно рекомендуется, при написании кода следовать общепринятому стандарту PSR, в частности по следующим пунктам:
Пример:
function my_function()
{
foreach ($arr as $elem) {
$a = 2;
if ($elem > 2) {
$b = 3;
$c = 4;
}
}
}
Все простые запросы рекомендуется писать с использованием следующих функций:
Выборка данных из таблицы по определённым параметрам осуществляется с использованием data_select, пример:
data_select( $table_id, '`id`=',$line_id);
В частности, первый параметр — имя таблицы, далее следуют условия выборки.
Важно: Между "`id`=" и $line_id в данном случае стоит запятая.
Каждый нечетный параметр считается переменной и будет обработан. Например, к $line_id будет применено floatval. В случае если переменная $line_id обрамляется одинарными кавычками, считается, что это строковая переменная, и к ней будет применено экранирование.
Пример выборки при использовании строки в условии:
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' = '".form_sql($selected_date)."' AND `status` = 0 ORDER BY 'f1649'"); $result = sql_query($sqlQuery); $row = sql_fetch_assoc($result);
Сложные запросы можно разбивать на несколько строк, как это сделано выше. Рекомендуется не использовать функцию sql_query, а разбивать ее на несколько функций типа sql_select.
Важно: В случае использования sql_query, ваши данные не фильтруются. Для защиты от sql-инъекций об этом необходимо позаботиться самостоятельно. Все возможные НЕчисловые данные должны идти с функцией form_sql. Входящие числовые параметры должны быть приведены к числу либо с помощью 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, обязательно экранировать значения с помощью функции form_sql.
Работа со строковыми значениями
При работе со строками часто возникает ошибка при сравенении с числовыми значениями, например, при работе следующего кода будет выведено '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}'
Мы отправили SMS c кодом на номер
SMS придёт в течение
Если вам не пришла смс с кодом, для регистрации аккаунта напишите нам
Благодарим за регистрацию, скоро мы свяжемся с вами
По данному функционалу ведутся технические работы, будем рады Вас видеть через некоторое время
Объедините всю информацию
компании в единой базе
Подключайте сотрудников
и управляйте их доступом
Создавайте собственные
таблицы и отчеты
Выписывайте счета
и создавайте собственные
шаблоны документов
Проводите персонализированные
E-mail и SMS рассылки
Создавайте собственные
напоминания
Ведите учет событий
в календаре
Не волнуйтесь о безопасности,
все данные защищены
Проводите поиск
по любым параметрам
и фильтрам
Интегрируйтесь с сайтом
и получайте заявки прямо в базу
До начала работы
осталось совсем чуть-чуть!