2011-06-21 35 views
5

Sadece PHP PDO'yu MySQL saklı yordamlarla kullanmaya başladım ve prosedür çağrısından OUT parametrelerinin nasıl alınacağıyla ilgili bir sorunum var. Birçok benzer stackoverflow konularına baktım, ancak maalesef sorunumu çözmenin bir yolunu bulamadım: |PHP PDO OUT parametre değerini alamıyor

İşte detaylar:

prosedürü 1 giriş parametre alır ve 2 zorunlu çıkış parametreleri vardır ve döner onları durumunu sonuçlanır.

Ben böyle diyoruz nasıl:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 

prosedür @o_message parametresinde @o_code parametresi ve STRING içinde INT döndürür. o CLI aradı, çağrıdan sonra ben

select @o_code, @o_message; 

herşey yolundadır CLI yazacak olursa , ben bu ÇIKIŞ parametrelerde dönen değerleri görebilir duyuyorum olduğunu. Ancak bunu PHP kodundan yapamıyorum - nedense her zaman FALSE sonuçları alıyorum. Prosedür doğru iş yapıyor, ancak sonuçlarını alamıyorum.

$output = $proc->fetch(PDO::FETCH_ASSOC); // also with PDO:FETCH_OBJ 
$output = $mydb->query("select @o_code, @o_message"); 
$output = $mydb->query("select @o_code, @o_message")->fetch(); 
$output = $mydb->query("select @o_code, @o_message")->fetchColumn(); 
$output = $mydb->query("select @o_code, @o_message")->fetchAll(); 

ancak bunların hiçbiri NULL veya YANLIŞ farklı herhangi bir sonuç döndürür:

Ben çağrı yukarıda açıklanan yapmak hemen sonra, değerlerini almak için aşağıdaki yöntemleri denedi. Ayrıca bindParam ile çalıştı, ama yine de işe yaramaz.

Bu konuyla ilgili yardımlarınız ve iyi günler için teşekkür ederiz!

----- DÜZENLEME ----- İşte

hala çalışmıyorsa ben BindParam ile birlikte yargılanacak kod şudur:

$input = 5; 
$proc = $mydb->prepare("CALL proc_name(?, ?, ?)"); 
$proc->bindParam(1, $input, PDO::PARAM_INT); 
$proc->bindParam(2, $code, PDO::PARAM_INT); 
$proc->bindParam(3, $message, PDO::PARAM_STR); 
$proc->execute(); 

var_dump($code, $message); // NULL, NULL 
+0

Bulunan bu: Eğer işaret ettiğini http://stackoverflow.com/a/32224294/2717254 –

+0

soru farklı bir sorundur ve burada yayınlanan sorunun sorununu çözmez. Problemin düzgün çalışması için "closeCursor()" çağrılması gerektiğini görmek için aşağıda verilen cevabı kontrol edebilirsiniz. Diğer sorgudaki cevabın o kod satırı var, bu yüzden benim tahminim de işe yaramıyor. – middlehut

+1

Cevap, çıkış param değerini almakla ilgili! CloseCursor() çağrısı dahil edilmedi. Daha iyi btw açıklamak için cevabı güncellendi –

cevap

5

sorun ilk sorgu o saklı yordamı çağırıyor bitmiş ve kapalı olarak kabul edilmez ve PDO önceki sorgu yapılana kadar başka bir sorgu yürütmez.

çözüm eklemek oldu $proc->closeCursor();

bütün çalışma örneğidir:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 
$proc->closeCursor(); 

$output = $mydb->query("select @o_code, @o_message")->fetch(PDO::FETCH_ASSOC); 
var_dump($output); // array('@o_code'=>value, 'o_message'=>value)