2010-05-17 11 views
2

J'écris du code avec PHP pour sauvegarder la base de données.mysqldump ne fonctionne pas correctement

Voici mon code:

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

Mais je reçois dans mon dossier 0-octet (mydb.sql). Je cours aussi avec passthru(), system(), mais il obtient toujours 0 octet.

J'essaie d'utiliser la commande. Ça marche. J'utilise le dernier XAMPP pour mon hôte local.

Alors, comment puis-je faire pour le faire fonctionner correctement?

Répondre

9

Il s'agit probablement d'un problème d'autorisations ou du fait que vous ne transmettez pas de mot de passe. Pour voir les erreurs, itinéraire stderr STDOUT utilisant 2>&1

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

Cela vous montrera les erreurs que vous verriez normalement sur la ligne de commande.

+0

Mon problème est similaire à celui d'OP mais dans mon cas, il n'y a pas de fichier de sortie (pas même un vide) en PHP. Le script sur mon serveur local se termine instantanément, donc il ne semble pas être un problème de délai d'attente non plus. 'print_r ($ output);' donne un tableau vide - 'Array()'. Ma commande est '$ command ="/opt/lampp/bin/mysqldump -u ". $ _ POST ['utilisateur_db']." ". $ _ POST ['nom_bdd']."> /root/Desktop/downloaded.sql 2 > &1"; 'et la même commande produit un résultat correct en ligne de commande (un fichier de 1,7 Mo.) PHP ne fonctionne pas en mode sans échec,' exec() 'n'est pas désactivé et je suis désemparé.Toute idée? Merci –

+0

Oh j'ai fixé L'emplacement de sortie doit être situé dans '/ opt/lampp/htdocs', mais il devrait y avoir une erreur d'affichage –

+0

merci c'est ce dont j'ai besoin –

2

Probablement, mysqldump n'est pas dans le chemin de PHP/Apache. Cela entraînera le shell à cracher une erreur "command not found" sur STDERR, et aucune sortie sur STDOUT (que vous redirigez vers un fichier et se termine par 0 longueur).

Essayez d'ajouter le chemin d'accès complet à mysqldump (c:\mysql\bin\mysqldump ou autre) et réessayez.

1

vous devez passer le mot de passe sans espace après l'option -p et la même chose pour le nom d'utilisateur va directement après -u

exec ("mysqldump --opt -h localhost -uUser -Pmot_de_passe DBNAME> mydb .sql ");

i anthères problème sur un hôte partagé, il est avéré que je dois utiliser le nom d'utilisateur hôte et mot de passe le nom d'utilisateur de base de données et le mot de passe

0

essayer!

$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

pourquoi avez-vous répondu deux fois? – Nano

+0

est parce que Je n'étais pas en mesure d'envoyer, puis fini par envoyer deux fois et ne pouvait toujours pas supprimer! –

+0

Quelle partie de ce qui est censé résoudre le problème? –

0

commandes telles que exec() et system() ne fonctionnent pas sur tous les serveurs, seuls les serveurs locaux et les serveurs dédiés, si vous hébergez un serveur devra voir si votre plan d'hébergement permet d'accéder à exec (commande) et le système() si vous ne permettez pas d'embaucher un autre régime.

+0

l'explication. Le fait que le fichier de sortie soit créé (bien que vide) signifie que exec exécute la commande. –

Questions connexes