使用PDO PHP自动化mysqldump,是否可行?

3
我正在尝试制作一个简单的网页,其中包括两个按钮,当其中一个被按下时,将会执行数据库的转储 (mysqldump),而另一个则会将其还原 (导入)。
我将尝试在一个开发环境中实现这一点。由于没有集中式服务器,在某些情况下,我会根据每天的情况从几台不同的电脑上进行工作。至于脚本本身(即代码),我只需将其与 SpiderOak 同步,并尝试使 mysqldump 在不同电脑之间实现同步。
index.html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>Herramienta Back Up/Restore DataBase ;)</title>
    <link rel="stylesheet" type="text/css" href="Babifu.css">
</head>
<body>
    <center>
        <img class="thumb" src="http://lorempixel.com/g/450/370/nightlife/"/><br /><br />
        <form id="me1" action="backup.php" method="post"><br /><br /><br />
            <input type="submit" value="Backup database" />
        </form>
        <form id="me2" action="restore.php" method="post"><br /><br /><br /><br /><br /><br />
            <input type="submit" value="Importar" />
        </form>
        <div class="clear"></div>
    </center>
</body>
</html>

backup.php

<?php
include('conection.php');
try {
    $qls = "mysqldump --default-character-set=UTF8 --single-transaction -u root -p[Paswordofthedatabase] u739462586_dtren > restoresync.sql";
    $stmt = $con->prepare($qls);
    $rslt = $stmt->execute();
    echo "Base de Datos Salvadas Correctamente";
} catch(PDOException $e) {
    echo $e->getMessage;
}
?>

restore.php

<?php
include('conection.php');
try {
    $qls = "mysql -u root -p[Paswordofthedatabase] < restoresync.sql";
    $stmt = $con->prepare($qls);
    $rslt = $stmt->execute();
    echo"Base de Datos Restaurados/Importados Correctamente";
} catch(PDOException $e) {
    echo $e->getMessage;
}
?>

问题在于,它无法正常运行,控制台没有显示任何错误消息,PHP也是如此。
通过查询是否可能实现这一点?我该怎么做?这段代码有什么问题?
还有没有办法确保备份将创建在特定文件夹中?非常感谢您的任何建议、评论、澄清请求、问题或答案。

5
啊,mysqldumpmysql是控制台命令,而不是SQL语句。用exec()或类似的方法运行它们。最好指定完整路径,比如/usr/bin/mysqldump - halfer
你需要搜索如何在控制台中以自动化方式提供密码(或者可能有一个控制台选项,我忘了)。我认为Ubuntu使用一种实用程序来获取密码以进行自动化的、无需控制台的操作。 - halfer
@halfer 有没有什么 SQL 的替代方案或其他的建议?我会尝试通过 exec() 来实现,或者您可以给一个示例再次尝试通过 exec() 实现吗?我在 Windows 上。提前感谢。 - user57129
@halfter 不用在意,我发现一直在尝试使用execute(),而不是exec(),现在它可以工作了。如果你想把它设置为正确答案,我会选择它,以获得积分。谢谢,它现在可以工作了! - user57129
只需在现有命令周围使用 exec()。我刚刚搜索了一下,看起来你可以在控制台上提供密码 - 只要注意其他用户可能会在任务管理器中看到它。 - halfer
2
下面是与编程相关的内容,请将其从英文翻译成中文。请只返回翻译后的文本:(现在下面有一条回答,请随意接受它。) - halfer
1个回答

3

这些不是MySQL查询语句,而是通过终端执行的命令。 使用以下命令来执行并获取完整输出:

$dump_output = shell_exec("mysqldump --opt --default-character-set=UTF8 --single-transaction --protocol=TCP -u --user=root --password=dbpassword --host=localhost DB_NAME > restoresync.sql");
echo $dump_output; /* Your output of the dump command */

$restore_output = shell_exec("mysql -u root -p[Paswordofthedatabase] < restoresync.sql");
echo $restore_output; /* Your output of the restore command */

你可以像halfer所提到的那样,使用exec()来替代shell_exec()

它们之间的区别在于:shell_exec()会返回完整的输出结果,而exec()只会返回输出结果的最后一行。


使用exec()和shell_exec(),它们都只创建一个大小为0kb的.sql文件,然后我无法使用它进行导入,有什么建议可以解决这个问题吗? 此外,在两种情况下都没有输出信息,至少在网页上没有,有什么建议吗?我知道我说它已经准备好了,但显然它并没有,任何想法、评论或问题都将不胜感激,提前致谢。 - user57129
使用方法: mysqldump [OPTIONS] 数据库 [表] 或者 mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] 或者 mysqldump [OPTIONS] --all-databases [OPTIONS] 要获得更多选项,请使用mysqldump --help。肯定是已经在进行操作了,我只是将您的代码填充到相应空格中并将其返回,尽管还不能创建文件,但它已经进入了正确的方向。请问有哪些选项可以使其正常工作或者我可以在哪里学习这些选项?谢谢。 - user57129

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接