2009-08-20 9 views
17

Niedawno nauczyłem się korzystać z Zend Framework. Zrobiłem prostą aplikację CRUD. Ale teraz chcę użyć istniejącej bazy danych dla bardziej złożonej aplikacji i chcę wiedzieć, jak wywołać procedurę przechowywaną w Modelu, jak przesłać parametry, jak odczytać wyniki i zapisać je w tablicy w PHP. Proszę. Doceniam wszelką pomoc :)Jak mogę użyć procedury przechowywanej w bazie danych MySql z Zend Framework?

+0

Jeśli chcesz korzystać z procedur przechowywanych w ciągu GoDaddy hosting bazy danych MySQL, należy sprawdzić, czy można jego kopię zapasową wraz z kopii zapasowej bazy danych. Z mojego doświadczenia NIE pozwalają na tworzenie kopii zapasowych zapisanych procedur. Niedopuszczalne jest używanie ich. –

Odpowiedz

23

To nie jest trudne. Oto przykład procedury przechowywanej MySQL z parametrem IN, parametr OUT oraz zestaw wyników:

CREATE PROCEDURE MyProc(IN i INTEGER, OUT o INTEGER) 
BEGIN 
    SELECT i+10 INTO o; 
    SELECT i, o; 
END 

Można nazwać to metodą query() i przekazać parametr:

$stmt = $db->query("CALL MyProc(?, @output)", array(25)); 
print_r($stmt->fetchAll()); 

Sztuczka polega na tym, że procenty przechowywane w MySQL mogą zwracać wiele zestawów wyników (jeśli proc miał na przykład wiele zapytań SELECT). Dlatego API musi przejść przez wszystkie zestawy wyników, zanim będzie można wykonać inne zapytanie SQL. Lub otrzymasz komunikat "Polecenia niezsynchronizowane".

W przypadku korzystania z zasilacza pdo_mysql:

while ($stmt->nextRowset()) { } 

W przypadku korzystania z zasilacza MySQLi, przekonasz się, że Zend_Db_Statement_Mysqli nie implementuje nextRowset(), więc trzeba zadzwonić wewnętrzne mysqli obiekt połączenia:

while ($db->getConnection()->next_result()) { } 

po wyczyścić zestawów wyników, można uruchomić kolejnych zapytań SQL, na przykład, aby pobrać wartość parametru OUT procedura jest:

$stmt = $db->query("SELECT @output"); 
print_r($stmt->fetchAll()); 
+0

Nie testowałem wywoływania procedur przechowywanych w bazach danych innych marek oprócz MySQL. –

+0

Dziękuję Bill .. Spróbuję go jak najszybciej :) – l2mt

1

Świetna odpowiedź od Billa. Tylko dla kompletności, jeśli napotkasz:

SQLSTATE[HY000]: General error: 2053 

Podczas korzystania z tej metody, aby uzyskać zestaw wyników z procedury, sprawdź swoje argumenty. Refaktoryzowałem metodę i przekazywałem NULL jako argumenty do procedury, ponieważ zmienne, których użyłem, były poza zakresem. Raz ja ustalona ten głupi błąd problem odszedł (zastępuje go inny):

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other 
unbuffered queries are active. Consider using PDOStatement::fetchAll(). 

Używam $stmt->fetchAll() chociaż. Przełączyłem na używanie prepare() i execute() zamiast query(). Przejście na mysqli z pdo_mysql w mojej konfiguracji Zend_Db w końcu sprawiło, że rzeczy działały dla mnie. Znalazłem tę informację z następującym SO pytanie:

Call Multiple Stored Procedures with the Zend Framework

0
$db = Zend_Db_Table::getDefaultAdapter();  
    $stmt = $db->query("CALL procedure()"); 
    $data = $stmt->fetchAll(); 
+0

Witamy w StackOverflow. Aby uzyskać dobrą odpowiedź, należy napisać wyjaśnienie za pomocą podanego kodu. – filipst

Powiązane problemy