Skip to content

Commit

Permalink
refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Vasiliy-Makogon committed Oct 29, 2024
1 parent 70837c6 commit bb48834
Show file tree
Hide file tree
Showing 10 changed files with 429 additions and 335 deletions.
11 changes: 11 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = false
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
max_line_length = 120
tab_width = 4
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text eol=lf
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
.idea
/.idea
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ SQL injections.
The types of placeholders and their purpose are described below. Before getting acquainted with placeholder types, it is necessary to understand how the mechanism of the `krugozor/database` library works. Example:

```php
$db->query("SELECT ?i", 123);
$db->query("SELECT ?i", 123);
```
SQL query after template conversion:
```sql
Expand All @@ -129,7 +129,7 @@ During the execution of this command *the library checks if the argument `123` i
Since PHP is a weakly typed language, the above expression is equivalent to the following:

```php
$db->query("SELECT ?i", '123');
$db->query("SELECT ?i", '123');
```
SQL query after template conversion:
```sql
Expand Down Expand Up @@ -182,7 +182,7 @@ $db->query('SELECT ?i', 55.5);
#### `?i` — integer placeholder

```php
$db->query('SELECT * FROM `users` WHERE `id` = ?i', $_POST['user_id']);
$db->query('SELECT * FROM `users` WHERE `id` = ?i', $_POST['user_id']);
```

**ATTENTION!** If you operate on numbers that are outside the limits of `PHP_INT_MAX`, then:
Expand All @@ -196,7 +196,7 @@ $db->query('SELECT * FROM `users` WHERE `id` = ?i', $_POST['user_id']);
#### `?d` — floating point placeholder

```php
$db->query('SELECT * FROM `prices` WHERE `cost` = ?d', 12.56);
$db->query('SELECT * FROM `prices` WHERE `cost` = ?d', 12.56);
```

**ATTENTION!** If you are using a library to work with the `double` data type, set the appropriate locale so that
Expand All @@ -221,7 +221,7 @@ SELECT "You are all fools, and I am d\'Artagnan!"
Argument values are escaped using the `mysqli::real_escape_string()` method + escaping special characters used in the LIKE operator (`%` and `_`):

```php
$db->query('SELECT "?S"', '% _');
$db->query('SELECT "?S"', '% _');
```

SQL query after template conversion:
Expand All @@ -235,7 +235,7 @@ SQL query after template conversion:
The value of any arguments is ignored, placeholders are replaced with the string `NULL` in the SQL query:

```php
$db->query('SELECT ?n', 123);
$db->query('SELECT ?n', 123);
```

SQL query after template conversion:
Expand Down Expand Up @@ -342,4 +342,4 @@ For those who are used to working with PDO, this will seem strange, but implemen
## Examples of working with the library
in the process....
See in file [./console/tests.php](./console/tests.php)
58 changes: 29 additions & 29 deletions README_rus.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ composer require krugozor/database

```php
<?php
// Предположим, что установили библиотеку через composer
// Предположим, что установили библиотеку через composer
require './vendor/autoload.php';

use Krugozor\Database\Mysql;
Expand Down Expand Up @@ -98,7 +98,7 @@ $result = mysqli_query($mysql, "SELECT * FROM `t` WHERE `f1` = '$value' AND `f2`
Типы заполнителей и их предназначение описываются ниже. Прежде чем знакомиться с типами заполнителей, необходимо понять как работает механизм библиотеки `krugozor/database`. Пример:

```php
$db->query("SELECT ?i", 123);
$db->query("SELECT ?i", 123);
```
SQL-запрос после преобразования шаблона:
```sql
Expand All @@ -109,25 +109,25 @@ SELECT 123
Поскольку PHP слаботипизированный язык, то вышеописанное выражение эквивалентно нижеописанному:

```php
$db->query("SELECT ?i", '123');
$db->query("SELECT ?i", '123');
```

SQL-запрос после преобразования шаблона:

```sql
SELECT 123
```

т.е. числа (целые и с плавающей точкой) представленные как в своем типе, так и в виде `string` — равнозначны с точки зрения библиотеки.


### Режимы работы библиотеки и принудительное приведение типов

Существует два режима работы библиотеки:

* **Mysql::MODE_STRICT — строгий режим соответствия типа заполнителя и типа аргумента**.
В режиме `Mysql::MODE_STRICT` *аргументы должны соответствовать типу заполнителя*. Например, попытка передать в качестве аргумента значение `55.5` или `'55.5'` для заполнителя целочисленного типа `?i` приведет к выбросу исключения:

```php
// устанавливаем строгий режим работы
$db->setTypeMode(Mysql::MODE_STRICT);
Expand Down Expand Up @@ -164,20 +164,20 @@ $db->query('SELECT ?i', 55.5);
#### `?i` — заполнитель целого числа

```php
$db->query('SELECT * FROM `users` WHERE `id` = ?i', $_POST['user_id']);
$db->query('SELECT * FROM `users` WHERE `id` = ?i', $_POST['user_id']);
```

**ВНИМАНИЕ!** Если вы оперируете числами, выходящими за пределы `PHP_INT_MAX`, то:
* Оперируйте ими исключительно как строками в своих программах.
* Не используйте данный заполнитель, используйте заполнитель строки `?s` (см. ниже). Дело в том, что числа, выходящие за пределы `PHP_INT_MAX`, PHP интерпретирует как числа с плавающей точкой. Парсер библиотеки постарается преобразовать параметр к типу `int`, в итоге «*результат будет неопределенным, так как float не имеет достаточной точности, чтобы вернуть верный результат. В этом случае не будет выведено ни предупреждения, ни даже замечания!*» — [php.net](https://www.php.net/manual/ru/language.types.integer.php#language.types.integer.casting.from-float).
* Не используйте данный заполнитель, используйте заполнитель строки `?s` (см. ниже). Дело в том, что числа, выходящие за пределы `PHP_INT_MAX`, PHP интерпретирует как числа с плавающей точкой. Парсер библиотеки постарается преобразовать параметр к типу `int`, в итоге «*результат будет неопределенным, так как float не имеет достаточной точности, чтобы вернуть верный результат. В этом случае не будет выведено ни предупреждения, ни даже замечания!*» — [php.net](https://www.php.net/manual/ru/language.types.integer.php#language.types.integer.casting.from-float).

#### `?d` — заполнитель числа с плавающей точкой

```php
$db->query('SELECT * FROM `prices` WHERE `cost` = ?d', 12.56);
$db->query('SELECT * FROM `prices` WHERE `cost` = ?d', 12.56);
```

**ВНИМАНИЕ!** Если вы используете библиотеку для работы с типом данных `double`, установите соответствующую локаль, что бы разделитель целой и дробной части был одинаков как на уровне PHP, так и на уровне СУБД.
**ВНИМАНИЕ!** Если вы используете библиотеку для работы с типом данных `double`, установите соответствующую локаль, что бы разделитель целой и дробной части был одинаков как на уровне PHP, так и на уровне СУБД.

#### `?s` — заполнитель строкового типа

Expand All @@ -187,41 +187,41 @@ $db->query('SELECT * FROM `prices` WHERE `cost` = ?d', 12.56);
$db->query('SELECT "?s"', "Вы все дураки, а я - Д'Артаньян!");
```
SQL-запрос после преобразования шаблона:

```sql
SELECT "Вы все дураки, а я - Д\'Артаньян!"
```
#### `?S` — заполнитель строкового типа для подстановки в SQL-оператор LIKE
#### `?S` — заполнитель строкового типа для подстановки в SQL-оператор LIKE

Значение аргументов экранируются с помощью метода `mysqli::real_escape_string()` + экранирование спецсимволов, используемых в операторе LIKE (`%` и `_`):
Значение аргументов экранируются с помощью метода `mysqli::real_escape_string()` + экранирование спецсимволов, используемых в операторе LIKE (`%` и `_`):

```php
$db->query('SELECT "?S"', '% _');
$db->query('SELECT "?S"', '% _');
```
SQL-запрос после преобразования шаблона:
```sql
SELECT "\% \_"
```

#### `?n` — заполнитель `NULL` типа
Значение любых аргументов игнорируются, заполнители заменяются на строку `NULL` в SQL запросе:

```php
$db->query('SELECT ?n', 123);
$db->query('SELECT ?n', 123);
```
SQL-запрос после преобразования шаблона:
```sql
SELECT NULL
```

#### `?A*` — заполнитель ассоциативного множества из ассоциативного массива, генерирующий последовательность пар вида `ключ = значение`

где символ `*` — один из заполнителей:

* `i` (заполнитель целого числа)
* `d` (заполнитель числа с плавающей точкой)
* `s` (заполнитель строкового типа)

правила преобразования и экранирования такие же, как и для одиночных скалярных типов, описанных выше. Пример:

```php
Expand All @@ -238,7 +238,7 @@ INSERT INTO `test` SET `first` = "123", `second` = "1"
* `i` (заполнитель целого числа)
* `d` (заполнитель числа с плавающей точкой)
* `s` (заполнитель строкового типа)

правила преобразования и экранирования такие же, как и для одиночных скалярных типов, описанных выше. Пример:

```php
Expand All @@ -249,10 +249,10 @@ SQL-запрос после преобразования шаблона:
SELECT * FROM `test` WHERE `id` IN ("123", "1")
```


#### `?A[?n, ?s, ?i, ...]` — заполнитель ассоциативного множества с явным указанием типа и количества аргументов, генерирующий последовательность пар `ключ = значение`

Пример:
Пример:
```php
$db->query('INSERT INTO `users` SET ?A[?i, "?s"]', ['age' => 41, 'name' => "Д'Артаньян"]);
```
Expand All @@ -270,8 +270,8 @@ SQL-запрос после преобразования шаблона:
```sql
SELECT * FROM `users` WHERE `name` IN ("маркиз д\"Аркьен", "Д\'Артаньян")
```
#### `?f` — заполнитель имени таблицы или поля
Данный заполнитель предназначен для случаев, когда имя таблицы или поля передается в запросе через параметр. Имена полей и таблиц обрамляется символом "апостроф":
Expand All @@ -284,7 +284,7 @@ SQL-запрос после преобразования шаблона:
SELECT `name` FROM `database`.`table_name`
```
### Ограничивающие кавычки
**Библиотека требует от программиста соблюдения синтаксиса SQL.** Это значит, что следующий запрос работать не будет:
Expand All @@ -310,4 +310,4 @@ SELECT concat("Hello, ", "world", "!")
## Примеры работы с библиотекой
В процессе...
См. в файле [./console/tests.php](./console/tests.php)
3 changes: 1 addition & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@
},
"authors": [
{
"name": "Vasiliy Makogon",
"email": "makogon-vs@yandex.ru"
"name": "Vasiliy Makogon"
}
],
"autoload": {
Expand Down
Loading

0 comments on commit bb48834

Please sign in to comment.