我需要有关PHP PDO MSSQL存储过程的帮助。
我有一个用两个参数userId
和pwd
调用的存储过程,然后该存储过程返回两个值status
和token
(使用{{1} },以返回值)
当我尝试使用PDO从PHP(版本7.0)调用存储过程时,我没有收到任何返回值
这是PHP代码:
SELECT @status as status, null as token
谁能告诉我该怎么做?
答案 0 :(得分:1)
几乎相同,但是您可以尝试以下方法:
<?php
$host = 'server\instance,port';
$db_name = 'database';
$username = 'user';
$password = 'password';
# Connection
try {
$conn = new PDO("sqlsrv:server=".$host.";Database=".$db_name, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Error connecting to SQL Server: ".$e->getMessage());
}
# Stored procedure
try {
$query = "{call sp_getToken(@userId=?, @pwd=?)}";
$userId = "2465";
$pwd = "460";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $userId, PDO::PARAM_STR);
$stmt->bindParam(2, $pwd, PDO::PARAM_STR);
$stmt->execute();
while($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
echo"</br>";
}
} catch(PDOException $e) {
die("Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;
#
$conn = null;
?>
答案 1 :(得分:0)
存储过程存储在我认为的数据库模式中。
如果将架构添加到查询中,则SQL Server应该知道在哪里查找存储过程。
$query = "EXEC [dbo].[sp_getToken] @userId=:userId, @pwd=:pwd";
当绑定参数时,它也可能有助于定义类型。我在使用SQL Server时遇到问题,其中定义类型的参数解决了该问题。
$stmt->bindValue(':userId', $userId, PDO::PARAM_STR);
$stmt->bindValue(':pwd', $pwd, PDO::PARAM_STR);
还要确保PHP登录数据库的用户在SQL Server中具有执行权限。
在对象资源管理器中,连接到数据库引擎的一个实例,然后展开该实例。
展开数据库,展开该过程所属的数据库,然后展开可编程性。
展开存储过程,右键单击要授予权限的过程,然后单击“属性”。
从“存储过程属性”中,选择“权限”页面。
要向用户,数据库角色或应用程序角色授予权限,请单击搜索。
在“选择用户或角色”中,单击“对象类型”以添加或清除所需的用户和角色。
单击浏览以显示用户或角色列表。选择应授予权限的用户或角色。
在“显式权限”网格中,选择要授予指定用户或角色的权限。有关权限的说明,请参阅权限(数据库引擎)。
选择授予表示授予被授予者指定的权限。 选择“授予方式”表示被授予者还将能够将指定的权限授予其他主体。
答案 2 :(得分:0)
问题解决:)
通过将“ SET NOCOUNT ON”添加到我的存储过程中。显然,问题与事实有关,存储过程返回两个结果,第一个结果包含受影响的行数,第二个结果包含实际数据。
感谢大家尝试帮助我:)