PDO存储过程返回值

时间:2009-06-12 02:55:08

标签: php sql-server stored-procedures pdo

我正在使用返回错误代码的SQL Server存储过程;这是一个非常简单的SP片段。

DECLARE @ret int
BEGIN
SET @ret = 1
RETURN @ret
END

我可以使用:

获取带有mssql扩展名的返回值
mssql_bind($proc, "RETVAL", &$return, SQLINT2);

但是,我无法弄清楚如何在PDO中访问返回值;我不想使用OUT参数,因为已经编写了很多这些存储过程。以下是我目前如何在PHP中调用该过程的示例。

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
$stmt->bindParam(1, 'mystr', PDO::PARAM_STR);
$stmt->bindParam(2, 'mystr2', PDO::PARAM_STR);
$rs = $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

8 个答案:

答案 0 :(得分:3)

Check out MSDN for info on how to correctly bind to this type of call

您的PHP代码可能应该调整为更像这样。这可能只有在你通过ODBC调用时才有效,这实际上是对SQL Server做任何事情的首选方式;在Windows系统上使用SQL Native Client,并在* nix系统上使用FreeTDS ODBC驱动程序:

<?php
  $stmt = $this->db->prepare("{?= CALL usp_myproc}");
  $stmt->bindParam(1, $retval, PDO::PARAM_STR, 32);
  $rs = $stmt->execute();
  $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  echo "The return value is $retval\n";
?>

这里的关键是返回值可以绑定为OUT参数,而不必重新构建存储过程。

答案 1 :(得分:1)

刚遇到同样的问题:

<?php

function exec_sproc($sproc, $in_params)
{
   global $database;

   $stmnt = $database->prepare("EXEC " . $sproc);
   if($stmnt->execute($in_params))
   {
      if($row = $stmnt->fetch())
      {
         return $row[0];
      }
   }

   return -1;
}
?>

答案 2 :(得分:0)

你不能用 SELECT 来返回结果吗? 然后你可以使用数据集(php中的结果集?)来获取它? 我不知道PHP,但在c#中它非常简单 - 使用数据集。

答案 3 :(得分:0)

非常确定PDO :: exec只返回行数..在你的例子中,这将是$ rs

答案 4 :(得分:0)

如果我理解你的问题你不应该调用fetchAll()...

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
$stmt->bindParam(1, $mystr, PDO::PARAM_STR);
$stmt->bindParam(2, $mystr2, PDO::PARAM_STR);
$rs = $stmt->execute();
echo "The return values are: $mystr , and: $mystr2";

PDOStatement::bindParam

答案 5 :(得分:0)

public function callProcedure($sp_name = null, $sp_args = []) {
    try {
        for($i = 0; $i < count($sp_args); $i++) {
            $o[] = '?';
        }

        $args = implode(',', $o);
        $sth = $connection->prepare("CALL $sp_name($args)");

        for($i = 0, $z =1; $i < count($sp_args); $i++, $z++) {
            $sth->bindParam($z, $sp_args[$i], \PDO::PARAM_STR|\PDO::PARAM_INPUT_OUTPUT, 2000);
        }

        if($sth->execute()) {
            return $sp_args;
        }
    } catch (PDOException $e) {
        this->error[] = $e->getMessage();
    }
}

答案 6 :(得分:0)

我有一个类似的问题,能够通过像这样返回执行来解决它...

function my_function(){
    $stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
    $stmt->bindParam(1, 'mystr', PDO::PARAM_STR);
    $stmt->bindParam(2, 'mystr2', PDO::PARAM_STR);
    return $stmt->execute();
}

剩下的就是使用变量调用函数,然后分析所述变量。

$result = my_function();

您现在可以分析$ result的内容以查找所需的信息。请告诉我是否有帮助!

答案 7 :(得分:-1)

尝试$ return_value