Gọi một thủ tục được lưu trữ trong mysqli là một công việc khó khăn. Có những lỗi và hạn chế cần tránh cũng như nhiều thủ thuật để sử dụng
Thành thật mà nói, trong trường hợp đơn giản nhất có thể [khi thủ tục được lưu trữ là truy vấn sql duy nhất mà mã của bạn phải chạy và bản thân thủ tục tương đối đơn giản, không sử dụng con trỏ hoặc trả về nhiều tập kết quả], bạn có thể gọi nó là
Nhưng thủ tục được lưu trữ của bạn càng phức tạp thì mã gọi càng phức tạp.
Có một điều về thủ tục lưu sẵn mà bất kỳ lập trình viên nào cũng vấp phải lúc đầu. mọi thủ tục được lưu trữ luôn trả về một tập hợp kết quả bổ sung. một [hoặc nhiều] kết quả có dữ liệu thực và một kết quả trống. Điều đó có nghĩa là nếu bạn cố gắng gọi một thủ tục và sau đó tiếp tục với một truy vấn khác, thì lỗi "Không thể thực hiện các truy vấn trong khi các truy vấn không có bộ đệm khác đang hoạt động" sẽ xảy ra, bởi vì trước tiên bạn phải xóa kết quả trống thừa đó
Do đó, để tiếp tục, trước tiên chúng ta phải loại bỏ tập kết quả bổ sung đó từ mysql. Và mysqli. next_result thực hiện chính xác điều đó. Vì vậy, về cơ bản, chúng ta chỉ cần gọi hàm này để các truy vấn SQL tiếp theo của chúng ta hoạt động
Ngoài ra, chúng ta sẽ cần chức năng này
Gọi một thủ tục được lưu trữ không có tham số trả về một tập kết quả duy nhất
Như đã nói ở trên, trong trường hợp quy trình của bạn là tương tác cơ sở dữ liệu duy nhất trên trang, bạn có thể gọi nó ngay lập tức mà không cần thêm bất kỳ nội dung nào. Nhưng thường thì không phải như vậy và bạn phải thực hiện các truy vấn khác sau thủ tục. Do đó, chúng tôi phải loại bỏ tập hợp kết quả bổ sung đó theo cách của chúng tôi
Khi truy vấn của chúng tôi không nhận bất kỳ tham số nào và chỉ trả về một tập kết quả, chúng tôi có thể thêm một lệnh gọi duy nhất vào mysqli. next_result
Để thực thi một câu lệnh trong cơ sở dữ liệu MySQL, bạn có thể sử dụng bất kỳ công cụ máy khách MySQL nào. g. , công cụ máy khách mysql hoặc MySQL Workbench
Đầu tiên, chèn dữ liệu vào bảng
1 bằng cách thực hiện câu lệnhCode language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
2 sau
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Code language: SQL [Structured Query Language] [sql]
Code language: SQL [Structured Query Language] [sql]
INSERT INTO books[title, isbn, published_date,publisher_id] VALUES ['Goodbye to All That','9781541619883','2013-01-05', 3], ['The Mercies','9780316529235','2020-01-28', 3], ['On the Farm','9780763655914','2012-03-27', 2], ['Joseph Had a Little Overcoat','9780140563580','1977-03-15', 2];
Lưu ý rằng bảng
3 phải có các hàng có id 2 và 3. Nếu không, bạn có thể chạy tập lệnh chèn các hàng vào bảngCode language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
3Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Thứ hai, thực hiện câu lệnh
5 sau để tạo một thủ tục lưu trữ mới có tên làCode language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
6Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Thủ tục được lưu trữ
6 trả về tất cả sách được xuất bản sau một năm cụ thểCode language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Thứ ba, thực hiện thủ tục lưu sẵn để kiểm tra tập kết quả
Code language: SQL [Structured Query Language] [sql]
CALL get_books_published_after[2010];
Câu lệnh trả về tập kết quả sau
0Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Gọi thủ tục lưu trữ MySQL từ PHP bằng PDO
Đoạn script sau minh họa cách gọi thủ tục lưu sẵn
6Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
2Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Làm thế nào nó hoạt động
Đầu tiên, tạo một kết nối mới đến cơ sở dữ liệu MySQL
3Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Thứ hai, xây dựng một câu lệnh SQL gọi thủ tục lưu sẵn
6
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Code language: SQL [Structured Query Language] [sql]
5Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Câu lệnh chấp nhận một trình giữ chỗ có tên là
0 để bạn có thể liên kết một giá trị với nó sau nàyCode language: SQL [Structured Query Language] [sql]
CALL get_books_published_after[2010];
Thứ ba, tạo một câu lệnh đã chuẩn bị bằng cách gọi phương thức
1 của phiên bản PDOCode language: SQL [Structured Query Language] [sql]
CALL get_books_published_after[2010];
8Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Thứ tư, liên kết một giá trị với câu lệnh
9Code language: SQL [Structured Query Language] [sql]
USE `bookdb`; DELIMITER $$ USE `bookdb`$$ CREATE PROCEDURE `get_books_published_after` [IN published_year INT] BEGIN SELECT book_id, title, isbn, published_date, name as publisher FROM books b INNER JOIN publishers p ON p.publisher_id = b.publisher_id WHERE year[published_date] > published_year; END$$ DELIMITER ;
Thứ năm, thực hiện lời gọi thủ tục lưu trữ
0Code language: SQL [Structured Query Language] [sql]
INSERT INTO books[title, isbn, published_date,publisher_id] VALUES ['Goodbye to All That','9781541619883','2013-01-05', 3], ['The Mercies','9780316529235','2020-01-28', 3], ['On the Farm','9780763655914','2012-03-27', 2], ['Joseph Had a Little Overcoat','9780140563580','1977-03-15', 2];
Vì thủ tục lưu sẵn trả về một tập kết quả, nên bạn có thể tìm nạp từng hàng trong tập kết quả vào một mảng kết hợp bằng phương thức
2Code language: SQL [Structured Query Language] [sql]
CALL get_books_published_after[2010];