Подтвердить что ты не робот

PHP & SQL Server - имена полей усечены

Вот соответствующий код:

function connect(){
    // DB credentials and info defined here....
    $connection = odbc_connect("DRIVER={SQL Server Native Client 11.0}; Server=$server; Database=$db;", $loginname, $loginpass);
    return $connection;
}

function odbc_fetch_results($stmt, &$results) {
    $numrows = odbc_num_rows($stmt);
    $row = odbc_fetch_array($stmt);
    print_r($row); // Prints: Array ( [MEASUREMENT_UNI] => kg)
    if($row){
         $results = array ($row);
         while( $row = odbc_fetch_array($stmt)){
            array_push($results, $row);
         }
    }
    return $numrows;
}

$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints: Array ( [0] => Array ( [MEASUREMENT_UNI] => kg) ) 

Результат должен содержать столбец с именем MEASUREMENT_UNIT, который (когда я делаю print_r, я могу проверить) усечен до MEASUREMENT_UNI, который составляет всего 15 символов. Последняя буква T отключена.

Я также попробовал запрос с другой таблицей и другим столбцом в базе данных SQL Server в качестве теста, чтобы убедиться, что это не была какая-то странная настройка с конкретной таблицей или столбцом, с которой я работаю. Я проверил, что то же самое происходит с другой таблицей/столбцом: имена столбцов усекаются до 15 символов при запуске запроса выбора, как указано выше.

Я также попробовал select, который задает имя поля типа select MEASUREMENT_UNIT from from measurements where ID=$id вместо select *, но это также не решает проблему.

Я видел другие подобные сообщения здесь об этом, но все они, похоже, указывают, что я должен иметь возможность получить как минимум 30 символов, а не 15-символьный лимит, который я вижу.

Почему имя столбца усечено до 15 символов?

Изменить: подключение к базе данных сервера MySQL, похоже, не привело к такой же проблеме. Имена столбцов DB из таблиц MySQL НЕ были усечены, что заставляет меня думать, что это не проблема с плагином ODBC.

$connection = odbc_connect("DRIVER={MySQL};Server=$server; Database=$db;", $loginname, $loginpass);
$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints CORRECTLY: Array ( [0] => Array ( [MEASUREMENT_UNIT] => kg) )

Обратите внимание, что оба вышеуказанных раздела кода были протестированы в том же файле на том же сервере с той же установкой PHP + ODBC.

4b9b3361

Ответ 1

Проблема, безусловно, связана с драйверами Microsoft ODBC версии 11 и исправлена ​​в ODBC Driver 13 Preview для SQL Server.

Я обнаружил это, так как моя машина разработки, работающая с ubuntu 14.04 с установленным драйвером 13 Preview, прекрасно работает, но затем, когда я развернулся на нашем производственном сервере, на котором работает RHEL 7 с драйвером 11, все виды хаоса, вызванные именами столбцов, были усечены на 15 символов.

Документация Microsoft не нужна для поддержки Linux, поэтому, если вы используете ubuntu, тогда gist, чтобы установить ее.

Ответ 2

Очевидно, проблема связана с ODBC. Там есть ошибка в PHP, где имена столбцов усекаются на 31 символ, и единственный способ исправить это - перекомпиляция PHP, изменение длины массива name в /ext/odbc/php_odbc_includes.h (обычно 32, но, по-видимому, в вашем случае это было 16) но это не считается безопасным или небезопасным. здесь и здесь, чтобы узнать больше об этом.

Ответ 3

Постоянное решение состоит в том, чтобы перекомпилировать ваш PHP, как предложено в потоках ошибок PHP, или попробовать обновить до более новой версии PHP.

Вы можете обойти проблему, выборочно переименовывая столбцы в своем выборе на более короткие:

$sql = "SELECT measurement_unit AS measure_unit, * FROM measurements WHERE ID=$id";
// now in your array you will have new index called "measure_unit"