悠悠楠杉
使用PHP连接SQLServer执行存储过程的完整指南
使用PHP连接SQLServer执行存储过程的完整指南
关键词:PHP SQLServer、存储过程调用、PDO扩展、数据库操作、参数化查询
描述:本文详细介绍如何通过PHP连接SQL Server数据库并调用存储过程,包含环境配置、参数绑定和结果处理的全流程实战教程。
一、环境准备与基础配置
在开始之前,确保你的开发环境满足以下条件:
1. 安装PHP 7.0+(推荐7.4或8.0+版本)
2. SQL Server 2012+数据库服务已启动
3. 已启用SQLSRV或PDO_SQLSRV扩展
配置步骤:
php
// 在php.ini中启用扩展(二选一)
extension=php_sqlsrv.dll // SQLSRV扩展
extension=php_pdo_sqlsrv.dll // PDO扩展
注意:Linux系统需使用
pecl install pdo_sqlsrv
安装驱动
二、两种连接方式对比
方法1:使用SQLSRV扩展(微软官方驱动)
php
$serverName = "localhost\SQLEXPRESS";
$connectionInfo = array(
"Database" => "YourDB",
"UID" => "username",
"PWD" => "password"
);
$conn = sqlsrvconnect($serverName, $connectionInfo);
if (!$conn) {
die(printr(sqlsrv_errors(), true));
}
方法2:使用PDO(推荐跨数据库方案)
php
try {
$conn = new PDO(
"sqlsrv:Server=localhost;Database=YourDB",
"username",
"password"
);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
对比建议:PDO方式更具通用性,且支持参数化查询防SQL注入。
三、执行存储过程的核心步骤
假设我们有个获取用户信息的存储过程:
sql
CREATE PROCEDURE sp_get_user
@user_id INT,
@status BIT OUTPUT
AS
BEGIN
SELECT * FROM users WHERE id = @user_id
SET @status = 1
END
3.1 使用PDO调用方式
php
try {
$userId = 123;
$stmt = $conn->prepare("{CALL spgetuser(?, ?)}");
// 绑定输入参数
$stmt->bindParam(1, $userId, PDO::PARAM_INT);
// 注册输出参数
$status = null;
$stmt->bindParam(2, $status, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 1);
$stmt->execute();
// 获取结果集
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "状态码: ".$status;
print_r($results);
} catch (PDOException $e) {
echo "执行失败: ".$e->getMessage();
}
3.2 使用SQLSRV扩展调用
php
$params = array(
array($userId, SQLSRVPARAMIN),
array(&$status, SQLSRVPARAMOUT)
);
$stmt = sqlsrvquery($conn, "{CALL spgetuser(?, ?)}", $params);
if ($stmt === false) {
die(printr(sqlsrv_errors(), true));
}
// 获取结果
while ($row = sqlsrvfetcharray($stmt, SQLSRVFETCHASSOC)) {
print_r($row);
}
echo "状态码: ".$status;
四、常见问题解决方案
中文乱码问题:
php $conn->query("SET NAMES 'UTF8'"); // PDO方式 // 或连接时指定CharacterSet $connectionInfo["CharacterSet"] = "UTF-8";
超时处理:
php $conn->setAttribute(PDO::ATTR_TIMEOUT, 30);
事务控制:
php try { $conn->beginTransaction(); // 执行多个存储过程... $conn->commit(); } catch (Exception $e) { $conn->rollBack(); }
五、性能优化建议
- 对于频繁调用的存储过程,建议使用
PDO::prepare()
预编译 - 大数据量结果集使用
sqlsrv_fetch_array()
逐行处理 - 输出参数较多时,建议使用关联数组绑定:
php $stmt->bindParam(':output_param', $value, PDO::PARAM_STR, 100);