PDA

View Full Version : سوال: گرفتن پشتیبان از بانک اطلاعاتی با pdo



ravand
جمعه 30 مرداد 1394, 20:35 عصر
سلام
یه برنامه ای رو قبلا اقای شهرکی داده بودن برای پشتیبانگیری از اطلاعات که با دستورات mysql نوشته شده بود. من اینو تبدل کردم به pdo <لی متاسفانه فقط دستورات sql رو پشتیبان میگیره و اطلاعاتی که داخل دیتابیس هست رو ازش پشتیبان نمیگیره:
دستورات pdo:


<?php
include('connect.php');
$tables = '*';
date_default_timezone_set('Asia/Tehran');
$sql = '';
$dbh->exec("SET CHARACTER SET utf8");
if($tables == '*') {
$tables = array();
$sth = $dbh->prepare('SHOW TABLES');
$sth->execute();
foreach($sth as $row) {
$tables[] = $row[0];
}
$sth->closeCursor();

}else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}

foreach($tables as $table) {
$sth = $dbh->prepare('SELECT * FROM `'.$table.'`');
$colcount = $sth->columnCount();
$sql .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;

$sth = $dbh->prepare('SHOW CREATE TABLE `'.$table.'`');
$sth->execute();
$row2 = $sth->fetch();
$sql .= $row2[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $colcount; $i++) {
foreach($sql as $row) {
$sql .= 'INSERT INTO `'.$table.'` VALUES(';
for($j = 0; $j < $colcount; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace('\n', '\\n', $row[$j]);
if (isset($row[$j])) {
$sql .= '\''.$row[$j].'\'';
}
else {
$sql .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$sql .= ',';
}
}
$sql .= ');'.PHP_EOL;
}
}
$sql .= PHP_EOL.PHP_EOL.PHP_EOL;
}
$timet=time();
$file = $timet.'.sql';
header('Content-Disposition: attachment; filename='.$file);
header('Content-Type: text/x-sql');
header('Content-Transfer-Encoding: utf-8');
echo $sql;
?>



دستورات mysql:


<?php
include('connect.php');

$tables = '*';
date_default_timezone_set('Asia/Tehran');

$sql = '';


mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');

if($tables == '*') {
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
mysql_free_result($result);
}
else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}

foreach($tables as $table) {
$result = mysql_query('SELECT * FROM `'.$table.'`');
$num_fields = mysql_num_fields($result);
$sql .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$sql .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$sql .= 'INSERT INTO `'.$table.'` VALUES(';
for($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace('\n', '\\n', $row[$j]);
if (isset($row[$j])) {
$sql .= '\''.$row[$j].'\'';
}
else {
$sql .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$sql .= ',';
}
}
$sql .= ');'.PHP_EOL;
}
}
$sql .= PHP_EOL.PHP_EOL.PHP_EOL;
}
$timet=time();
$file = $timet.'.sql';
header('Content-Disposition: attachment; filename='.$file);
header('Content-Type: text/x-sql');
header('Content-Transfer-Encoding: utf-8');
echo $sql;
?>

ravand
شنبه 31 مرداد 1394, 11:37 صبح
گشتم یکی پیدا کردم که ساده هم هست:
http://wiki.birth-online.de/snippets/php/dump-mysql-db

Unique
شنبه 31 مرداد 1394, 18:46 عصر
جناب راوند نمیدونم برای چی دارین از این تیکه کد استفاده میکنید اما اگه برای پشتیبانگیری غیر کاربری (یعنی توی پروژه قرار نیست کاربر خودش پشتیبان بگیره) استفاده میکنید تا از پایگاه های داده خودتون پشتیبان بگیرین بهترین ابزار mysqldump هست که در زمان نصب mysql براتون نصب میشه و مثلا برای پشتیبان گیری از یک پایگاه local اینطوری مینویسیم :


mysqldump -e -R -h 127.0.0.1 -u [username] --password=[password] [dbname] > backupfile.sql

به صورت remote هم اگه توی cpanel دسترسی بدین میشه استفاده کردو کافیه آدرس ip و user و pass سرویس دهنده را بدین.

ravand
شنبه 31 مرداد 1394, 19:04 عصر
این برای یه بنده خداییه که از برنامه نویسی چیزی سر در نمیاره. میخواد راحت با زدن دکمه پشتیبان بگیره.

ravand
یک شنبه 01 شهریور 1394, 10:48 صبح
مهندس من اینطوری استفاده کردم یه فایل خالی ایجاد میکنه:


<?php exec("mysqldump -e -R -h 127.0.0.1 -u [root] --password=[] [database] > backupfile.sql");?>

چه اشتباهی دارم میکنم؟ من تا حالا با این دستور کار نکرده بودم.

Unique
یک شنبه 01 شهریور 1394, 12:56 عصر
اگه نام کاربری test_user باشه و گذرواژه 1234 و نام پایاه داده test_db اینطوری میشه :

mysqldump -e -R -h 127.0.0.1 -u test_user --password=1234 test_db > test_db.sql

برای restore کردن هم اینطوری :

mysql -h 127.0.0.1 -u test_user --password=1234 --default-character-set=utf8 --database=test_db < test_db.sql

قبل از استفاده در دستور exec میتونی توی command prompt چک کنی.

موفق باشین

ravand
یک شنبه 01 شهریور 1394, 13:51 عصر
این چیزی که شما دادی برای لینوکس هست من برای ویندوز میخواستم که اینو امتحان کردم:

exec("F:\xampp\mysql\bin\mysqldump.exe -e -R -h 127.0.0.1 -u root --password dataabse > dataabse.sql");
نمیدونم چرا کار نکرد. چون پسورد نداشتم جلوش رو خالی گذاشتم. طبق آموزش این سایت:
http://iswwwup.com/t/3947c29ee1ca/windows-batch-file-for-mysqldump-command.html
ولی اگه اینطوری باشه زیاد جالب نیست . چون هر بار مشتری بخواد نصب کنه باید ادرس دهیش رو درست کنه اگه یه برنامه ی پشتیبان از pdo داشتید خیلی عالی میشد.

ravand
یک شنبه 01 شهریور 1394, 18:21 عصر
این نوشته اشتباه بود . و حذف شد.

Unique
سه شنبه 03 شهریور 1394, 23:38 عصر
این چیزی که شما دادی برای لینوکس هست من برای ویندوز میخواستم که اینو امتحان کردم

توی ویندوز اگه در زمان نصب mysql شاخه bin را گذاشته باشین توی path میتونید از mysql.exe و mysqldump.exe استفاده کنید و در غیر این صورت کافیه به پوشه bin توی مسیر mysql برین و دستورات را با پسوند exe اجرا کنید. نیاز نیست حتما با php انجام بشه. چون اگه دستور exec را به درستی و همراه با دسترسی های لازم توی php.ini اجرا نکنید اون دستور کار نمیکنه.

ravand
جمعه 06 شهریور 1394, 17:44 عصر
اینطوری نوشتم مشکل حل شد:


<?php system("F:\\xampp\\mysql\\bin\\mysqldump --user=username--password=password --host=localhost database> backup.sql");?>