Voici les informations que j'ai:
Je travaille avec un système Linux utilisant MySQL et PHP5. Je dois pouvoir générer un mysqldump
à partir d'un fichier .php, puis faire en sorte que ce cliché soit stocké dans un fichier sur le serveur, à un emplacement que je spécifierais.
En tant que PHP nooblet, j'aimerais que quelqu'un me donne de l'aide, des conseils ou du code, qui ferait ce dont j'ai besoin. Cela devrait être exécuté à distance à partir d'Internet.
Vous pouvez utiliser la fonction exec()
pour exécuter une commande externe.
Remarque: entre Shell_exec()
et exec()
, je choisirais le second, qui ne renvoie pas la sortie au script PHP - inutile d'utiliser le script PHP pour obtenir l'intégralité du code SQL. dump en tant que chaîne: vous avez seulement besoin de l'écrire dans un fichier, et cela peut être fait par la commande elle-même.
Cette commande externe:
mysqldump
, avec les bons paramètres,Par exemple :
mysqldump --user=... --password=... --Host=... DB_NAME > /path/to/output/file.sql
Ce qui signifie que votre code PHP devrait ressembler à ceci:
exec('mysqldump --user=... --password=... --Host=... DB_NAME > /path/to/output/file.sql');
Bien sûr, c'est à vous d'utiliser les bonnes informations de connexion, en remplaçant le ...
par celles-ci.
Si vous souhaitez créer une sauvegarde pour la télécharger via le navigateur, vous pouvez également le faire sans utiliser de fichier.
La fonction php passthru () redirigera directement la sortie de mysqldump vers le navigateur. Dans cet exemple, il sera également compressé.
Pro: Vous n'avez pas à traiter avec des fichiers temporaires.
Con: Ne fonctionnera pas sur Windows. Peut avoir des limites avec d'énormes jeux de données.
<?php
$DBUSER="user";
$DBPASSWD="password";
$DATABASE="user_db";
$filename = "backup-" . date("d-m-Y") . ".sql.gz";
$mime = "application/x-gzip";
header( "Content-Type: " . $mime );
header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
$cmd = "mysqldump -u $DBUSER --password=$DBPASSWD $DATABASE | gzip --best";
passthru( $cmd );
exit(0);
?>
Jetez un coup d'œil ici: https://github.com/ifsnop/mysqldump-php ! C'est une solution native écrite en php.
Vous pouvez l'installer en utilisant composer, et c'est aussi simple que faire:
<?php
use Ifsnop\Mysqldump as IMysqldump;
try {
$dump = new IMysqldump\Mysqldump('database', 'username', 'password');
$dump->start('storage/work/dump.sql');
} catch (\Exception $e) {
echo 'mysqldump-php error: ' . $e->getMessage();
}
?>
Il supporte les utilisateurs avancés, avec de nombreuses options copiées à partir du mysqldump original.
Toutes les options sont expliquées sur la page github, mais plus ou moins sont auto-explicatives:
$dumpSettingsDefault = array(
'include-tables' => array(),
'exclude-tables' => array(),
'compress' => 'None',
'no-data' => false,
'add-drop-database' => false,
'add-drop-table' => false,
'single-transaction' => true,
'lock-tables' => false,
'add-locks' => true,
'extended-insert' => true,
'disable-foreign-keys-check' => false,
'where' => '',
'no-create-info' => false
);
Merci de vous référer au lien suivant qui contient un scriptlet qui vous aidera: http://davidwalsh.name/backup-mysql-database-php
Remarque: Ce script peut contenir des bogues avec des types de données NULL
Pour des raisons de sécurité, il est recommandé de spécifier le mot de passe dans un fichier de configuration et non dans la commande (un utilisateur peut exécuter un ps aux | grep mysqldump
et voir le mot de passe).
//create a temporary file
$file = tempnam(sys_get_temp_dir(), 'mysqldump');
//store the configuration options
file_put_contents($file, "[mysqldump]
user={$user}
password=\"{$password}\"");
//execute the command and output the result
passthru("mysqldump --defaults-file=$file {$dbname}");
//delete the temporary file
unlink($file);
Ici vous pouvez trouver une solution complète pour vider la structure et les données de mysql comme dans PMA (et sans utiliser exec, passthru, etc.):
https://github.com/antarasi/MySQL-Dump-with-Foreign-keys
Il est fork du projet dszymczuk avec mes améliorations.
L'utilisation est simple
<?php
//MySQL connection parameters
$dbhost = 'localhost';
$dbuser = 'dbuser';
$dbpsw = 'pass';
$dbname = 'dbname';
//Connects to mysql server
$connessione = @mysql_connect($dbhost,$dbuser,$dbpsw);
//Set encoding
mysql_query("SET CHARSET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");
//Includes class
require_once('FKMySQLDump.php');
//Creates a new instance of FKMySQLDump: it exports without compress and base-16 file
$dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false);
$params = array(
//'skip_structure' => TRUE,
//'skip_data' => TRUE,
);
//Make dump
$dumper->doFKDump($params);
?>
fonctionne comme un charme :-)
Tant que vous êtes autorisé à utiliser exec () , vous pouvez exécuter des commandes Shell via votre code PHP.
Donc, en supposant que vous sachiez écrire mysqldump en ligne de commande, c.-à-d.
mysqldump -u [username] -p [database] > [database].sql
alors vous pouvez l'utiliser comme paramètre pour la fonction exec ().
exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
La réponse de MajorLeo m'indique dans la bonne direction mais cela n'a pas fonctionné pour moi. J'ai trouvé ce site qui suit la même approche et a fonctionné.
$dir = "path/to/file/";
$filename = "backup" . date("YmdHis") . ".sql.gz";
$db_Host = "Host";
$db_username = "username";
$db_password = "password";
$db_database = "database";
$cmd = "mysqldump -h {$db_Host} -u {$db_username} --password={$db_password} {$db_database} | gzip > {$dir}{$filename}";
exec($cmd);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
passthru("cat {$dir}{$filename}");
J'espère que ça aide quelqu'un d'autre!
Aucun des codes ci-dessus n'a fonctionné pour moi. J'utilise des fenêtres. Le code ci-dessous a fonctionné pour moi ...
$sql = "SELECT * FROM $tableName WHERE yourclause";
$result = $conn->query($sql);
if($result){
if ($result->num_rows > 0) {
$myfile = fopen("daily_events_$district.sql", "w") or die("Unable to open file!");
while($row = $result->fetch_assoc()) {
$rowToString = implode("','",$row);
$writeToFile = "INSERT INTO $tableName VALUES('$rowToString');". PHP_EOL;
fwrite($myfile,$writeToFile);
}
echo "File saved successfully";
}
} else {
echo "No result found";
}
Cela enregistre le fichier dans votre dossier de projet en fonction de votre requête, quelles que soient les données que vous souhaitez. Si vous souhaitez vider une base de données ou une table entière, vous pouvez utiliser ce lien http://www.php-mysql-tutorial.com/wikis/mysql-tutorials/using-php-to-backup-mysql-databases .aspx
Pour vider la base de données à l'aide de Shell_exec (), voici la méthode:
Shell_exec('mysqldump -h localhost -u username -ppassword databasename | gzip > dbname.sql.gz');
global $wpdb;
$export_posts = $wpdb->prefix . 'export_posts';
$backupFile = $_GET['targetDir'].'export-gallery.sql';
$dbhost=DB_Host;
$dbuser=DB_USER;
$dbpass=DB_PASSWORD;
$db=DB_NAME;
$path_to_mysqldump = "D:\xampp_5.6\mysql\bin";
$query= "D:\\xampp_5.6\mysql\bin\mysqldump.exe -u$dbuser -p$dbpass $db $export_posts> $backupFile";
exec($query);
echo $query;
Eh bien, vous pouvez toujours utiliser l'appel de fonction système de PHP.
http://php.net/manual/en/function.system.php
http://www.php.net/manual/en/function.exec.php
Cela exécute n'importe quel programme en ligne de commande depuis PHP.
<?php exec('mysqldump --all-databases > /your/path/to/test.sql'); ?>
Vous pouvez étendre la commande avec toutes les options que mysqldump prend bien sûr. Utilisez man mysqldump
pour plus d'options (mais je suppose que vous le saviez;))
Voici une autre option native basée sur PHP: https://github.com/2createStudio/shuttle-export