gpt4 book ai didi

php - 使用 PHP 备份 SQL Server 数据库

转载 作者:行者123 更新时间:2023-12-05 06:11:23 26 4
gpt4 key购买 nike

我正在尝试使用 PHP 备份调用存储过程的 MS SQL 数据库。

当我在 SSMS 上执行 de SP 时,一切正常。但是,当我从 PHP 脚本调用它时,我可以在备份文件夹中看到一个“.bak”,并且在 PHP 完成处理后,BackUp.bak 文件立即消失。

这是存储过程:

DECLARE @date VARCHAR(10)
SET @date = (SELECT date FROM tbl_date)

Declare @fileName VARCHAR(100)
SET @fileName = ('C:\db_backup\BackUp_' + @date + '.bak')

BACKUP DATABASE DbName
TO DISK = @fileName
WITH FORMAT,
MEDIANAME = 'SQLServerBackups',
NAME = 'Full Backup of DbName';

下面是我调用SP的PHP代码:

$serverName = "server";
$connectionInfo = array( "Database"=>"DbName", "UID"=>"UserName", "PWD"=>"P@ssword", "CharacterSet"=>"UTF-8", "ReturnDatesAsStrings" => "false");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

$BackupDB = "Exec DBBackup";
sqlsrv_query($conn, $BackupDB);

我正在运行 Apache 2.4.46 和 SQL Server Express 2019。

我的目标是使用 PHP 创建一个“.bak”文件。

我尝试使用 SP,因为原始代码是用经典 ASP 编写的,并且以这种方式完美运行。

我乐于尝试不同的方法。

谢谢。

最佳答案

解释:

您正在使用 PHP Driver for SQL Server,因此以下解释是解决您的问题的附加选项:

  • 看来这个问题可能是一个特定于驱动程序的问题。 SQL Server 使用批处理创建的结果集填充连接的输出缓冲区 - 有关受影响行数的信息(例如,在 INSERT\DELETE\UPDATE 语句的情况下)或进度状态(从 BACKUP\RESTORE DATABADE 语句返回)。这些结果集必须由 PHP 脚本处理。这种行为似乎是设计使然,PHP 脚本应该刷新所有待处理的结果集。获取结果集后,SQL Server 完成批处理的执行。您需要使用的适当函数\方法是 sqlsrv_next_result()(对于 SQLSRV 版本的驱动程序)和 PDOStatement::nextRowset()(对于 PDO_SQLSRV 版本的驱动程序).
  • 对于 SQLSRV 版本的驱动程序,您需要使用 sqlsrv_configure("WarningsReturnAsErrors", 0); 更改错误和警告处理。

示例:

我能够从问题中重现问题,以下示例是可行的解决方案:

使用 SQLSRV 版本的驱动程序:

<?php
// Server information
$server = "server\instance,port";
$database = "database";
$uid = "username";
$pwd = "password";

// Configuration
sqlsrv_configure("WarningsReturnAsErrors", 0);

// Connection
$cinfo = array(
"UID" => $uid,
"PWD" => $pwd,
"Database" => $database
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
echo "Unable to connect.";
die( print_r( sqlsrv_errors(), true));
}

// Statement
$sql = "
DECLARE @date VARCHAR(19)
SET @date = CONVERT(VARCHAR(19), GETDATE(), 126)
SET @date = REPLACE(@date, ':', '-')
SET @date = REPLACE(@date, 'T', '-')

DECLARE @fileName VARCHAR(100)
SET @fileName = ('d:\backup\BackUp_' + @date + '.bak')

BACKUP DATABASE dbname
TO DISK = @fileName
WITH
FORMAT,
STATS = 1,
MEDIANAME = 'SQLServerBackups',
NAME = 'Full Backup of dbname';
";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
echo "Unable to execute query.";
die( print_r( sqlsrv_errors(), true));
}

// Clear buffer
while (sqlsrv_next_result($stmt) != null){};
echo "Success";

// End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

使用 PDO_SQLSRV 版本的驱动程序:

<?php
// Server information
$server = "server\instance,port";
$database = "database";
$uid = "username";
$pwd = "password";

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

// Statement
$sql = "
DECLARE @date VARCHAR(19)
SET @date = CONVERT(VARCHAR(19), GETDATE(), 126)
SET @date = REPLACE(@date, ':', '-')
SET @date = REPLACE(@date, 'T', '-')

DECLARE @fileName VARCHAR(100)
SET @fileName = ('d:\backup\BackUp_' + @date + '.bak')

BACKUP DATABASE dbname
TO DISK = @fileName
WITH
FORMAT,
STATS = 1,
MEDIANAME = 'SQLServerBackups',
NAME = 'Full Backup of dbname';
";
try {
$stmt = $conn->prepare($sql);
$stmt->execute();
} catch (PDOException $e) {
die ("Error executing query. ".$e->getMessage());
}

// Clear buffer
try {
while ($stmt->nextRowset() != null){};
echo "Success";
} catch (PDOException $e) {
die ("Error executing query. ".$e->getMessage());
}

// End
$stmt = null;
$conn = null;
?>

关于php - 使用 PHP 备份 SQL Server 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64018598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com