2012-12-12 17 views
23

यहाँ प्रासंगिक कोड है:पीएचपी और एसक्यूएल सर्वर - फ़ील्ड नाम छोटा कर दिया

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

परिणाम को शामिल करना चाहिए एक columnn MEASUREMENT_UNIT जो (जब मैं एक print_r इस बात की पुष्टि कर सकते हैं) MEASUREMENT_UNI को छोटा किया गया है कहा जाता है जो केवल है 15 अक्षर अंतिम पत्र T काट दिया गया है।

मैं भी यकीन है कि यह नहीं था विशेष तालिका या स्तंभ है कि मैं काम कर रहा हूँ के साथ किसी भी अजीब सेटअप बनाने के लिए एक अलग मेज और एक अलग एक परीक्षण के रूप SQL सर्वर डाटाबेस पर स्तंभ के साथ एक प्रश्न करने की कोशिश की साथ में। मैंने सत्यापित किया कि एक ही चीज एक अलग तालिका/कॉलम के साथ होती है: ऊपर दिए गए चयन क्वेरी को चलाने पर कॉलम नामों को अधिकतम 15 वर्णों तक छोटा कर दिया जाता है।

मैंने एक चयन का भी प्रयास किया है जो select * के बजाय select MEASUREMENT_UNIT from from measurements where ID=$id जैसे फील्ड नाम निर्दिष्ट करता है लेकिन इससे समस्या हल नहीं होती है।

मैंने इस बारे में अन्य समान पदों को देखा है, लेकिन वे सभी संकेत देते हैं कि मुझे कम से कम 30 वर्ण प्राप्त करने में सक्षम होना चाहिए, न कि 15 वर्ण सीमा जो मैं देख रहा हूं।

कॉलम नाम को 15 वर्णों में क्यों छोटा किया जा रहा है?

संपादित करें: एक MySQL सर्वर डेटाबेस से कनेक्ट करना एक ही समस्या में प्रतीत नहीं होता है। MySQL तालिकाओं से डीबी कॉलम नामों को छोटा नहीं किया गया था जो मुझे विश्वास दिलाता है कि यह ओडीबीसी प्लगइन में कोई समस्या नहीं है।

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

ध्यान दें कि उपरोक्त कोड वर्गों के दोनों एक ही पीएचपी + ODBC स्थापना के साथ एक ही सर्वर पर एक ही फाइल में परीक्षण किया गया।

+0

क्या 'odbc_fetch_results' एक कस्टम फ़ंक्शन है? मैं इसे PHP दस्तावेज़ में नहीं देख रहा हूं। –

+0

@ गीगावाट लगता है कि मैं स्पष्ट रूप से सोच नहीं रहा था। मैंने 'odbc_fetch_results' फ़ंक्शन के लिए कोड पोस्ट किया। – nmc

+4

'print_r ($ पंक्ति) में फेंको;' $ पंक्ति = odbc_fetch_array ($ stmt) के तुरंत बाद; '। इससे हमें यह देखने देना चाहिए कि क्या आपके कोड में छंटनी है या 'obdc_fetch_array' कॉल में है। –

उत्तर

1

समस्या माइक्रोसॉफ्ट ODBC ड्राइवर संस्करण 11 के निश्चित रूप से है, और ODBC Driver 13 Preview for SQL Server में तय कर रहे हैं।

मैं जब मैं अपने उत्पादन चालक 11 के साथ RHEL 7 चला सर्वर के लिए तैनात चालक 13 पूर्वावलोकन के साथ Ubuntu 14.04 चल स्थापित काम करता है ठीक मेरे विकास मशीन के रूप में यह पता चला है, लेकिन फिर, कहर के सभी प्रकार शुरू हो गयी रूप में स्तंभ नाम छोटा कर दिया गया 15 वर्णों पर

माइक्रोसॉफ्ट का दस्तावेज लिनक्स समर्थन के लिए कमजोर है, इसलिए यदि आप उबंटू चला रहे हैं, तो यहां स्थापित होने के gist हैं।

+1

अंत में इसका परीक्षण करने के लिए चारों ओर मिल गया और ऐसा लगता है कि ओडीबीसी चालक 13 इस समस्या को ठीक करता है! '$ कनेक्शन = odbc_connect (" DRIVER = {SQL सर्वर के लिए ओडीबीसी चालक 13}; सर्वर = $ सर्वर; डेटाबेस = $ डीबी; ", $ loginname, $ loginpass);' – nmc

14

स्पष्ट रूप से समस्या ओडीबीसी के साथ है। PHP में एक बग है जहां कॉलम नाम 31 वर्णों पर छोटा कर दिए जाते हैं, और इसे ठीक करने का एकमात्र तरीका PHP को दोबारा जोड़ना है, name की /ext/odbc/php_odbc_includes.h में सरणी लंबाई बदलना (आमतौर पर 32 लेकिन स्पष्ट रूप से यह आपके मामले में 16 था), लेकिन यह नहीं है या तो सुरक्षित या असुरक्षित साबित हुआ। इसके बारे में अधिक जानकारी देखने के लिए here और here पर जाएं।

+0

धन्यवाद, मैंने उस बग रिपोर्ट को देखा लेकिन निर्दिष्ट फ़ाइल के रूप में फ़ाइल '/ ext/odbc/php_odbc_includes.h' को खोजने में असमर्थ रहा है। क्या कोई और फ़ाइल है जो इस कॉन्फ़िगरेशन में संभवतः हो सकती है? – nmc

+1

आपको इसे स्रोतों से संकलित करना है, दुख की बात है। यह एक विन्यास फाइल में सिर्फ एक फ़ील्ड नहीं है। –

+0

अहह, यह कुंजी है: स्रोत से संकलित होना चाहिए। मुझे आश्चर्य है कि स्रोत – nmc

1

स्थायी समाधान PHP 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"