PDO: выберите поле из БД, которое содержит обратную косую черту - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть таблица с этим значением

ID|name
----------------
1 |My Shop No. \6\

(не спрашивайте, почему шестерка находится в обратной косой черте, я понятия не имею, мне просто нужно с ней поработать)

Я пытаюсь выбрать это конкретное значение из моей таблицы.Мой запрос выглядит так:

$sql = "SELECT `id` FROM shops WHERE `name` = :name";
$params = array(':name' => "My Shop No. \6\");
$this->fetchOne($sql, $params); // the binding happens in my mysql class

Этот запрос не возвращает никаких данных, он утверждает, что нет записи.Когда я отслеживаю свои операторы SQL с помощью Neor Profiler SQL, я вижу, что база данных получает этот запрос:

SELECT `id` FROM shops WHERE `name` = 'My Shop No. \\6\\'

Когда я использую этот запрос непосредственно в PHPMyAdmin, он также не возвращает никаких результатов.

Как мне справиться с этим делом?

Абсолютно нет возможности изменить данные в базе данных.

1 Ответ

0 голосов
/ 16 ноября 2018

Многие продукты (PHP, MySQL и т. Д.) Используют обратную косую черту в качестве escape-символа.

Само по себе обычно потребляется, если что-то сделать с персонажем после него. Например, a\tb дает вам буквы a и b, разделенные табуляцией ( обычная интерпретация \t).

Удвоение обратной косой черты \\xyz обычно интерпретируется следующим образом: первая обратная косая черта выходит за пределы второй, поэтому вы получаете \xyz.

Если ваша строка проходит через несколько уровней кода (например, PDO плюс MySQL), вам может понадобится вдвое больше обратной косой черты, поскольку каждый слой превратит \\ в \.

Другой диагностический инструмент - SELECT HEX(col) ..., чтобы увидеть, что было сохранено в базе данных. Примеры:

610962    a\tb  -- a=61, tab=09, b=62
615C7462  a\\tb -- a=61, \=5C, t=74, b=62 

Вернуться к вашему коду:

$params = array(':name' => "My Shop No. \6\");

\6 is probably treated as just "6" (not everything has some escaped meaning)
\" possibly caused a syntax error.  Normally this is now to get a " inside a string

'My Shop No. \\6\\'

Теперь пары обратных слешей превращаются в одиночные обратные слэши, а затем строка передается тому, кто следующий.

эти контексты, одинарные и двойные кавычки работают одинаково.)

...