2010-05-17 2 views
2

Я пишу код с PHP для резервного копирования базы данных.mysqldump не работает правильно

Вот мой код:

exec("mysqldump --opt -h localhost -u root test > mydb.sql"); 

Но я получаю 0-байт в моем файле (mydb.sql). Я также запускаю с passthru(), system(), но он все равно получает 0-байт.

Я стараюсь использовать команду. Оно работает.

Я использую последний XAMPP для своего локального хоста.

Итак, как я могу сделать, чтобы он работал правильно?

ответ

9

Вероятно, это проблема с разрешениями или факт, что вы не передаете пароль. Чтобы увидеть ошибки, маршрут STDERR в STDOUT с помощью 2>&1

exec("mysqldump --opt -h localhost -u root test > mydb.sql 2>&1", $output); 
print_r($output); 

Это покажет вам ошибки, вы обычно видите в командной строке.

+0

Моя проблема аналогична проблеме OP, но в моем случае нет выходного файла (даже не пустого) при работе через PHP. Скрипт на моем локальном сервере завершается мгновенно, поэтому он не похож на проблему с таймаутом. 'print_r ($ output);' дает пустой массив - 'Array()'. Моя команда: '$ command ="/opt/lampp/bin/mysqldump -u ". $ _ POST ['db_user']." ". $ _ POST ['db_name']."> /root/Desktop/downloaded.sql 2 > &1"; 'и та же самая команда дает правильный результат в командной строке (файл размером 1,7 МБ). PHP не работает в безопасном режиме,' exec() 'не отключен, и я не знаю. Любая идея? Спасибо –

+0

О, я исправил Это сообщение о разрешении. Выходное местоположение должно быть внутри '/ opt/lampp/htdocs'. Но должно быть некоторое отображение ошибок. –

+0

спасибо, что мне нужно –

2

Скорее всего, mysqldump не находится в пути PHP/Apache. Это заставит оболочку выплеснуть ошибку «команда не найдена» на STDERR и не будет выводиться на STDOUT (который вы перенаправляете на файл и заканчиваете 0 длиной).

Попробуйте добавить полный путь к mysqldump (c:\mysql\bin\mysqldump или что-то еще) и повторите попытку.

1

вы должны передать пароль без пробела после опции -p и то же самое для пользователя идет непосредственно после -u

Exec ("туздЫшпр --opt -h локальный -uUSER -pPASSWORD DBNAME> MyDB .sql ");

я пыльников проблема на виртуальном хостинге оказалось я должен использовать хост-имя пользователя и пароль, но не имя пользователя и пароль

0

базы данных попробуйте это!

$username = "root"; 
$password = ""; 
$hostname = "localhost"; 
$dbname = "test"; 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($dbname . "_" .date("Y-m-d_H-i-s").".sql")); 

$command = "C:\AppServ\MySQL\bin\mysqldump --add-drop-table --host=$hostname -- user=$username --password=$password ".$dbname; 

system($command); 
+0

, почему вы ответили два раза? – Nano

+0

- это потому, что Я не смог отправить, а затем отправил дважды и все еще не смог удалить! –

+0

Какая часть этого должна решить проблему? –

0

команды, такие как Exec() и системы() не работают на всех серверах, только для локальных серверов и выделенных серверов, если вы размещаете сервер должен будет ли ваш план хостинга позволяет получить доступ к Exec (команда) и system(), если вы не позволите нанять другой план.

+0

Это вряд ли будет объяснение. Тот факт, что выходной файл создается (хотя и пустой), означает, что 'exec' запускает команду. –

Смежные вопросы