如何使用PDO存储SQL Server函数或存储过程的返回结果
存储过程返回值获取方案
你需要先确认spf_SYS_ValidateUser的返回逻辑,对应不同场景写代码即可:
场景1:存储过程通过SELECT返回结果集
如果存储过程内部用SELECT输出验证结果(比如返回用户ID、权限等单行数据),在execute判断成功后直接调用PDO的fetch方法取值:
if(!$stmt->execute()) { $stmt = null; header("location: ../index.php?error=stmtfailed"); exit(); } // 新增代码从这里开始 // 取单行结果,返回关联数组格式 $validateResult = $stmt->fetch(PDO::FETCH_ASSOC); // 若返回多行数据改用fetchAll // $validateResult = $stmt->fetchAll(PDO::FETCH_ASSOC); // 释放语句资源 $stmt = null;
此时$validateResult就是存储过程返回的结果数据,可直接按数组键名读取对应字段。
场景2:存储过程通过RETURN关键字返回状态码
如果存储过程用RETURN返回整数状态(比如返回1验证通过、0验证失败),需要修改原绑定逻辑,提前绑定返回值参数:
protected function checkUser($uid, $password) { // 修改预编译语句,用占位符接收RETURN值 $stmt = $this->connect()->prepare('EXEC ? = spf_SYS_ValidateUser ?,?'); // 绑定返回值参数,指定输入输出类型和长度 $stmt->bindParam(1, $returnCode, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 4); $stmt->bindParam(2, $uid); $stmt->bindParam(3, $password); if(!$stmt->execute()) { $stmt = null; header("location: ../index.php?error=stmtfailed"); exit(); } // 关闭游标确保返回值正常读取 $stmt->closeCursor(); $stmt = null; // $returnCode就是存储过程的RETURN返回值 }
场景3:存储过程通过OUTPUT参数返回结果
如果存储过程定义了OUTPUT输出参数传结果,绑定对应参数时加上PDO::PARAM_INPUT_OUTPUT标记即可,示例:
假设存储过程定义为CREATE PROC spf_SYS_ValidateUser @uid varchar(50), @pwd varchar(255), @isValid bit OUTPUT,对应代码如下:
$stmt = $this->connect()->prepare('EXEC spf_SYS_ValidateUser ?,?,?'); $stmt->bindParam(1, $uid); $stmt->bindParam(2, $password); $stmt->bindParam(3, $isValid, PDO::PARAM_BIT | PDO::PARAM_INPUT_OUTPUT); $stmt->execute(); $stmt->closeCursor(); // $isValid变量就是输出参数的返回值
注意事项
- 如果存储过程返回多个结果集,可调用
$stmt->nextRowset()切换到下一个结果集后再执行fetch操作。 - 操作完后主动调用
closeCursor释放游标,可避免SQL Server PDO驱动出现游标占用报错。
内容的提问来源于stack exchange,提问作者Wimpie Norman
相关产品推荐
相关产品推荐

