Использование PHP odbc для захвата столбца varchar (max) - PullRequest
3 голосов
/ 10 февраля 2011

Я собираю сайт PHP для проекта класса, и мы используем базу данных MS SQL Server 2008 для заполнения полей на сайте.Однако одно из полей выводит мусор на страницу вместо того, что фактически хранится в базе данных.

Рассматриваемое поле, называемое description, является полем varchar(MAX);хранимая процедура запрашивает у базы данных кортеж и выгружает значения из ее таблицы в текстовые поля на странице;поле description выводится в элемент управления textarea.

Вот PHP, который обрабатывает извлечение информации из базы данных:

$res = odbc_exec($dbhandle, "exec dbo.usp_ProgramGet " . $_GET["program"]);
$id = $_GET["program"];
$name = odbc_result($res, "title");
$desc = odbc_result($res, "description");

Переменная $name работает как положено(в базе данных он имеет тип char(15)).Однако, если (например) поле description содержит «Это тест», тогда $desc приведет к «� $ ime�����», что вместо этого выводится в элемент управления textarea.о том, что хранится в базе данных.

Я искал во всем и пока не нашел решения этой проблемы, хотя это звучит как ошибка в самом PHP, хотя я не уверен.


Обновление

Я использую запросы SQL Server для обновления значений varchar.Я попытался вставить действительно длинную строку и получил следующее:

�,ime�������stringDayToInt��É������à‰,���N={���������������������������������������������

"stringDayToInt" - это имя PHP-функции, которую я написал, которая живет в совершенно другом файле, который был включен в страницу, которую япопробовать.Очень странно.

Ответы [ 5 ]

3 голосов
/ 03 марта 2012

У меня была та же проблема Уродливая в PHP 5.3 ...

. На странице .php отображались случайные символы, где должно быть значение столбца.
Иногда были случайные символы и секции скриптов выполненной страницы php.Это не хорошо.

SQL Server: MS SQL Server 2008 R2

Мой драйвер подключения odbc: Driver = {Собственный клиент SQL Server 10.0}

Моя версия PHP: PHP5.3

Я оглядывался по сторонам, но не нашел решения.
Обходное решение Я пытался и работаю для меня:

select cast(the_column_varcharmax as text) as column_name from table_name

Попробуйте,Я надеюсь, что это работает для вас.

2 голосов
/ 02 октября 2015

Эта ошибка в MSSQL / ODBC / PHP уже давно, и я потерял надежду, что она будет исправлена ​​в моей жизни. Решение преобразовывает это в текст в процедуре:

select name, convert(text,description) as description. .....

Я делаю это много лет.

1 голос
/ 20 августа 2012

Это известная ошибка в PHP.

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

0 голосов
/ 16 января 2013

У меня была такая же проблема с PHP 5.3 и MS SQL 2008 R2. Вместо того чтобы обходить проблему с приведением (которое я не нашел удовлетворительным), я переключил драйверы с ODBC на SQLSRV, который, кажется, работает просто отлично.

0 голосов
/ 10 февраля 2011

Была похожая проблема: php удалить / идентифицировать этот символ

Символ замены

FFFD ХАРАКТЕР ЗАМЕНЫ

используется для замены входящего символа, значение которого неизвестно или непредставимо в Юникоде

UPDATE:

Что означает этот вывод:

echo mb_detect_encoding($desc).' ';
var_dump($desc);

Если mb_detect_encoding не работает

if(is_utf8($desc)) {
    echo "UTF-8 Encoded";
} else {
    echo "Oops, not UTF-8";
}

var_dump($desc);

function is_utf8($str) {
    $c=0; $b=0;
    $bits=0;
    $len=strlen($str);
    for($i=0; $i<$len; $i++){
        $c=ord($str[$i]);
        if($c > 128){
            if(($c >= 254)) return false;
            elseif($c >= 252) $bits=6;
            elseif($c >= 248) $bits=5;
            elseif($c >= 240) $bits=4;
            elseif($c >= 224) $bits=3;
            elseif($c >= 192) $bits=2;
            else return false;
            if(($i+$bits) > $len) return false;
            while($bits > 1){
                $i++;
                $b=ord($str[$i]);
                if($b < 128 || $b > 191) return false;
                $bits--;
            }
        }
    }
    return true;
}
...