2012-06-26 13 views
5

मैं ODBC (v2000.86.359.00) के साथ एक पीडीओ कनेक्शन है एक एसक्यूएल सर्वर (v8.00.2039 SP4 मानक संस्करण) डेटाबेस से कनेक्ट साथ पीएचपी पीडीओ/ODBC का उपयोग करना।त्रुटि जब तैयार बयान के दिनांक पैरामीटर बंधन - एसक्यूएल सर्वर

यह काम करता है:

$id = 486; 
$duedate = 'June 27, 2012'; 
$query ="INSERT into AssetHistory (AssetID, DateDue) Values($id, $duedate);";     
$noParams = $db->exec($query); 
$db->query($query); 

लेकिन अगर मैं इस तरह एक तैयार बयान का उपयोग करने का प्रयास करें:

$sql = 'INSERT into AssetHistory 
    (AssetID, DateDue) 
    Values(:id, :duedate);';     

$input = array(':id'=>486, ':duedate'=>'June 27, 2012'); 
$smt = $db->prepare($sql); 
$smt->execute($input); 

मैं इस त्रुटि मिलती है (($ smt- से> errorInfo)):

"[Microsoft][ODBC Driver Manager] Function sequence error (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)" 

मैंने कोशिश की है: 1) संलग्न: सिंगल कोट्स में डुबेट 2) बाध्यकारी यूनिक्स टाइमस्टैम्प पूर्णांक 3) बाइंडिंग के लिए तारीख:

तैयारी कर इस बिंदु पर पहले php दिनांक समय वस्तु 4) एसक्यूएल बयान में सिर्फ $ DUEDATE सम्मिलित करने के लिए DUEDATE मैं $ db-> क्वेरी पद्धति का उपयोग करके और आदानों sanitizing अटक सकता है जितना संभव मैं कर सकता हूं, लेकिन मैं वास्तव में किसी भी सुझाव की सराहना करता हूं।

विंडोज सर्वर 2003 बॉक्स पर PHP 5.38 का उपयोग करना।

अपडेट: मैंने इस प्रश्न के पिछले संस्करण से कुछ चर हटा दिए हैं। त्रुटि संदेश बदल गया है, लेकिन अंतिम परिणाम वही है।

तो जैसे एसक्यूएल करने के लिए परिवर्तित समारोह जोड़ने के साथ साथ
$smt->bindValue(':id', 486, PDO::PARAM_INT); 
$smt->bindValue(':duedate', 'June 27, 2012', PDO::PARAM_STR); 

:

$sql = 'INSERT into AssetHistory 
    (AssetID, DateDue) 
Values(:id, convert(datetime,:duedate, 100));'; 

कौन देता है: "COUNT फ़ील्ड ग़लत

मैं मैन्युअल रूप से भी तो जैसे पैरामीटर बाध्यकारी की कोशिश की है या वाक्यविन्यास त्रुटि "

और मैंने देखा है कि SQL सर्वर वास्तव में play nice यूनिक्स टाइमस्टैम्प के साथ नहीं है ...

+0

'duedate' में क्या होता है? –

+0

स्वरूपित दिनांक के साथ स्ट्रिंग - मैंने '27 जून, 2012' और '2012-06-27 00: 00.000' –

+0

की कोशिश की है, ठीक है, क्या आपने लंबे प्रारूप की कोशिश की है: '$ smt-> bindValue (': duedate' , $ DUEDATE, पीडीओ :: PARAM_INT); '? या, '$ duedate = intval ($ duedate) कास्टिंग; '? – Wrikken

उत्तर

3

अंत को डाउनलोड और इंस्टॉल दोनों sqlsrv php drivers (मैं संस्करण 2.0 प्रयुक्त) और SQL Server 2008 Native Client द्वारा इस संकल्प लिया।

$ dsn पैरामीटर के लिए एक छोटे से ट्वीक के साथ, कोड के बाकी जादू की तरह काम करता है - कोई बाध्यकारी, परिवर्तित करने या आवश्यक कास्टिंग।

मैं केवल php_pdo_sqlsrv_53_ts_vc9.dll का उपयोग कर समाप्त हुआ, लेकिन सुनिश्चित करें कि आप ड्राइवर के सही थ्रेड-सुरक्षित/गैर-थ्रेड सुरक्षित संस्करण का चयन करें, क्योंकि php.ini में गलत dll आपके सर्वर को क्रैश करेगा।

1

आप strtotime की कोशिश की है?

$phpdate = strtotime($duedate); 

आप भी अपने बयान

convert(datetime, :duedate, 100) 

एसक्यूएल में डेटाप्रकार datetime है, सही में SQL's CONVERT उपयोग करने का प्रयास कर सकता है?

या कोशिश:

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate'=>strtotime($duedate), 

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate"=>$duedate),"0000-00-00 00:00:00" 
+0

यूप। वही त्रुटि –

+0

हमें अपना $ duedate = – user1166147

+0

दिखाएं इस बिंदु पर मैं सरणी में एक स्ट्रिंग अक्षर का उपयोग कर रहा हूं: '$ इनपुट = सरणी (': id' => 486, ': उधारकर्ता' => 'जॉनस्मिथ', 'लोनर' => 'KOPERW', ': duedate' => '27 जून, 2012', ': loaneragain' => 'KOPERW'); ' –

0

"COUNT फ़ील्ड गलत या वाक्यविन्यास त्रुटि" हो सकती है यदि आप पैरामीटरयुक्त क्वेरी सेट अप करते हैं लेकिन फिर पैरामीटर सूची में आवश्यक पैरामीटर को पास करने में विफल रहते हैं।

आपका कोड उस मोर्चे पर ठीक दिखता है, हालांकि।

संबंधित मुद्दे