2010-05-05 19 views
0

je code commeBesoin requête d'exportation plutôt que la création du fichier pour mysqldump sans déclencheurs

$db_name = "db"; 
$outputfile = "/somewhere"; 
$new_db_name = 'newdb'; 

$cmd = 'mysqldump --skip-triggers %s > %s 2>&1'; 
$cmd = sprintf($cmd, escapeshellarg($db_name), escapeshellcmd($output_file)); 
exec($cmd, $output, $ret); 
if ($ret !=0) { 
    //log error message in $output 
} 

ensuite à l'importation:

$cmd = 'mysql --database=%s < %s 2>&1'; 
$cmd = sprintf($cmd, escapeshellarg($new_db_name), escapeshellcmd($output_file)); 
exec($cmd, $output, $ret); 
//etc. 

unlink($outputfile); 

Mais ici que dois-je faire pour obtenir la requête d'exportation, plutôt que créer un fichier à chaque fois?

ÉDITÉ:

DANS LA RÉPONSE DE LA DEFENSE DE MATT

  • J'utilise Windows, sera le code u ont donné le travail que je ne suis pas sûr du code je l'ai déjà aura travailler dans Windows comme il semble être des commandes Linux?
  • Mon besoin de script en PHP est le processus qui va être déclenché lors de l'installation d'un composant dans joomla
  • Qu'est-ce que PIPE en PHP?

Répondre

1

Avez-vous besoin de faire cela en PHP? Vous pouvez facilement le faire dans un terminal avec une tuyauterie de base (pas besoin de créer de fichiers).

Deux commandes et vous avez terminé:

echo 'create database foo2' | mysql -uroot 
mysqldump --skip-triggers -uroot foo | mysql -uroot foo2 

Cette copie foo nouvelle base de données dans foo2

Notez qu'il est possible pipe in php .. mais .. vraiment, vous devriez juste faire ceci dans la coquille (IMO).

Edit:

Oops, pour une raison quelconque, je pensais que tu voulais déclencheurs. Edité ci-dessus pour inclure --skip-triggers

Edit 2:

'Tuyaux' fait référence à l'acheminement stdout et stdin.

Windows prend en charge les tuyaux. Les commandes ci-dessus fonctionnent pour moi sur Windows.

Cependant, je ne suis pas en mesure d'obtenir des tuyauteries pour travailler via PHP avec Windows (du moins pas pour mysql). C'est comme si les flux de proc_open ignoraient mon entrée.

Ainsi, l'alternative serait de prendre les commandes que je fournis ci-dessus, les mettre dans un fichier .bat, et voyez si vous pouvez appeler ce script via system()

modifier finale:

Vous êtes Je vais devoir faire des recherches car je ne peux pas expliquer tous les petits détails.Avez-vous fait référence à la documentation system() que j'ai désignée? Il vous permet d'appeler des commandes système ..

Ma suggestion que vous est de faire un script de base, appelez bla.bat:

@echo off 
echo create database foo2 | mysql -uroot 
mysqldump --skip-triggers -uroot foo | mysql -uroot foo2 

Si c'est dans le même dossier que votre script, votre script peut le faire:

<?php 
system('cmd.exe /C ' . dirname(__FILE__).'\\bla.bat'); 

Viola. DB copié.

+0

@Matt vérifier la question mise à jour –

+0

@Matt Pls chk la question mise à jour et aidez-moi ... –

+0

@Matt Ne vous dérange pas, mais tout semble très sophistiqué pour moi, Pouvez-vous simplifier –