2016-10-31 12 views
6

पहले से ही पोस्ट किए गए इस तरह के कई समान प्रश्न हैं। हालांकि मुझे इस कोड को काम करने का कोई तरीका नहीं मिला है।एसक्यूएल सर्वर के साथ पीएचपी पीडीओ और तैयार बयान

मैं मूल रूप से ओडीबीसी का उपयोग करने के लिए पीडीओ का उपयोग करने के लिए मूल एमएसएसएलएल क्वेरी से PHP कोडबेस अपडेट कर रहा हूं। यहां पुराना कोड और दो भिन्नताएं हैं जिनकी मैंने कोशिश की है।

पुरानी शैली: काम करता है, यह अपेक्षित परिणामों की एक श्रृंखला उत्पन्न करता है। पीडीओ साथ

$db = mssql_connect('connection', 'user', 'password'); 
mssql_select_db('database', $db); 

$sp = mssql_init('procedure', $db); 
$param=1; 
$results=[]; 
mssql_bind($sp,'@param',$param,SQLINT4,FALSE,FALSE); 
$spRes = mssql_execute($sp); 

while ($row = mssql_fetch_array($spRes, MSSQL_ASSOC)) $results[] = $row; 
mssql_free_statement($sp); 
var_dump(results); 

का उपयोग T-SQL लगभग काम करता है: मैं जब तक मैं किसी भी पैरामीटर बाध्य करने के लिए कोशिश मत करो के रूप में परिणाम प्राप्त।

$pdo = new PDO($'dblib:host=connection', 'user', 'password'); 
$pdo->query('use database'); 

$sp= $db->prepare("EXEC procedure"); 
$sp->execute(); 

while ($row = $sp->fetch(PDO::FETCH_BOUND)) $results[] = $row; 
$sp->closeCursor(); 
var_dump(results); 

कई अपेक्षित परिणामों की एक श्रृंखला तैयार करता है। हालांकि पैरामीटर को बांधने का कोई भी प्रयास $results को खाली सरणी के रूप में ले जाता है। कोई त्रुटि रिपोर्ट नहीं की गई है।

$sp= $db->prepare("EXEC procedure :param"); 
$sp->bindParam(':param', $param, PDO::PARAM_INT); 

इससे खाली परिणाम सेट होता है, और कोई त्रुटि रिपोर्ट नहीं होती है।

ODBC "एसक्यूएल" का प्रयोग बिल्कुल काम नहीं लगता है:

$pdo = new PDO($'dblib:host=connection', 'user', 'password'); 
$pdo->query('use database'); 

$sp= $db->prepare("CALL procedure"); 
$sp->execute(); 

while ($row = $sp->fetch(PDO::FETCH_BOUND)) $results[] = $row; 
$sp->closeCursor(); 
var_dump(results); 

$results रिक्त है; पैरामीटर के साथ या बिना, यह काम नहीं लग रहा है।

सिस्टम विवरण: Unixodbc & freetds के साथ उबंटू ट्रस्टी (14) पर PHP 5.5.9 चलाना।

मैं वास्तव में PHP पीडीओ कॉलिंग प्रक्रियाओं और एमएसएसक्यूएल के साथ बाध्यकारी पैरामीटर कॉलिंग के एक कामकाजी उदाहरण की सराहना करता हूं।

+0

http: // st ackoverflow.com/a/32224294/285587? –

+0

कुछ मदद के बाद। अब मैं '$ pdo = new PDO ('odbc = connection', 'user', 'password') से कनेक्ट कर रहा हूं; हालांकि, नामित पैरामीटर के लिए बाध्यकारी अभी भी काम नहीं कर रहा है। –

+0

आपके प्रश्न में अपने परिवर्तनों को संपादित करने के लिए सबसे अच्छा, आपने जो कुछ भी शुरू किया है और जो आपने बदल दिया है, उसे सर्वोत्तम रूप से बनाए रखना। – TallTed

उत्तर

3

देखें इस प्रयास करें ..

$result = array(); 

$sp= $db->prepare("EXECUTE dbo.procedure :param"); 
$sp->bindParam(":param", $param, PDO::PARAM_INT); 
$sp->execute(); 

$result = $sp->fetchall(PDO::FETCH_OBJ); 
+0

यह काम करता है। मुझे कनेक्शन डीएसएन को dblib से '$ pdo = new PDO (' odbc = connection ',' user ',' password ') में बदलना पड़ा;' –

3

कोशिश बदलते इस -

$sp= $db->prepare("CALL procedure"); 

- यह करने के लिए -

$sp= $db->prepare("{ CALL procedure() }"); 

ODBC documentation on Procedure Call Escape Sequence, और अधिक के लिए PHP PDO documentation ...

+0

ठीक है, इससे बहुत मदद मिलती है। मैं एक ओडीबीसी डीएसएन से कनेक्ट कर सकता हूं और उस वाक्यविन्यास के साथ कॉल प्रक्रियाओं को जोड़ सकता हूं। हालांकि मैं अभी भी काम करने के लिए बाध्यकारी पैरामीटर नहीं मिल सकता है। मैंने ओडीबीसी ट्रेसिंग चालू कर दी है और देखेंगे कि क्या कल कल कोई और संकेत मिलता है। –

+0

मुझे बाध्य पैरामीटर के साथ आपके प्रयासों को दिखाने वाला कोई भी PHP कोड नहीं दिख रहा है, इसलिए मैं वहां कोई उपयोगी टिप्पणी नहीं कर सकता ... – TallTed

+0

धन्यवाद। यद्यपि आप प्रश्न पर 'बांध' की तलाश करते हैं। कोड में कुछ उदाहरण हैं। संभवतः मैंने इसे पूरी तरह से गलत पाया है और कुछ और तरीका है। –

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