Описание : в этой статье вы узнаете, как вызывать хранимые процедуры MySQL с помощью PHP PDO. Мы покажем вам, как вызывать хранимые процедуры, которые возвращают набор результатов, и хранимые процедуры, которые принимают параметры ввода/вывода.
Шаги вызова хранимой процедуры MySQL, которая возвращает набор результатов с помощью PHP PDO, аналогичны запросам данных из таблицы базы данных MySQL с помощью оператора SELECT. Вместо отправки оператора SELECT в базу данных MySQL вы отправляете оператор вызова хранимой процедуры.
Сначала создайте хранимую процедуру с именем GetCustomers() в примере базы данных для демонстрации. Хранимая процедура GetCustomers() извлекает name и credit limit клиентов из таблицы customers.
Следующая хранимая процедура GetCustomers() иллюстрирует логику:
DELIMITER $$ CREATE PROCEDURE GetCustomers() BEGIN SELECT customerName, creditlimit FROM customers; END$$
Во-вторых, создайте новый файл PHP с именем phpmysqlstoredprocedure1.php и следующим кодом:
<!DOCTYPE html> <html> <head> <title>PHP MySQL. Демонстрация хранимых процедур</title> <link rel="stylesheet" href="css/table.css" type="text/css" /> </head> <body> <?php require_once 'dbconfig.php'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // выполнение хранимой процедуры $sql = 'CALL GetCustomers()'; // вызов хранимой процедуры $q = $pdo->query($sql); $q->setFetchMode(PDO::FETCH_ASSOC); } catch (PDOException $e) { die("Error occurred:" . $e->getMessage()); } ?> <table> <tr> <th>Имя клиента</th> <th>Кредитный лимит</th> </tr> <?php while ($r = $q->fetch()): ?> <tr> <td><?php echo $r['customerName'] ?></td> <td><?php echo '$' . number_format($r['creditlimit'], 2) ?> </td> </tr> <?php endwhile; ?> </table> </body> </html>
Все просто, кроме запроса SQL:
CALL GetCustomers();
Мы отправляем оператор, который вызывает хранимую процедуру GetCustomers() , в MySQL. И мы выполняем инструкцию, чтобы получить набор результатов.
В-третьих, протестируйте скрипт в веб-браузере, чтобы увидеть, как она работает.
Немного сложно вызвать хранимую процедуру с параметром OUT. Мы будем использовать хранимую процедуру GetCustomerLevel(), которая принимает номер клиента в качестве входного параметра и возвращает уровень клиента на основе кредитного лимита.
DELIMITER $$ CREATE PROCEDURE GetCustomerLevel( in p_customerNumber int(11), out p_customerLevel varchar(10)) BEGIN DECLARE creditlim double; SELECT creditlimit INTO creditlim FROM customers WHERE customerNumber = p_customerNumber; IF creditlim > 50000 THEN SET p_customerLevel = 'PLATINUM'; ELSEIF (creditlim <= 50000 AND creditlim >= 10000) THEN SET p_customerLevel = 'GOLD'; ELSEIF creditlim < 10000 THEN SET p_customerLevel = 'SILVER'; END IF; END$$
В MySQL мы можем вызвать хранимую процедуру GetCustomerLevel() следующим образом:
CALL GetCustomerLevel(103,@level); SELECT @level AS level;
В PHP мы должны эмулировать эти утверждения:
Давайте посмотрим, как реализована логика в следующем PHP-скрипте:
<?php require_once 'dbconfig.php'; /** * Get customer level * @param int $customerNumber * @return string */ function getCustomerLevel(int $customerNumber) { try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // вызов команды хранимой процедуры $sql = 'CALL GetCustomerLevel(:id,@level)'; // подготовка к выполнению хранимой процедуры $stmt = $pdo->prepare($sql); // передать значение команды $stmt->bindParam(':id', $customerNumber, PDO::PARAM_INT); // выполнение хранимой процедуры $stmt->execute(); $stmt->closeCursor(); // выполнить второй запрос, чтобы получить уровень заказчика $row = $pdo->query("SELECT @level AS level")->fetch(PDO::FETCH_ASSOC); if ($row) { return $row !== false ? $row['level'] : null; } } catch (PDOException $e) { die("Error occurred:" . $e->getMessage()); } return null; } $customerNo = 103; echo sprintf('Customer #%d is %s', $customerNo, getCustomerLevel($customerNo));
Если вы протестируете скрипт в веб-браузере, вы увидите следующий скриншот:
Из этой статьи вы узнали, как вызывать хранимые процедуры MySQL с помощью PHP PDO.