Summary: in this tutorial, you will learn how to call a MySQL stored procedure using the PHP PDO.
Setting up a stored procedure in MySQL
To execute a statement in the MySQL database, you can use any MySQL client tool e.g., mysql client tool or MySQL Workbench.
First, insert data into the authors
table by executing the following INSERT
statement:
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);
Code language: SQL (Structured Query Language) (sql)
Note that the publishers
table should have rows with id 2 and 3. If it doesn’t, you can run the script that inserts rows into the publishers
table.
Second, execute the following CREATE PROCEDURE
statement to create a new stored procedure called get_books_published_after
:
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)
The stored procedure get_books_published_after
returns all books published after a specific year.
Third, execute the stored procedure to check the result set:
CALL get_books_published_after(2010);
Code language: SQL (Structured Query Language) (sql)
The statement returns the following result set:
+---------+---------------------+---------------+----------------+----------------------+
| book_id | title | isbn | published_date | publisher |
+---------+---------------------+---------------+----------------+----------------------+
| 1 | Goodbye to All That | 9781541619883 | 2013-01-05 | Hachette Book Group |
| 2 | The Mercies | 9780316529235 | 2020-01-28 | Hachette Book Group |
| 3 | On the Farm | 9780763655914 | 2012-03-27 | Penguin/Random House |
+---------+---------------------+---------------+----------------+----------------------+
3 rows in set (0.005 sec)
Code language: plaintext (plaintext)
Calling a MySQL stored procedure from PHP using PDO
The following script illustrates how to call the get_books_published_after
stored procedure:
<?php
$published_year = 2010;
// connect to the database and select the publisher
$pdo = require 'connect.php';
$sql = 'CALL get_books_published_after(:published_year)';
$publishers = [];
$statement = $pdo->prepare($sql);
$statement->bindParam(':published_year', $published_year, PDO::PARAM_INT);
$statement->execute();
$publishers = $statement->fetchAll(PDO::FETCH_ASSOC);
print_r($publishers);
Code language: HTML, XML (xml)
How it works.
First, create a new connection to the MySQL database:
$pdo = require 'connect.php';
Code language: PHP (php)
Second, construct a SQL statement that calls the get_books_published_after
stored procedure:
$sql = 'CALL get_books_published_after(:published_year)';
Code language: PHP (php)
The statement accepts a named placeholder :published_year
so that you can bind a value to it later.
Third, create a prepared statement by calling the prepare()
method of the PDO instance:
$statement = $pdo->prepare($sql);
Code language: PHP (php)
Fourth, bind a value to the statement:
$statement->bindParam(':published_year', $published_year, PDO::PARAM_INT);
Code language: PHP (php)
Fifth, execute the stored procedure call:
$statement->execute();
Code language: PHP (php)
Since the stored procedure returns a result set, you can fetch each row in the result set into an associative array using the fetchAll()
method:
$publishers = $statement->fetchAll(PDO::FETCH_ASSOC);
Code language: PHP (php)
Summary
- Use a prepared statement to call a MySQL stored procedure from PHP.