2012-12-12 41 views
23

Đây là mã có liên quan:PHP & SQL Server - tên trường rút ngắn

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)) 

Kết quả nên chứa một columnn gọi MEASUREMENT_UNIT đó (khi tôi làm một print_r tôi có thể xác minh) sẽ bỏ bớt MEASUREMENT_UNI mà chỉ là 15 ký tự. Chữ cái cuối cùng T bị cắt.

Tôi cũng đã cố gắng một truy vấn với một bảng khác nhau và một khác nhau cột trên cơ sở dữ liệu SQL Server như một thử nghiệm để chắc chắn rằng nó không phải là bất kỳ thiết lập lạ với bảng cụ thể hoặc cột mà tôi đang làm việc với. Tôi xác minh cùng một điều xảy ra với một bảng/cột khác nhau: tên cột được cắt bớt tối đa 15 ký tự khi tôi chạy truy vấn chọn như trên.

Tôi cũng đã thử một lựa chọn chỉ định tên trường như select MEASUREMENT_UNIT from from measurements where ID=$id thay vì select * nhưng điều đó cũng không giải quyết được sự cố.

Tôi đã xem các bài đăng tương tự khác ở đây về điều này nhưng tất cả dường như chỉ ra rằng tôi sẽ có thể nhận được ít nhất 30 ký tự, không phải giới hạn 15 ký tự mà tôi thấy.

Tại sao tên cột bị cắt bớt thành 15 ký tự?

Chỉnh sửa: Kết nối với cơ sở dữ liệu máy chủ MySQL dường như không dẫn đến cùng một vấn đề. Tên cột DB từ các bảng MySQL không được cắt ngắn dẫn tôi tin rằng đây không phải là vấn đề với plugin 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)) 

Lưu ý rằng cả hai phần mã trên đã được thử nghiệm trong cùng một tệp trên cùng một máy chủ có cài đặt PHP + ODBC giống nhau.

+0

Có phải 'odbc_fetch_results' là một chức năng tùy chỉnh không? Tôi không thấy nó trong tài liệu PHP. –

+0

@GigaWatt Dường như tôi không suy nghĩ rõ ràng. Tôi đã đăng mã cho hàm 'odbc_fetch_results'. – nmc

+4

Ném vào một 'print_r ($ row);' ngay sau '$ row = odbc_fetch_array ($ stmt);'. Điều đó sẽ cho chúng tôi biết nếu cắt ngắn trong mã của bạn hoặc trong lệnh gọi 'obdc_fetch_array'. –

Trả lời

1

Vấn đề chắc chắn là với các trình điều khiển Microsoft ODBC phiên bản 11, và được cố định trong ODBC Driver 13 Preview for SQL Server.

tôi phát hiện ra điều này như máy phát triển của tôi chạy ubuntu 14.04 với trình điều khiển 13 Preview cài đặt công trình tốt, nhưng sau đó khi tôi triển khai tới máy chủ sản xuất của chúng tôi chạy RHEL 7 với trình điều khiển 11, tất cả các loại tàn phá xảy ra sau đó như tên cột đã được cắt ngắn với 15 ký tự.

Tài liệu của Microsoft không hỗ trợ Linux, vì vậy nếu bạn đang chạy ubuntu, thì đây là số gist để cài đặt.

+1

Cuối cùng có xung quanh để thử nghiệm này và có vẻ như ODBC Driver 13 không khắc phục vấn đề này! '$ connection = odbc_connect (" DRIVER = {ODBC Driver 13 cho SQL Server}; Máy chủ = $ máy chủ; Cơ sở dữ liệu = $ db; ", $ loginname, $ loginpass);' – nmc

14

Rõ ràng vấn đề là với ODBC. Có một lỗi trong PHP trong đó tên cột được cắt ngắn ở 31 ký tự và cách duy nhất để khắc phục điều này là biên dịch lại PHP, thay đổi độ dài mảng name trong /ext/odbc/php_odbc_includes.h (thường là 32 nhưng dường như nó là 16 trong trường hợp của bạn), nhưng không phải đã được chứng minh là an toàn hoặc không an toàn. Truy cập herehere để xem thêm thông tin về điều này.

+0

Cảm ơn, tôi đã thấy báo cáo lỗi đó nhưng không thể tìm thấy tệp '/ ext/odbc/php_odbc_includes.h' như được chỉ định. Có một tệp khác mà cấu hình này có thể có thể ở trong đó không? – nmc

+1

Bạn phải biên dịch từ các nguồn, thật đáng buồn. Nó không chỉ là một trường trong một tập tin cấu hình. –

+0

Ahhh, đó là chìa khóa: phải biên dịch từ nguồn. Tôi tự hỏi nếu có bất kỳ giải pháp khác cho điều này hơn là phải biên dịch PHP từ nguồn – nmc

1

Giải pháp vĩnh viễn là biên dịch lại PHP của bạn như được đề xuất trong các chủ đề lỗi PHP hoặc thử cập nhật lên phiên bản PHP mới hơn.

Bạn có thể làm việc xung quanh vấn đề bằng cách cột một cách chọn lọc đổi tên trong lựa chọn của bạn cho những người thân ngắn hơn:

$sql = "SELECT measurement_unit AS measure_unit, * FROM measurements WHERE ID=$id"; 
// now in your array you will have new index called "measure_unit" 
Các vấn đề liên quan