Я использую PDO в PHP 7 на Amazon Linux AMI для подключения к базе данных SQL Server, работающей на Amazon RDS.
До сих пор я был в состоянии извлечь все данные из БД просто отлично, за исключением одного столбца в одной таблице. Столбец имеет тип image
и содержит двоичные данные.
Когда я пытаюсь использовать PDO в PHP, чтобы выбрать из рассматриваемого столбца, а затем вывести двоичный файл в окно браузера с отправленным необходимым заголовком (например, header('Content-Type: image/jpeg');
), Я вижу только часть файла (в случае изображения) или получаю ошибку поврежденного файла (в случае PDF).
В нескольких крайних случаях (я полагаю, когда размер файла довольно мал), я вижу полное изображение, но это редко.
Ниже приведен пример этой проблемы в Chrome:
Я сделал довольно обширный поиск по этому вопросу, но, похоже, информации по этому вопросу не так много, и все страницы, которые я видел, довольно старые и имеют отношение к mssql
(больше не доступно в PHP 7) или sqlsrv
водители.
Вот несколько примеров (казалось бы) связанных страниц, которые я нашел:
У кого-нибудь есть идеи относительно того, почему это происходит и как я могу это исправить? Я чувствую, что PDO должен справиться с этим, но если есть проблема с PDO, и мне нужно использовать некоторые другие драйверы, чтобы справиться с этим, это тоже хорошо.
Спасибо.
Я наконец нашел ответ. Данные, возвращаемые в PHP через PDO, на самом деле усекались до 64 Кб, что вызывало проблемы.
Алекс помог привести меня на правильный путь, предложив настройку TEXTSIZE
в -1
, Ошибка новичка, которую я сделал, состояла в том, что я сделал SET TEXTSIZE -1
от Microsoft SSMS, предполагая, что он будет установлен глобально для всех соединений, что было не так. Это только установить его для соединения SSMS, таким образом, проблема.
Однако когда я наконец сделал следующее в PDO в PHP, то есть установил TEXTSIZE
в -1
с подключением PDO, а затем сделать запрос из PDO, я смог установить TEXTSIZE
для подключения PDO, а затем получить обратно все данные:
doSqlServerQuery("SET TEXTSIZE -1;");
$results = doSqlServerQuery("SELECT binary-data-image-column AS data
FROM table-name
WHERE key = 95948578934578934;");
//Function definition
function doSqlServerQuery($query, $dbh = null) {
if (!isset($dbh)) {
global $dbh;
}
$stmt = $dbh->prepare($query);
if ($stmt) {
$stmt->execute();
$results = [];
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
$results[] = $result;
}
return $results;
} else {
pO($dbh->errorInfo());
}
}
Просто исправьте это самостоятельно, оно отключается после загрузки 64 КБ, чтобы исправить это, либо установите ограничение в 64 КБ, либо измените его на longblob, который дает вам 4 гигабайта памяти вместо 64 килобайт.