Почему paragonie/easydb не позволяет использовать слэши в данных?

Как правильно использовать библиотеку paragonie/easydb для сделать выборку из текстового поля, содержащего символ "\"? На данный момент, запрос `value LIKE '%\\\\%'` не работает так, как нужно. Когда я пытаюсь использовать код символа "%92", выборка не соответствует выборке '%\\\\%' по количеству найденных записей. Возможно ли заставить paragonie/easydb не обрабатывать специальные символы?
  • 24 января 2024 г. 8:49
Ответы на вопрос 2
Библиотека `paragonie/easydb` упрощает взаимодействие с базами данных, предоставляя механизмы для предотвращения SQL-инъекций через использование подготовленных выражений (prepared statements). Одной из особенностей подготовленных выражений является автоматическое экранирование специальных символов в данных, включая символ обратного слэша `\`.

Для поиска символа обратного слэша в текстовом поле необходимо сначала понять, как работает экранирование символов в SQL. Символ обратного слэша является специальным символом, который используется для экранирования других специальных символов. Чтобы найти фактический обратный слэш в тексте, нужно перед ним также поставить обратный слэш. То есть, чтобы найти один обратный слэш, вы должны использовать два обратных слэша в строке запроса (`\\`).

Однако, когда вы используете подготовленные выражения, символы экранирования обрабатываются дважды: сначала в самом запросе, а затем в самом подготовленном выражении, так что вам фактически нужно отправить четыре обратных слэша (`\\\\`), чтобы получить один в запросе. 

Пример использования `paragonie/easydb` для поиска текстового поля, содержащего символ обратного слэша `\`:

```php
$db = \ParagonIE\EasyDB\Factory::create(
    'mysql:host=localhost;dbname=test',
    'username',
    'password'
);

// Поиск строки, содержащей обратный слэш
$results = $db->run(
    "SELECT * FROM table WHERE text_column LIKE ?",
    "%\\\\%" // Это будет передано SQL как %\\%, что ищет один обратный слэш
);

foreach ($results as $row) {
    print_r($row);
}
```

Обратите внимание на использование в запросе строки `"%\\\\%"`, которая указывает, что мы ищем процент, затем два символа обратного слэша (для экранирования одного обратного слэша в контексте SQL), затем снова процент.

Если вы сталкиваетесь с тем, что `paragonie/easydb` не работает как ожидаются с литералами содержащими обратные слэши, убедитесь, что вы правильно экранируете символы и используете соответствующую строку запроса в вашем PHP коде.
Первым делом хорошо посчитайте количество шагов экранирования. Один - сам MySQL, второй - видимо, используемый язык, но там ещё может вмешаться фреймворк или что ещё... 

Рекомендую включить временно General Log, и посмотреть, какой именно текст запроса получает MySQL. После чего отрихтовать текст запроса.

В крайнем случае
Похожие вопросы