TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

使用PHP连接SQLServer执行存储过程的完整指南

2025-07-15
/
0 评论
/
3 阅读
/
正在检测是否收录...
07/15

使用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;


四、常见问题解决方案

  1. 中文乱码问题
    php $conn->query("SET NAMES 'UTF8'"); // PDO方式 // 或连接时指定CharacterSet $connectionInfo["CharacterSet"] = "UTF-8";

  2. 超时处理
    php $conn->setAttribute(PDO::ATTR_TIMEOUT, 30);

  3. 事务控制
    php try { $conn->beginTransaction(); // 执行多个存储过程... $conn->commit(); } catch (Exception $e) { $conn->rollBack(); }


五、性能优化建议

  1. 对于频繁调用的存储过程,建议使用PDO::prepare()预编译
  2. 大数据量结果集使用sqlsrv_fetch_array()逐行处理
  3. 输出参数较多时,建议使用关联数组绑定:
    php $stmt->bindParam(':output_param', $value, PDO::PARAM_STR, 100);
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/32782/(转载时请注明本文出处及文章链接)

评论 (0)