php PDO::FETCH_ASSOC在存储过程中备份后未检测到select
我有一个存储过程,它进行备份,如果出现错误或不是这样的情况,则返回1或0:php PDO::FETCH_ASSOC在存储过程中备份后未检测到select,php,sql,sql-server,pdo,backup,Php,Sql,Sql Server,Pdo,Backup,我有一个存储过程,它进行备份,如果出现错误或不是这样的情况,则返回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'
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解释: 出现错误的原因是
备份数据库
返回信息性消息,并且存储过程有多个结果集。我用一个测试脚本再现了您的错误(尽管在您的问题中,我看不出您是如何准备存储过程的)。您可以尝试以下解决方案之一(我制作了简单的脚本,您可以在函数中轻松实现)
- 调用以获取每个结果集(本例中还有两个调用)
- 在存储过程中使用
参数。在这种情况下,需要获取所有结果集,然后获取输出参数的值输出
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
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:
与问题无关,但是foreach
循环有什么意义?只需编写array\u push($r['r'],$row)代码>。您还可以使用$r['r']=$sth->fetchAll(PDO::FETCH_ASSOC)
以避免while
循环。@Barmar while用于保留属性的名称,如{column1:“value”}。如果我使用$r['r']=$sth->fetchAll(PDO::FETCH_ASSOC)代码>我会得到属性名?当然,你认为你会得到什么?
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
$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;
?>