Sunteți pe pagina 1din 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

En poursuivant votre navigation sur ce site, vous acceptez lutilisation de Cookies utiliss pour les publicits et pour
les statistiques de visites, en savoir plus OK

Fobec.com

Apps

Source

Accueil> php5 > db > Exporter une base de donnee MySql avec Pdo

Membre

Forum

Chercher

News

Delphi

JAVA

PHP

Tuto

Logiciel

Nespresso Official Site


Discover The Secrets Of Nespresso Treat Yourself To Luxury Coffee.

Publi le 26/06/2014

Auteur Fobec

Rseaux sociaux

2 partages

0 tweets

2 plus

0 commentaires

Exporter une base de donnee MySql avec Pdo


Les bases de donnes constituent le coeur des sites internet, l'article prsente des mthodes pour exporter le contenu
notamment l'aide de PHP et l'extension Pdo. Lorsque l'on souhaite changer de serveur ou encore pour faire une
sauvegarde de ses donnes, on a le choix entre plusieurs mthodes de sauvegarde et de restauration du contenu. Les
principaux moteurs de base de donnes, y compris MySql, utilisent le format d'change .sql, fichier contenant
l'ensemble des instructions pour recre la structure des bases et importer les donnes.

COMMENT EXPORTER UNE TABLE MYSQL


Du point de vue technique, le dump de la table est un fichier texte contenant l'instruction Sql servant crer la
structure de la table puis une succession d'INSERT pour ajouter les donnes.
Outils en ligne de commande
MySql: exporter directement avec le moteur Mysql
mysql --host host --user user --password pass nom_base_de_donnees > fichier_dump.sql

Mysqldump: paquet installer en plus de MySql


#installer le paquet sous Linux
sudo apt-get install mysqldump
#Dumper la table
mysqldump -u root -p nom_base_de_donnees> fichier_dump.sql

Outils avec interface Graphique


phpMyAdmin: outil d'administration de MySql
Dans l'onglet 'Exporter', slectionner une ou plusieurs tables puis lancer l'export.

EXPORTER UNE BASE DE DONNE AVEC PHP


http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Page 1 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

Etant sur un serveur mutualis, les outils en ligne de commande ne sont pas accessibles. Le script PHP permet de
raliser soi-mme les oprations de dump avec possibilits d'automatiser le process de sauvegarde.
La class MySqlDump exporte une ou plusieurs tables au format sql et compresse les fichiers directement dans une
archive zip.
<?php
/**
* MySqlDump Exporter une base de donnee MySql avec Pdo
*
* @author Fobec 06/14
* @see http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html
*/
class MySqlDump {
private $DB_CONF =
array('host' => '', 'name' => '', 'user' => '',
'password' => '', 'filter' => '*'
);
private $compressToZip = false;
private $colInfo = array();
private $MAX_SQLFILE_SIZE = 1000; //in Mo
public function asZipArchive($host, $dbname, $user, $password, $filter = '*') {
$this->DB_CONF = array('host' => $host,
'name' => $dbname,
'user' => $user,
'password' => $password,
'filter' => $filter);
$this->compressToZip = true;
$fziparchive = tempnam(sys_get_temp_dir(), $this->DB_CONF['name']);
$files_dumpsql = $this->backupDB($this->DB_CONF, $fziparchive);
if ($this->isZipValid($fziparchive, $files_dumpsql) == FALSE) {
echo "ZipArchive seems to be corrupt";
} else {
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: " . filesize($fziparchive));
header('Content-Disposition: attachment; filename="' . $this->DB_CONF['name'] . '.zip'
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Pragma: no-cache');
/* ob_clean();
flush(); */
readfile($fziparchive);
exit(0);
}
}
/**
* Fixer la taille maximale du fichier d'export Sql
* @param type $maxsize taille en Mo
*/
public function setMaxFileSize($maxsize) {
$this->MAX_SQLFILE_SIZE = $maxsize;
}
/**
* Lancer l'export d'une base de donne
* @param type $db_conf
* @param type $fziparchive
* @return type
http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Page 2 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

* @return type
*/
private function backupDB($db_conf, $fziparchive = '') {
set_time_limit(60);
$file_dumptable = array();

try {
$pdo = new PDO('mysql:host=' . $db_conf['host'] . ';dbname=' . $db_conf['name'], $db_con
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//List table from DBname
$stmt = $pdo->prepare('SHOW TABLES');
$stmt->execute();
/** Table filter * */
$filter_table = explode(';', $db_conf['filter']);
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
if (in_array($row[0], $filter_table) || $db_conf['filter'] == '*') {
$tables[] = $row[0];
}
}
$stmt->closeCursor();
$pdo = null;
/* Dump each Table **/
foreach ($tables as $tablename) {
$ntemp = $this->backupTable($db_conf, $tablename, $fziparchive);
foreach ($ntemp as $sqlfile) {
$file_dumptable[] = $sqlfile;
}
}//end loop table
return $file_dumptable;
} catch (PDOException $err) {
$msg = __METHOD__ . ' - ' . $err->getMessage();
echo $msg;
$this->pdo = NULL;
}
}
/**
* Export Table to SQL File, files can be split
* @param type $db_conf
* @param type $tablename
* @param type $fziparchive
* @return string
*/
private function backupTable($db_conf, $tablename, $fziparchive = '') {
$pdo = new PDO('mysql:host=' . $db_conf['host'] . ';dbname=' . $db_conf['name'], $db_conf
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Avoid General error: 2008 MySQL client ran out of memory
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sql_files = array();
//Open new SQL File
$tmpfile = tempnam(sys_get_temp_dir(), $tablename);
$filelabel = $tablename . '.sql';
$sql_files[] = array('file' => $tmpfile, 'name' => $filelabel);
$fhandle = fopen($tmpfile, 'w');
//Create Table SQL
$stmt = $pdo->prepare('SHOW CREATE TABLE ' . $tablename);
$stmt->execute();
$rs = $stmt->fetch(PDO::FETCH_NUM);
$buf = '-- MySqlDump v.09 ' . "n";
$buf.='-- http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html' .
$buf.='-- server: ' . $db_conf['host'] . "n";
$buf.='-- date: ' . date('d/m/Y H:i:s') . "n";
http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Page 3 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

$buf.='-- date: ' . date('d/m/Y H:i:s') . "n";


$buf.='-- db: ' . $db_conf['name'] . "nn";
$buf.='-- create table: ' . $tablename . "nn";
$buf.= $rs[1] . ';' . "nn";
fwrite($fhandle, $buf);
$stmt->closeCursor();
//colmuns type
$stmt = $pdo->prepare('SHOW COLUMNS FROM ' . $tablename);
$stmt->execute();
$this->colInfo = $stmt->fetchAll(PDO::FETCH_NUM);
$col_mapping = $this->parseColInfo($this->colInfo);
$stmt->closeCursor();
//Select All
$stmt = $pdo->prepare('SELECT * FROM ' . $tablename);
$stmt->execute();
$line = '';
$buf = '';
$filecount = 2;
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
$buf = "INSERT INTO " . $tablename . " VALUES (";
$len = count($row);
//Buffer value add slash if dif. than int
for ($i = 0; $i < $len; $i++) {
if ($i != ($len - 1)) {
$buf.=$this->setValue($row[$i], $col_mapping[$i]) . ',';
} else {
$buf.=$this->setValue($row[$i], $col_mapping[$i]);
}
}
$buf = $this->removeLineBreak($buf);
$line.=$buf . ");n";
$buf = '';
//Write SQL commands to file
fwrite($fhandle, $line);
//Start new file if max size reach
if (ftell($fhandle) > (1024 * 1024 * $this->MAX_SQLFILE_SIZE)) {
fclose($fhandle);
$this->addTozipFile($fziparchive, $tmpfile, $filelabel);
$sql_files[] = array('file' => $tmpfile, 'name' => $filelabel);
$tmpfile = tempnam(sys_get_temp_dir(), $tablename . '_' . $filecount);
$filelabel = $tablename . '_' . $filecount . '.sql';
$filecount++;
$fhandle = fopen($tmpfile, 'w');
}
$line = '';
}
fclose($fhandle);
$this->addTozipFile($fziparchive, $tmpfile, $filelabel);
$stmt->closeCursor();
$pdo = null;
return $sql_files;
}
/**
* Compress Sql File in ZipArchive
* @param type $fzip
http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Page 4 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

* @param type $fzip


* @param type $file_path
* @param type $file_name
*/
private function addTozipFile($fzip, $file_path, $file_name) {
if ($this->compressToZip == true) {
$zip = new ZipArchive();
$zip->open($fzip, ZIPARCHIVE::CREATE);
$zip->addFile($file_path, $file_name);
$zip->close();
}
}
/**
* Check if all sql files have been added
* @param type $zipfile
* @param type $files_sql
* @return boolean
*/
private function isZipValid($zipfile, $files_sql) {
$zip = new ZipArchive;
$res = $zip->open($zipfile);
if ($res === TRUE) {
foreach ($files_sql as $zfile) {
$n = $zip->statName($zfile['name']);
if ($n == FALSE || $n['size'] < 10) {
$zip->close();
return FALSE;
}
}
$zip->close();
} else {
return FALSE;
}
return TRUE;
}
/**
* Add Slashes if Value is String
* @param type $val
* @param type $isInt
* @return string
*/
private function setValue($val, $isInt) {
if ($isInt) {
return $val;
} else {
if (!empty($val)) {
$sval = addslashes($val);
return "'" . $sval . "'";
} else {
return "''";
}
}
}
/**
* Remove Line break
* @param type $line
* @return type
*/
private function removeLineBreak($line) {
$nsearch = array("rn", "n", "r");
$nreplace = array('rn', 'n', 'r');
$sline = str_replace($nsearch, $nreplace, $line);
http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Page 5 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

$sline = str_replace($nsearch, $nreplace, $line);


return $sline;
}
/**
* Build Field array with field type
* @param type $rs
* @return boolean
*/
private function parseColInfo($rs) {
$len = count($rs);
$map = array();
for ($i = 0; $i < $len; $i++) {
if (substr($rs[$i][1], 0, 3) == 'int' || $rs[$i][1] == 'float') { //'Type'
$map[] = true;
} else {
$map[] = false;
}
}
return $map;
}
}
?>

COMMENT FAIRE UN DUMP D'UNE TABLE


La class MySqlDump se pilote rapidement dans un script php, il suffit d'autoriser la connexion au serveur Mysql, tout
reste des oprations de dump est automatique.
<?php
require $_SERVER['DOCUMENT_ROOT'] . '/' . 'MySqlDump.php';
$mySqlDump = new MySqlDump();
$mySqlDump->setMaxFileSize(2);
$mySqlDump->asZipArchive("adresse_serveur", "base_de_donnee", "user", "password", 'table1;table2'
?>

filtre: par dfaut le caractre * indique que toutes les tables sont exporter. La dfinition d'une slection de table est
possible en sparant le nom des tables avec ;
setMaxFileSize: la taille des fichiers d'export peut tre limite par exemple 2 Mo pour faciliter l'import via
phpMyAdmin. Attention, lors de l'import toujours commence par le 1er fichier car il contient la structure de la table
export: les donnes sont retournes au format zip directement dans le navigateur internet. La class peut tre modifie
pour enregistrer les donnes dans un rpertoire donne ou envoy par email.
Sur un hbergement mutualis de type 1and1, une erreur 500 peut survenir lors de l?excution du script de dump. En
cherchant la raison, il semble que l?hbergeur limite la dure d?excution du script dans les pack mutualiss, donc a
se sert rien d'augmenter le timeout avec set_time_limit() par exemple.
Il serait intressant d'implmenter une fonction resume ou d'export partielle la class. Justement pour contourner la
limitation des timeout lors des export de tables, la sauvegarde pourrait tre reprise l'ancienne position.

Ajouter un commentaire
Pseudo *

Votre pseudo

Adresse email *

http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Votre adresse email

Page 6 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

Site internet

09/12/2015 15:03

http://

Votre commentaire

Les champs marqus d'un * sont obligatoires, les adresses emails se sont pas publies.

Publier le commentaire

A LIRE AUSSI
Afficher l'avertissement sur l'utilisation des cookies

Espace membre
Se connecter
Mot de passe oubli

Rseaux sociaux

Prsentation de l'article
Catgorie

php5 - db

Mise a jour

26/06/2014

Visualisation

vu 3708 fois

Public

Internaute

Auteur de la publication
http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Page 7 sur 8

(PHP) Exporter une base de donnee MySql avec Pdo

09/12/2015 15:03

Fobec
Admin
Auteur de 255 articles

Contacter Fobec
Visiter le blog de Fobec

Du meme auteur
Afficher l'avertissement sur l'utilisation des
cookies
Supprimer les accents d'une chaine de caracteres
Modifier les droits des fichiers
Liste commande recherche Google
Historique des versions de Windows

Commentaires rcents
Publi par IB dans tuto
Merci ca marche bien.
Publi par Franzi dans java
Bonjour,
Le code est simple et compile, aprs tre entr dans public
void connect, il n'effectue pas this.session.get.transport et
s'arrte. Sous eclipse avec Tomcat, j'ob...
Publi par Fobec dans CMS
//une variante avec UrlMon
uses
UrlMon;
function GetPageContent(URL: string): string;
var
MyFile: file;
Buf: array[0..14] of Char;
Filename: string;
Publi par Bonjour dans java
Joli travail!
Par contre, savez vous que votre barre de progression
s'arrte un certain pourcentage?
Publi par RIJAPOTAK dans CMS
PILOTAGE SCANNER (TWAIN-WIA), IPTC, EXIF,
METADATA, ICC PROFILES,
D&Atilde;&copy;veloppement des logiciels, Traitement
d'image, Traitement en Batch d'image et Pdf

Suivez-nous

Copyright 2000-2015 www.fobec.com

Le site
Facebook

Twitter

Google +

0.073 sec - che - tpl v2.0


Flux RSS

http://www.fobec.com/php5/1148/exporter-une-base-donnee-mysql-avec-pdo.html

Plan du site

Contact

Page 8 sur 8

S-ar putea să vă placă și