Отличия PDO SQLSRV Windows IIS и Linux Apache

181
11 ноября 2017, 13:52

Есть проблема в выборе бинарных данных из таблицы. Исторически так сложилось, что пароль хранится в поле типа binary(64) в БД MS SQL Есть скрипт который выбирает пароль, пример:

$pdo = new PDO('sqlsrv:Server=8.8.8.8;Database=test', 'vova', 'megasecretpassword');
$sql = "SELECT Password FROM users WHERE Email = 'vova@kremlin.ru'";
$res = $pdo->query($sql);
$data = $res->fetchAll(PDO::FETCH_ASSOC);
print_r($data);

Результат в Linux Apache поле password будет такой:

55A5560F37D53FCA2DD4DE1032BDC3E1B4A2727C5CAF70 ...

А вот в Windows IIS вот такой:

U�V7�?�-��2��ᴢr|\�p� ...

Вопрос, что нужно сделать чтобы было везде одинаково? Спасибо!

P.S функция bin2hex приводит вариант из Windows к варианту из Linux

P.P.S сервер MS SQL в обоих случаях один и тот же.

Answer 1

Как я уже написал в комментариях, IIS возвращает вам нормальный результат, печатает полученные бинарные данные, и на экране видим то, что видим. В случае linux почему то драйвер переводит бинарные данные в текстовую форму. Это не корректное поведение, он не должен ничего с ними делать.

Но этим багом вы похоже давно и успешно пользуетесь. Может не конкретно этот, но аналогичный баг описан здесь: https://bugs.php.net/bug.php?id=40913 Цитата из статьи по теме:

Unfortunately there’s a bug which means that instead of returning a stream into $lob PDO returns a string containing the binary data.

Описание бага было создано 10 лет назад, и переоткрыто в 2017м году для пхп версии 7. Причем судя по всему, он так и не был пофиксен, в обсуждениях перечислены все версии от 5.2 до 7й, причем упомянаются как nix так и windows системы. С этой точки зрения даже странно, что ваш IIS отдает контент корректно.

В любом случае, поскольку для вашей задачи получить-то надо как раз hex-строку то получайте ее уже на выходе с сервера, например, select convert(varchar(64),password,2) as password.

зы: не проверял

READ ALSO
CloseHandle для INVALID_HANDLE_VALUE

CloseHandle для INVALID_HANDLE_VALUE

Если функция CreateFile вернула INVALID_HANDLE_VALUE, нужно ли закрывать его функцией CloseHandle?

329
Вращение графического примитива

Вращение графического примитива

Здравствуйте! Возникла такая проблемаНадо реализовать вращение такой фигуры

295
Помогите розвезать [требует правки]

Помогите розвезать [требует правки]

Решите пж Дано число nЧи вірно, що це число містить рівно 3 однакових цифри

304
Почему operator++ должен возвращать const T?

Почему operator++ должен возвращать const T?

Рассмотрим такой вариант реализации постфиксного оператора инкрементированияПочему требуется возвращать именно const T, а не T? Такой вариант...

211