PHP PDO MSSQL SP-无返回值

时间:2018-08-03 13:09:29

标签: php sql-server stored-procedures pdo

我需要有关PHP PDO MSSQL存储过程的帮助。

我有一个用两个参数userIdpwd调用的存储过程,然后该存储过程返回两个值statustoken(使用{{1} },以返回值)

当我尝试使用PDO从PHP(版本7.0)调用存储过程时,我没有收到任何返回值

这是PHP代码:

SELECT @status as status, null as token

谁能告诉我该怎么做?

3 个答案:

答案 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中具有执行权限。

https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/grant-permissions-on-a-stored-procedure?view=sql-server-2017

  

在对象资源管理器中,连接到数据库引擎的一个实例,然后展开该实例。

     

展开数据库,展开该过程所属的数据库,然后展开可编程性。

     

展开存储过程,右键单击要授予权限的过程,然后单击“属性”。

     

从“存储过程属性”中,选择“权限”页面。

     

要向用户,数据库角色或应用程序角色授予权限,请单击搜索。

     

在“选择用户或角色”中,单击“对象类型”以添加或清除所需的用户和角色。

     

单击浏览以显示用户或角色列表。选择应授予权限的用户或角色。

     

在“显式权限”网格中,选择要授予指定用户或角色的权限。有关权限的说明,请参阅权限(数据库引擎)。

     

选择授予表示授予被授予者指定的权限。    选择“授予方式”表示被授予者还将能够将指定的权限授予其他主体。

答案 2 :(得分:0)

问题解决:)

通过将“ SET NOCOUNT ON”添加到我的存储过程中。显然,问题与事实有关,存储过程返回两个结果,第一个结果包含受影响的行数,第二个结果包含实际数据。

感谢大家尝试帮助我:)