我有一个php调用sqlserver备份脚本。 该脚本如果直接从SSMS执行,则会成功创建备份。但是,当通过php调用时,我可以看到在目标文件夹上创建的文件,但似乎当php完成时,该文件也被删除了。 我在哪里做错了?
PHP:
$strSQL = file_get_contents("archdata.sql");
if (!empty($strSQL)) {
$query=$conn->prepare($strSQL);
if ($query->execute()) {
sleep(5);
echo "1";
} else {
echo "Error: " . $strSQL;
}
}
archdata.sql:
SET @path = 'C:\Data\backups\'
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
SET @fileName = @path + 'ProdDB _' + @fileDate + '.BAK'
BACKUP DATABASE ProdDB TO DISK=@fileName WITH STATS = 1
答案 0 :(得分:0)
<强>解决方案:强>
这是一个适合我的解决方案:
- execurte sqlsrv_configure("WarningsReturnAsErrors", 0);
- remove WITH STATS = 1 from BACKUP DATABASE
<强>解释强>
我使用Apache 2.4,PHP 7.1.12和SQL Server的Microsoft PHP驱动程序(php_sqlsrv_71_ts_x86.dll,版本4.3)进行了测试。唯一的区别是我已经使用SQLSRV驱动程序进行了测试(我的测试环境中无法使用PDO_SQLSRV驱动程序)。
以下是源代码,工作正确:
PHP
<?php
sqlsrv_configure("WarningsReturnAsErrors", 0);
// Connection
$serverName = "127.0.0.1\instance,1433";
$connectionInfo = array(
"UID"=>"user",
"PWD"=>"password",
"Database"=>"ProdDB"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Unable to connect.</br>";
die(var_export(sqlsrv_errors(), true));
}
// Backup database
$strSQL = file_get_contents("archdata.sql");
if (!empty($strSQL)) {
$query = sqlsrv_query($conn, $strSQL);
if ($query === false) {
die(var_export(sqlsrv_errors(), true));
} else {
sleep(5);
echo "Success";
}
}
?>
T-SQL(archdata.sql)
declare
@path varchar(100),
@fileDate varchar(20),
@fileName varchar(140)
SET @path = 'd:\Backup\'
SELECT @fileDate = CONVERT(VARCHAR(20), GETDATE(), 112)
SET @fileName = @path + 'ProdDB_' + @fileDate + '.BAK'
BACKUP DATABASE ProdDB TO DISK=@fileName
不要忘记为“D:\ Backup”文件夹提供必要的权利。