PHP MySQL. Вызов хранимых процедур MySQL

Описание : в этой статье вы узнаете, как вызывать хранимые процедуры 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
Немного сложно вызвать хранимую процедуру с параметром 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 мы должны эмулировать эти утверждения:
- Сначала нам нужно выполнить хранимую процедуру GetCustomerLevel().
- Во-вторых, чтобы получить уровень клиента, нам нужно запросить его из переменной @level. Важно, что мы должны вызвать метод closeCursor() из объекта PDOStatement для того, чтобы выполнить следующую инструкцию SQL.
Давайте посмотрим, как реализована логика в следующем 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.
