PHP MySQL:调用MySQL存储过程
简介:在本教程中,您将学习如何使用PHP PDO调用MySQL存储过程。
我们将向您展示如何调用返回结果集的存储过程以及接受输入/输出参数的存储过程。
调用返回结果集的存储过程
调用使用PHP PDO返回结果集的MySQL存储过程的步骤类似于使用SELECT语句从MySQL数据库表查询数据。
您无需发送SELECT语句到MySQL数据库,而是发送存储过程调用语句。
首先,在示例数据库中创建一个名为GetCustomers()的存储过程进行演示。
GetCustomers()存储过程从客户表中检索客户的名称和信用额度。
以下GetCustomers()存储过程说明了逻辑:
DELIMITER $$
CREATE PROCEDURE GetCustomers()
BEGIN
SELECT customerName, creditlimit
FROM customers;
END$$
其次,使用以下代码创建一个名为phpmysqlstoredprocedure1.php的新PHP文件:
<!DOCTYPE html>
<html>
<head>
<title>PHP MySQL Stored Procedure Demo 1</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);
// execute the stored procedure
$sql = 'CALL GetCustomers()';
// call the stored procedure
$q = $pdo->query($sql);
$q->setFetchMode(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("Error occurred:" . $e->getMessage());
}
?>
<table>
<tr>
<th>Customer Name</th>
<th>Credit Limit</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。
然后我们执行该语句以获取结果集。
第三,在Web浏览器中测试脚本以查看其工作方式。
您可以通过以下链接下载脚本:
下载PHP MySQL存储过程源代码
使用OUT参数调用存储过程
使用OUT参数调用存储过程有点棘手。
我们将使用GetCustomerLevel()存储过程,该过程接受客户编号作为输入参数,并根据信用额度返回客户级别。
查看MySQL IF语句教程以获取有关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进行查询。
重要的是,我们必须调用PDOStatement对象的closeCursor()方法才能执行下一条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);
// calling stored procedure command
$sql = 'CALL GetCustomerLevel(:id,@level)';
// prepare for execution of the stored procedure
$stmt = $pdo->prepare($sql);
// pass value to the command
$stmt->bindParam(':id', $customerNumber, PDO::PARAM_INT);
// execute the stored procedure
$stmt->execute();
$stmt->closeCursor();
// execute the second query to get customer's level
$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));
如果在Web浏览器中测试脚本,将看到以下屏幕截图:
您可以通过以下链接下载脚本:
下载带有OUT参数源代码的PHP MySQL存储过程
在本教程中,您学习了如何使用PHP PDO调用MySQL存储过程。

