if(exit) {break;}
, тогда используем правую икону Вопрос, чтобы произвести ответвление от шампура. Вторая схема это инвертированное условие первой схемы.Ветвление
Циклы
while product_id do
local limit = get_limit(
product_id
)
if limit >= count then
return product_id
end
product_id = get_next_product(product_id)
end
return nil
-- vs https://github.com/stepan-mitkin/drakonhub/blob/master/app/web.lua ; line=5716 ; function suggest_product
while true do
if product_id then
else
return nil
end
local limit = get_limit(
product_id
)
if limit >= count then
return product_id
end
product_id = get_next_product(product_id)
end
Обычная линейная схема (Примитив). Похоже это наилучший вариант, так как, что на компьютере, что на смартфоне или планшете, скроллить схему удобнее всего вертикально, а не горизонтально, и уж тем более не по змеиному пути.
Нажмите на схему, чтобы выключить или включить подсказки.
Исходный код этой же схемы, который будет сформирован именно в таком виде автоматически. В исходный код можно будет вносить изменения, которые тут же будут отображены в схеме.
/**
* Регистрация пользователя
*
* @param $name Имя пользователя
* @param $email E-mail
* @param $password Пароль
*/
function registerUser($name, $email, $password) {
/**
* Проверить имя
*/
// Обрезать пробелы в имени
$name = trim($name);
// Имя пусто?
// Имя слишком длинное?
// Имя содержит неподдерживаемые символы?
if (
empty($name) ||
strlen($name)>20 ||
preg_match('/[^a-z0-9]/g', $name)
) {
// Ошибка имени пользователя
return ERROR_NAME;
}
/**
* Проверить e-mail
*/
// Обрезать пробелы в e-mail
$name = trim($name);
// E-mail пуст?
// E-mail слишком длинный?
// E-mail имеет правильный формат?
if (
empty($email) ||
strlen($email)>100 ||
! preg_match('/[\w\d\.-_]+@[\w\d\.-_])/g', $email)
) {
// Ошибка e-mail
return ERROR_EMAIL;
}
/**
* Проверить пароль
*/
/*
* Не обрезаем пробелы в пароле
*/
// Пароль слишком длинный?
// Пароль достаточно сложный?
// Пароль содержит имя?
if (
strlen($password)>100 ||
! preg_match('/(\w\d|\d\w)/', $password) ||
strstr($password, $name)
) {
// Ошибка пароля
return ERROR_PASSWORD;
}
/**
* Проверить уникальность
*/
// Имя пользователя занято?
// E-mail занят?
if (
User::getName($name) ||
User::getEmail($email)
) {
// Ошибка уникальности
return ERROR_UNIQUE;
}
/**
* Записать в базу данных
*/
// Открыть базу данных
$db = SQL::connect();
try {
// Вставить запись в таблицу Пользователи.
// Записать туда имя и e-mail.
$db->beginTransaction();
$user_id = $db->insert('user', [
'name'=>$name,
'email'=>$email
]);
// Вставить запись в таблицу паролей.
// Записать туда пароль (хэш).
// Связать запись с пользователем.
$db->insert('user_password', [
'user_id'=>$user_id,
'password_hash'=>hash_hmac('sha256', $password, $email)
]);
$db->commit();
} catch(Exception $e) {
// Откатить записи
$db->rollback();
// Ошибка базы данных
return ERROR_DB;
} finally {
// Закрыть базу данных
$db->close();
}
// Вернуть код успеха
return SUCCESS;
}
Схема с исходным кодом вместо комментариев, например, если их нет.
Код без комментариев, максимально компактный.
function registerUser($name, $email, $password) {
$name = trim($name);
if (empty($name) || strlen($name)>20 || preg_match('/[^a-z0-9]/g', $name)) {
return ERROR_NAME;
}
$name = trim($name);
if (empty($email) || strlen($email)>100 || ! preg_match('/[\w\d\.-_]+@[\w\d\.-_])/g', $email)) {
return ERROR_EMAIL;
}
if (strlen($password)>100 || ! preg_match('/(\w\d|\d\w)/', $password) || strstr($password, $name)) {
return ERROR_PASSWORD;
}
if (User::getName($name) || User::getEmail($email)) {
return ERROR_UNIQUE;
}
$db = SQL::connect();
try {
$db->beginTransaction();
$user_id = $db->insert('user', ['name'=>$name, 'email'=>$email]);
$db->insert('user_password', ['user_id'=>$user_id, 'password_hash'=>hash_hmac('sha256', $password, $email)]);
$db->commit();
} catch(Exception $e) {
$db->rollback();
return ERROR_DB;
} finally {
$db->close();
}
return SUCCESS;
}