当前位置: 首页 > 面试题库 >

php PDO :: FETCH_ASSOC在存储过程中备份后未检测到选择

步炯
2023-03-14
问题内容

我有一个存储过程,可以进行备份,然后在出现错误或不是这样的情况下返回1或0:

Create procedure [dbo].[sp_IWBackup]
as
begin
declare @route varchar(500),  @answer int = 0
set nocount on
set @route = 'I:\route'+(replace((replace(convert(varchar, getdate(), 21),':',';')),'.',';'))+'Full.bak'
set @answer = 1
begin try
backup database databasename to disk = @route
end try
begin catch
set @answer = 0
end catch
select @answer as answer
end

在sql中,它可以正常工作并返回@answer的正确值。

在php中,当我尝试获取查询的执行时,它什么也找不到。

public function ExecuteSelectAssoc($sth)
    {
        $r=array('data'=>false,
        'error'=>false,
        'r'=>array());
        try {
            $sth->execute();
            while ($row=$sth->fetch(PDO::FETCH_ASSOC)) {  //error here
                $r['data'] = true;
                $keys = array_keys($row);
                $tmp = array();
                foreach($keys as $key)
                {
                    $tmp[$key] = $row[$key];
                }
                array_push($r['r'], $tmp);
            }
        } catch (PDOException $e) {
            $r['error']=true;
            $r['r'] = $e->getMessage();
        }
        return $r;
    }

PDO的属性

public function connectSqlSrv(){
        try{
            $dbCnx = new PDO("sqlsrv:Server=$this->server;Database=$this->db", $this->usr, $this->psw);
            $dbCnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $dbCnx;
        }
        catch(PDOException $e){
            echo $e;
            die();
            return null;
        }
    }

我得到这个错误:

r:“ SQLSTATE [IMSSP]:查询的活动结果不包含任何字段。”

我希望:答案:1


问题答案:

说明:

错误的原因是BACKUP DATABASE返回参考消息,并且您的存储过程具有多个结果集。我用测试脚本重现了您的错误(尽管在您的问题中我看不到您如何准备存储过程)。您可以尝试以下解决方案之一(我编写了简单的脚本,可以轻松地在函数中实现这些脚本)。

  • 调用PDOStatement :: nextRowset来获取每个结果集(在这种情况下,需要再进行两次调用)

  • OUTPUT在您的存储过程中使用参数。在这种情况下,您需要获取所有结果集,然后再获取输出参数的值。

解决方案1:

存储过程:

create procedure [dbo].[sp_IWBackup]
as
begin
    declare 
       @route varchar(500),  
       @answer int = 0
    set nocount on

    set @route = 'I:\route'+(replace((replace(convert(varchar, getdate(), 21),':',';')),'.',';'))+'Full.bak'
    set @answer = 1

    begin try
        backup database databasename to disk = @route
    end try
    begin catch
        set @answer = 0
    end catch

    select @answer as answer
end

PHP:

<?php
$server   = 'server\instance,port';
$database = 'database';
$uid      = 'uid';
$pwd      = 'pww';

try {
    $dbh = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die("Error connecting to SQL Server. ".$e->getMessage());
}

try {
    $sql = "{CALL sp_IWBackup}";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $stmt->nextRowset();
    $stmt->nextRowset();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        foreach ($row as $key => $value) {
            echo $key.": ".$value."<br>";
        };
    }
} catch( PDOException $e ) {
    die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;

$dbh = null;
?>

解决方案2:

存储过程

create procedure [dbo].[sp_IWBackupOut]
    @answer int OUTPUT
as
begin
    declare 
        @route varchar(500)
    set nocount on

    set @route = 'I:\route'+(replace((replace(convert(varchar, getdate(), 21),':',';')),'.',';'))+'Full.bak'
    set @answer = 1

    begin try
        backup database databasename to disk = @route
    end try
    begin catch
        set @answer = 0
    end catch
end

PHP:

<?php
$server   = 'server\instance,port';
$database = 'database';
$uid      = 'uid';
$pwd      = 'pww';

try {
    $dbh = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die("Error connecting to SQL Server. ".$e->getMessage());
}

try {
    $sql = "{CALL sp_IWBackupOut (?)}";
    $stmt = $dbh->prepare($sql);
    $answer = -1;
    $stmt->bindParam(1, $answer, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
    $stmt->execute();
    do {
    } while ($stmt->nextRowset());
    echo "answer: ".$answer;
} catch( PDOException $e ) {
    die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;

$dbh = null;
?>


 类似资料:
  • 我正在使用准备好的语句jdbc模板运行一个存储过程: 我的存储过程基本上是一个存储过程调用另外两个存储过程。 我遇到的问题是,如果在存储过程的第一条语句之后有一个异常,那么该异常不会返回到jdbc模板,所以看起来我的存储过程对我的Java代码起作用,即使它没有,这显然是有问题的。 有没有一种方法可以手动检查存储过程的输出或者使所有可能的异常冒泡到Java?

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 我正试图通过遵循本教程,使用GitHub操作构建docker映像并将其推送到Amazon ECR 我正在尝试为此repo设置GitHub操作,因此我在<代码>中创建了一个新的工作流。github/workflows目录。 DockerFile已成功创建并生成。 现在,在创建

  • 在本文中,我们将学习如何将PostgreSQL备份存储到MinIO Server。 1. 前提条件 从这里下载并安装mc。 从这里下载并安装MinIO Server。 PostgreSQL官方文档. 2. 配置步骤 MinIO服务正在使用别名m1运行。从MinIO客户端完整指南MinIO客户端完全指南了解详情。PostgreSQL备份存储在pgsqlbkp目录下。 创建一个存储桶。 mc mb m

  • 在本文中,我们将学习如何将MongoDB备份存储到MinIO Server。 1. 前提条件 从这里下载并安装mc。 从这里下载并安装MinIO Server。 MongoDB官方文档. 2. 配置步骤 MinIO服务正在使用别名minio1运行。从MinIO客户端完整指南MinIO客户端完全指南了解详情。MongoDB备份存储在mongobkp目录下。 创建一个存储桶。 mc mb minio1

  • 在本文中,我们将学习如何将MySQL备份存储到MinIO Server。 1. 前提条件 从这里下载并安装mc。 从这里下载并安装MinIO Server。 MySQL官方文档 2. 配置步骤 MinIO服务正在使用别名m1运行。从MinIO客户端完整指南MinIO客户端完全指南了解详情。MySQL备份存储在mysqlbkp目录下。 创建一个存储桶。 mc mb m1/mysqlbkp Bucke