当mysqldump无法创建文件时,shell_exec()没有返回错误

时间:2013-02-14 10:45:18

标签: php mysqldump shell-exec

我想在使用php脚本播放其表之前备份完整的数据库,所以我考虑使用mysqldump。

我尝试使用shell_exec()运行mysqldump命令并检查它是否成功如下:

$command = 'mysqldump -u username -ppassword database > /path/database.sql';
$result = shell_exec($command);

if(!is_null($result)) {
  echo 'Error during backup';
else {
  echo 'Database saved';
  // rest of the php script to modify the database (create/drop tables etc)
}

但是我注意到$ result是空的,即使我给出了一个无法写入文件的路径(没有现有的目录,或者应该在shell提示符下返回权限的东西)。

我错过了什么?

3 个答案:

答案 0 :(得分:4)

这对我有用:

$command = 'mysqldump -u username -ppassword database > /path/database.sql';
system($command, $output);

if($output != 0) {
  echo 'Error during backup';
else {
  echo 'Database saved';
  // rest of the php script to modify the database (create/drop tables etc)
}

答案 1 :(得分:1)

来自the manual

  

返回值
执行命令的输出,如果发生错误,则为NULL

但是,您将脚本的输出重定向到文件:

mysqldump -u username -ppassword database > /path/database.sql
                                          ^^^^^^^^^^^^^^^^^^^^

有可能(我真的不知道)mysqldump生成标准返回码(其中0表示OK,其他任何表示error)。如果是这种情况,您应该使用该机制,但需要a different PHP function

string exec ( string $command [, array &$output [, int &$return_var ]] )
                                                   ^^^^^^^^^^^^^^^^

答案 2 :(得分:1)

您应该删除-u和-p以及变量之间的所有空格 也使用" exec()"

$command = "mysqldump -u$username -p$password database > /home/yourusername/public_html/database.sql";
exec($command,$result, $output);

if($output != 0) {
  echo 'Error during backup';
}else {
  echo 'Database saved';
  // rest of the php script to modify the database (create/drop tables etc)
}