2009-08-20 30 views
17

Gần đây tôi đã học cách sử dụng Zend Framework. Tôi đã làm một ứng dụng CRUD đơn giản. Nhưng bây giờ tôi muốn sử dụng một cơ sở dữ liệu hiện có cho một ứng dụng phức tạp hơn và tôi muốn biết cách tôi gọi một thủ tục lưu sẵn trong Model, cách gửi các tham số, cách đọc kết quả và lưu chúng trong một mảng trong PHP. Xin vui lòng. Tôi đánh giá cao mọi sự trợ giúp :)Làm cách nào để sử dụng thủ tục được lưu trữ trong cơ sở dữ liệu MySql với Zend Framework?

+0

Nếu bạn muốn sử dụng thủ tục lưu trữ trong cơ sở dữ liệu MySQL GoDaddy lưu trữ, kiểm tra xem bạn có thể sao lưu nó lên cùng với sao lưu cơ sở dữ liệu của bạn. Từ kinh nghiệm của tôi, họ KHÔNG cho phép sao lưu các thủ tục được lưu trữ. Nó làm cho tôi không thể chấp nhận để sử dụng chúng. –

Trả lời

23

Nó không quá khó. Dưới đây là một ví dụ về một thủ tục MySQL lưu trữ với một tham số IN, một OUT tham số, và một tập kết quả:

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

Bạn có thể gọi đây là phương pháp query(), và thông qua một tham số:

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

Bí quyết là các procs được lưu trữ của MySQL có thể trả về nhiều tập kết quả (nếu proc có nhiều truy vấn SELECT chẳng hạn). Vì vậy, API phải tiến hành thông qua tất cả các tập kết quả trước khi bạn có thể thực hiện một truy vấn SQL khác. Hoặc nếu không bạn sẽ gặp lỗi "Lệnh không đồng bộ hóa".

Nếu bạn sử dụng adapter PDO_MySQL:

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

Nếu bạn sử dụng adapter MySQLi, bạn sẽ thấy rằng Zend_Db_Statement_Mysqli không thực hiện nextRowset(), vì vậy bạn phải gọi các đối tượng kết nối mysqli nội bộ:

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

Khi bạn xóa bộ kết quả, bạn có thể chạy truy vấn SQL tiếp theo, ví dụ để lấy giá trị tham số OUT của thủ tục:

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

Tôi chưa thử nghiệm các thủ tục lưu trữ được gọi trong các nhãn hiệu cơ sở dữ liệu khác ngoài MySQL. –

+0

Cảm ơn bạn Bill .. Tôi sẽ thử nó càng sớm càng tốt :) – l2mt

1

Câu trả lời hay từ Bill. Chỉ để hoàn thành, nếu bạn gặp phải:

SQLSTATE[HY000]: General error: 2053 

Khi sử dụng phương pháp này để lấy kết quả từ quy trình, hãy kiểm tra đối số của bạn. Tôi refactored một phương pháp và đã được đi qua NULL như là đối số cho các thủ tục như các biến tôi đã sử dụng được ra khỏi phạm vi. Khi tôi đã sửa lỗi sai lầm ngớ ngẩn này, vấn đề sẽ biến mất (được thay thế bởi một lỗi khác):

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

Tôi đang sử dụng $stmt->fetchAll(). Tôi đã chuyển sang sử dụng prepare()execute() thay cho số query(). Chuyển sang mysqli từ pdo_mysql trong cấu hình Zend_Db của tôi cuối cùng cũng có những thứ có hiệu quả đối với tôi. Tôi tìm thấy thông tin này từ những câu dưới đây SO:

Call Multiple Stored Procedures with the Zend Framework

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

Chào mừng bạn đến với StackOverflow. Để cung cấp câu trả lời hay, bạn nên viết giải thích với mã bạn đã cung cấp. – filipst

Các vấn đề liên quan