【问题标题】:PHP PDO MSSQL SP - no return valuesPHP PDO MSSQL SP - 无返回值
【发布时间】:2019-01-11 09:27:40
【问题描述】:

我需要一些关于 PHP PDO MSSQL 存储过程的帮助。

我有一个存储过程,它使用两个参数userIdpwd 调用,然后存储过程返回两个值statustoken(在存储过程中使用SELECT @status as status, null as token 返回值)

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

这是 PHP 代码:

$conn = new PDO("sqlsrv:server=".$host.";Database=".$db_name, 
$username,$password);

$userId = "2465";   
$pwd = "460";

$query = "exec sp_getToken @userId=:userId, @pwd=:pwd";
$stmt = $conn->prepare($query);

$stmt->bindValue(':userId', $userId);
$stmt->bindValue(':pwd', $pwd);

$stmt->execute();

while($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
    var_dump($result);
}

谁能告诉我该怎么做?

【问题讨论】:

  • 简单;你从未执行过查询。
  • 它一定是在我有的副本中滑倒了 $stmt->execute();在最后一个 bindValue 和 while 循环之间
  • 然后更新您的帖子并检查错误和日志。你没有这样做。
  • TBH,我不知道是什么导致您的代码无法正常工作。您能否检查php.net/manual/en/pdo.error-handling.phpphp.net/manual/en/function.error-reporting.php 的错误(设置为捕获和显示)以及尝试将bindValue() 更改为bindParam() 的可能性。
  • 您能否再次更新您的问题(请)关于架构是什么、列类型和示例值?它可能会在很多方面有所帮助。如果您觉得这无关紧要,请参阅下面的答案。

标签: php sql-server stored-procedures pdo


【解决方案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;
?>

【讨论】:

  • 感谢您的回复-它并没有直接解决问题,但是通过运行代码,我收到了另一条错误消息(执行存储过程时出错:SQLSTATE [IMSSP]:查询的活动结果不包含任何字段。) - 这确实帮助我找到了问题的解决方案。问题是存储过程返回的结果包含受影响的行数作为第一个结果,然后是实际结果。通过在我的存储过程中添加“SET NOCOUNT ON”,第一行被跳过。
  • @hedemann 很高兴您找到了解决问题的方法!
【解决方案2】:

问题解决了:)

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

感谢大家尝试帮助我:)

【讨论】:

    【解决方案3】:

    存储过程存储在我相信的数据库架构中。

    如果您将架构添加到查询中,SQL 服务器应该知道在哪里“查找”您的存储过程。

    $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

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

    展开Databases,展开过程所属的数据库,然后展开Programmability。

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

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

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

    在选择用户或角色中,单击对象类型以添加​​或清除您想要的用户和角色。

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

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

    选择授予表示被授予者将获得指定的权限。 选择 Grant With 表示被授权者也可以将指定的权限授予其他委托人。

    【讨论】:

    • 我同意通过添加类型作为参数会有所帮助,但是我们不知道它们的架构是什么样的,或者列类型和各自的值是什么。用户 id one 很可能是 int 类型,但密码列的类型值得怀疑。我觉得这个问题缺乏很多细节。可能的文本类型的 int 类型将在 PARAM_INT 上失败,只是说
    • 是的,但我们可以依靠 OP 来定义正确的类型。密码字段将是 nvarchar 类型,因此我认为是字符串,但永远不知道。但如果它是一个 int 或其他东西,OP 将不得不自己修改它。
    • 我已经发布了一条评论请求它。我稍后会回来看看这是如何解开的;-) 干杯
    • userId 和 pwd 的类型为 varchar(50)(旧系统) - 我现在已将“PDO::PARAM_STR”添加到两个 bindValue - 结果仍然相同
    • 是的 - 但应该在 "$conn = new PDO("sqlsrv:server=".$host.";Database=".$db_name, $username,$password); "做同样的工作
    猜你喜欢
    • 2014-12-10
    • 2014-03-20
    • 2012-03-31
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2016-02-10
    • 2016-10-19
    相关资源
    最近更新 更多