3

I wasn't sure if this was a SO or SF question but I thought this might be the best place. I apologise if it is not!

I am using mysqldump through PHP exec but it doesn't seem to be working. The code I am using is

<?php
exec('mysqldump -u DB_USER -pDB_PASS DB_NAME > /tmp/test.sql');
?>

When I run this script I recieve no errors on error_log, but I do not get a dump in /tmp. I am not sure what is causing this. I am not sure if it is trying to dump to /tmp relative to where the PHP file is being executed, which is the result I am looking for, or is dumping to a /tmp elsewhere? Or am I making another mistake completely?

Syn
  • 141
  • 1
  • 3
  • Try to use the absolute path to `mysqldump` command in the script. You can find it by running `whereis mysqldump`. Also make sure username/password is correct. – Diamond Feb 16 '16 at 10:01
  • I've found the issue! It is dumping to the /tmp in the root of my server, and not where the php script is situated! – Syn Feb 16 '16 at 10:04

2 Answers2

12

The solution I found is to run the command in a sub-shell and then output the stderr to stdout. This way, the $output is well populated.

i.e. :

exec("(mysqldump -u$username -p$password $database $tables > $dump_name) 2>&1", $output, $result);

var_dump($result);
echo "<br />";
var_dump($output);
echo "<br />";

The output :

int(6)

array(1) { [0]=> string(46) "mysqldump: Couldn't find table: "table_name"" }

Hope it helps !

JazZ
  • 221
  • 2
  • 4
1

The path you have declared (/tmp/test.sql) is an absolute path so the script is behaving correctly. As for linux file system / defines the root directory and there always exists a /tmp directory. May be you should take a little time to understand General overview of the Linux file system.

The tree of the file system starts at the trunk or slash, indicated by a forward slash (/). This directory, containing all underlying directories and files, is also called the root directory or "the root" of the file system.

As for dumping the file to a relative directory, you can try to use ./tmp/test.sql or tmp/test.sql, if the tmp directory resides at the current directory from where the script is run.

You may have a look at this too: https://stackoverflow.com/questions/17407664/php-include-relative-path

Diamond
  • 8,791
  • 3
  • 22
  • 37