如何在 PHP 中使用 MySQL 存储过程?

如何在 PHP 中使用 MySQL 存储过程?
最新回答
说不尽的伤ミ

2023-05-31 05:21:18

在 PHP 中使用 MySQL 存储过程可以通过 PDOMySQLi 扩展实现。以下是详细步骤和示例代码:

1. 使用 PDO 扩展调用存储过程<?php// 连接数据库$conn = new PDO('mysql:host=localhost;dbname=database_name;charset=utf8', 'username', 'password');// 设置存储过程名称(带参数示例)$procedure_name = 'get_customer_by_id';$customer_id = 123;// 准备调用语句(使用命名参数或问号占位符)$stmt = $conn->prepare("CALL $procedure_name(:id)");$stmt->bindParam(':id', $customer_id, PDO::PARAM_INT);// 执行存储过程$stmt->execute();// 处理结果集(多结果集需循环获取)do { $result = $stmt->fetchAll(PDO::FETCH_ASSOC); if ($result) { print_r($result); // 输出结果 }} while ($stmt->nextRowset()); // 处理多结果集// 关闭连接$conn = null;?>关键点
  • 参数绑定:使用 bindParam() 或 bindValue() 传递参数,避免 SQL 注入。
  • 多结果集:存储过程可能返回多个结果集,需用 nextRowset() 遍历。
2. 使用 MySQLi 扩展调用存储过程<?php// 连接数据库$mysqli = new mysqli('localhost', 'username', 'password', 'database_name');if ($mysqli->connect_error) { die("连接失败: " . $mysqli->connect_error);}// 设置存储过程名称和参数$procedure_name = 'get_customer_by_id';$customer_id = 123;// 调用存储过程$result = $mysqli->query("CALL $procedure_name($customer_id)");// 处理结果集(多结果集需多次获取)while (true) { $data = []; while ($row = $result->fetch_assoc()) { $data[] = $row; } if (!empty($data)) { print_r($data); // 输出当前结果集 } // 检查是否还有更多结果集 if (!$mysqli->more_results()) break; if (!$mysqli->next_result()) die("获取结果集失败: " . $mysqli->error); $result = $mysqli->store_result(); // 获取下一个结果集}// 关闭连接$mysqli->close();?>关键点
  • 多结果集处理:通过 more_results() 和 next_result() 遍历。
  • 错误处理:检查 next_result() 的返回值,避免静默失败。
3. 实战案例:带输入/输出参数的存储过程

假设存储过程 update_customer_status 接收输入参数 customer_id 和输出参数 status:

<?php// PDO 示例(输出参数需额外处理)$conn = new PDO('mysql:host=localhost;dbname=database_name', 'username', 'password');$stmt = $conn->prepare("CALL update_customer_status(:id, @status)");$stmt->bindParam(':id', $customer_id, PDO::PARAM_INT);$stmt->execute();// 获取输出参数$result = $conn->query("SELECT @status AS status")->fetch(PDO::FETCH_ASSOC);echo "状态: " . $result['status'];// MySQLi 示例$mysqli = new mysqli('localhost', 'username', 'password', 'database_name');$mysqli->query("CALL update_customer_status($customer_id, @status)");$result = $mysqli->query("SELECT @status AS status")->fetch_assoc();echo "状态: " . $result['status'];?>4. 注意事项
  1. 安全性:始终使用参数化查询(如 prepare + bindParam)防止 SQL 注入。
  2. 错误处理:检查连接和执行错误(如 PDO::errorInfo() 或 mysqli_error)。
  3. 资源释放:处理完结果集后调用 close() 或 null 释放资源。
  4. 事务支持:存储过程内的事务需在 PHP 中通过 beginTransaction() 等管理。
总结
  • PDO 更通用,支持多数据库,适合新项目。
  • MySQLi 专为 MySQL 设计,性能略优,但 API 较复杂。
  • 存储过程适合复杂业务逻辑,但需确保 PHP 和 MySQL 版本兼容。

通过以上方法,可以高效地在 PHP 中调用 MySQL 存储过程并处理结果。