-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhelpers.php
More file actions
145 lines (123 loc) · 4.46 KB
/
Copy pathhelpers.php
File metadata and controls
145 lines (123 loc) · 4.46 KB
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
/**
* Перевіряє передану дату на відповідність формату 'ГГГГ-ММ-ДД'
*
* Приклади використання:
* isDateValid('2019-01-01'); // true
* isDateValid('2016-02-29'); // true
* isDateValid('2019-04-31'); // false
* isDateValid('10.10.2010'); // false
* isDateValid('10/10/2010'); // false
*
* @param string $date Дата у вигляді рядка
*
* @return bool true у разі збігу з форматом 'ГГГГ-ММ-ДД', інакше false
*/
function isDateValid(string $date) : bool {
$format_to_check = 'Y-m-d';
$dateTimeObj = date_create_from_format($format_to_check, $date);
return $dateTimeObj !== false && array_sum(date_get_last_errors()) === 0;
}
/**
* Створює підготовлений вираз на основі готового SQL запиту і переданих даних
*
* @param $link mysqli Ресурс з'єднання
* @param $sql string SQL запит із плейсхолдерами замість значень
* @param array $data Дані для вставки на місце плейсхолдерів
*
* @return mysqli_stmt Підготовлений вираз
*/
function dbGetPrepareStmt($link, $sql, $data = []) {
$stmt = mysqli_prepare($link, $sql);
if ($stmt === false) {
$errorMsg = 'Не вдалося ініціалізувати підготовлений вираз: ' . mysqli_error($link);
throw new ErrorException($errorMsg);
}
if ($data) {
$types = '';
$stmt_data = [];
foreach ($data as $value) {
$type = 's';
if (is_int($value)) {
$type = 'i';
}
else if (is_string($value)) {
$type = 's';
}
else if (is_double($value)) {
$type = 'd';
}
if ($type) {
$types .= $type;
$stmt_data[] = $value;
}
}
$values = array_merge([$stmt, $types], $stmt_data);
$func = 'mysqli_stmt_bind_param';
$func(...$values);
if (mysqli_errno($link) > 0) {
$errorMsg = 'Не вдалося пов\'язати підготовлений вираз із параметрами: ' . mysqli_error($link);
throw new ErrorException($errorMsg);
}
}
return $stmt;
}
/**
* Повертає коректну форму множини
* Обмеження: тільки для цілих чисел
*
* Приклад використання:
* $remainingMinutes = 5;
* echo "Я поставив таймер на {$remainingMinutes} " .
* getNounPluralForm(
* $remainingMinutes,
* 'хвилина',
* 'хвилини',
* 'хвилин'
* );
* Результат: "Я поставив таймер на 5 хвилин"
*
* @param int $number Число, за яким обчислюємо форму множини
* @param string $one Форма однини: яблуко, година, хвилина
* @param string $two Форма множини для 2, 3, 4: яблука, години, хвилини
* @param string $many Форма множини для решти чисел
*
* @return string Розрахована форма множини
*/
function getNounPluralForm (int $number, string $one, string $two, string $many): string
{
$number = (int) $number;
$mod10 = $number % 10;
$mod100 = $number % 100;
switch (true) {
case ($mod100 >= 11 && $mod100 <= 20):
return $many;
case ($mod10 > 5):
return $many;
case ($mod10 === 1):
return $one;
case ($mod10 >= 2 && $mod10 <= 4):
return $two;
default:
return $many;
}
}
/**
* Підключає шаблон, передає туди дані і повертає підсумковий HTML контент
*
* @param string $name Шлях до файлу шаблону відносно папки templates
* @param array $data Асоціативний масив із даними для шаблону
* @return string Підсумковий HTML
*/
function renderTemplate($name, array $data = []) {
$name = 'templates/' . $name;
$result = '';
if (!is_readable($name)) {
return $result;
}
ob_start();
extract($data);
require $name;
$result = ob_get_clean();
return $result;
}